Здесь у меня есть фрейм данных, который указывает объем различных акций за определенный период времени. (Реальный набор данных должен быть расширен до тысяч различных акций, а период времени также произволен, df здесь — просто упрощенный пример)
d-1 d-2 d-3 d-4
00001.SH 5000 4600 4893 2321
00002.SH 2134 3456 6433 2131
00003.SH 3543 3128 5423 9642
00032.RS 3234 6432 2234 3213
00006.RS 3435 3452 1231 1229
00004.LH 3213 4232 3652 1233
Я пытаюсь найти относительный индекс максимального объема каждой акции во временном ряду, чтобы я мог ранжировать найденные индексы. Для удобства ранжирования я хочу, чтобы индекс временного ряда был целым числом, например, «d-1» равно 1, «d-2» равно 2, «d-3» равно 3,...., и так далее
например, для 00001.SH я бы хотел, чтобы он возвращал 1 (d-1), и конечный результат должен быть таким
00001.SH 1
00002.SH 3
00003.SH 4
00032.RS 2
00006.RS 2
00004.LH 2
Я знаю, что это можно сделать с помощью циклов, но могу ли я спросить, есть ли более эффективный способ? Поскольку набор данных достаточно велик, запуск циклов занимает много времени. Любая помощь приветствуется, большое спасибо!
Используйте DataFrame.idxmax для столбцов по максимальным значениям, а затем извлеките цифры с помощью Series.str.extract:
s = df.idxmax(axis=1).str.extract('(\d+)', expand=False)
print (s)
00001.SH 1
00002.SH 3
00003.SH 4
00032.RS 2
00006.RS 2
00004.LH 2
dtype: object
Или вы можете сначала извлечь, а затем использовать idxmax
:
df.columns = df.columns.str.extract('(\d+)', expand=False)
#if is posible assign values by length of columns
#df.columns = range(1, len(df.columns) + 1)
print (df)
1 2 3 4
00001.SH 5000 4600 4893 2321
00002.SH 2134 3456 6433 2131
00003.SH 3543 3128 5423 9642
00032.RS 3234 6432 2234 3213
00006.RS 3435 3452 1231 1229
00004.LH 3213 4232 3652 1233
s = df.idxmax(axis=1)
print (s)
00001.SH 1
00002.SH 3
00003.SH 4
00032.RS 2
00006.RS 2
00004.LH 2
dtype: object
конечно, дай мне попробовать