Вставка элементов из мультииндексированного фрейма данных в обычный фрейм в зависимости от времени - PullRequest
0 голосов
/ 23 мая 2018

У меня есть этот обычный фрейм данных, проиндексированный 'Date', называемый ES:

     Price  Day Hour    num_obs med abs_med Ret
Date                            
2006-01-03 08:30:00 1260.583333 1   8   199 1260.416667 0.166667    0.000364
2006-01-03 08:35:00 1261.291667 1   8   199 1260.697917 0.593750    0.000562
2006-01-03 08:40:00 1261.125000 1   8   199 1260.843750 0.281250    -0.000132
2006-01-03 08:45:00 1260.958333 1   8   199 1260.895833 0.062500    -0.000132
2006-01-03 08:50:00 1261.214286 1   8   199 1260.937500 0.276786    0.000203

У меня есть этот другой фрейм данных, проиндексированный следующим MultiIndex.Первый индекс идет от 0 до 23, а второй - от 0 до 55. Другими словами, у нас есть ежедневные 5-минутные данные приращения.

        5min_Ret
0   0   2.235875e-06
    5   9.814064e-07
    10  -1.453213e-06
    15  4.295757e-06
    20  5.884896e-07
    25  -1.340122e-06
    30  9.470660e-06
    35  1.178204e-06
    40  -1.111621e-05
    45  1.159005e-05
    50  6.148861e-06
    55  1.070586e-05
1   0   1.485287e-05
    5   3.018576e-06
    10  -1.513273e-05
    15  -1.105312e-05
    20  3.600874e-06
    ...

Я хочу создать столбец в исходном фрейме данных ES, который будет иметь соответствующий '5min_Ret' в каждом соответствующем комбо час / 5 минут.

Я пробовал несколько вещей: циклический переход по строкам, нахождение некоторой функции применения.Но пока ничего не получалось.Я чувствую, что я пропускаю простое и Pythonic решение здесь.

Ожидаемый вывод создает новый столбец с именем '5min_ret' для исходного кадра данных, в котором каждая строка соответствует правильной паре час / 5 минут из меньшего кадра данных, содержащего 5min_ret

     Price  Day Hour    num_obs med abs_med Ret 5min_ret
Date                            
2006-01-03 08:30:00 1260.583333 1   8   199 1260.416667 0.166667    0.000364  xxxx
2006-01-03 08:35:00 1261.291667 1   8   199 1260.697917 0.593750    0.000562 xxxx
2006-01-03 08:40:00 1261.125000 1   8   199 1260.843750 0.281250    -0.000132 xxxx
2006-01-03 08:45:00 1260.958333 1   8   199 1260.895833 0.062500    -0.000132 xxxx
2006-01-03 08:50:00 1261.214286 1   8   199 1260.937500 0.276786    0.000203 xxxx

1 Ответ

0 голосов
/ 24 мая 2018

Я думаю, что одним из способов является использование merge в часах и минутах.Сначала создайте столбец 'min' в ES из индекса datetime, например:

ES['min'] = ES.index.minute

Теперь вы можете merge с вашим многоиндексным DF, содержащим столбец "5min_Ret", который я назвал df_multi, например::

ES = ES.merge(df_multi.reset_index(), left_on = ['hour','min'], 
                 right_on = ['level_0','level_1'], how='left')

Здесь вы объединяете 'час' и 'мин' с ES с 'level_0' и 'level_1', которые создаются из вашего мультииндекса df_multi, когда вы делаете reset_indexи по значению левого df (ES)

Вы должны получить новый столбец в ES с именем '5min_Ret' со значением, которое вы ищете.Вы можете сбросить «мин», если вам это больше не нужно, ES = ES.drop('min',axis=1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...