панды срезают несколько окон одновременно из индекса временного ряда - PullRequest
0 голосов
/ 13 марта 2019

У меня есть скрипт, который генерирует кадры данных, содержащие «блоки» дат, и сохраняет их в переменной «cur_blocks», такой как эта:

                  year      start        end       date
gmt_reportedtime                                       
2019-03-11        2000 2000-01-09 2000-03-10 2019-03-11
2019-03-11        2001 2001-01-09 2001-03-10 2019-03-11
2019-03-11        2002 2002-01-09 2002-03-10 2019-03-11
2019-03-11        2003 2003-01-09 2003-03-10 2019-03-11
2019-03-11        2004 2004-01-09 2004-03-10 2019-03-11

У меня также есть еще один фрейм данных 'col', проиндексированный на datetime, в котором есть данные, которые я хотел бы выполнить в последующих вычислениях, таких как ранжирование и z-оценки. Я хотел бы нарезать несколько кусков col, используя блоки, обозначенные как 'start' и 'end' из cur_blocks. Блоки данных в cur_blocks - это 60-дневные окна, каждое из которых разделено на 1 год в период между 2000-2019 гг.

Вот 'col':

              X
2000-01-01   24
2000-01-02   90
2000-01-03   62
2000-01-04   10
...
2019-02-28   73
2019-03-01   96

[7000 rows x 1 columns]

Пока я решил это так:

window_aggregate = pd.DataFrame()
for index, block in cur_blocks.iterrows():
    dt_block = col.loc[block['start']:block['end']]
    window_aggregate = pd.concat([window_aggregate, dt_block])

Затем я могу использовать 'window_aggregate' для выполнения последующей работы. Это работает, однако это очень медленно, потому что 'cur_blocks' генерируется для каждой отдельной даты между 2000-01-01 и сегодняшним днем.

Я удивлен, что в пандах нет встроенной функции для такого рода вещей? Если я не пропустил это? Но другой пользователь при переполнении стека также задал похожий вопрос, на который до сих пор не ответили здесь

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

Я видел, как это решалось за один день в течение нескольких лет здесь но не с окном.

Может быть решение здесь , но я не понимаю, как применить ответ к моим данным

РЕДАКТИРОВАТЬ: показать желаемый результат примерно так, как показано ниже, с датами в кадре данных, соответствующими начальному и конечному блокам в cur_blocks

желаемый выход

              X
2000-01-09   24
2000-01-10   90
...
2000-03-10   62
2001-01-09   10
2001-01-10   10
...
2001-03-10   10
2002-01-09   10
...
...
...
2004-03-10   73

1 Ответ

0 голосов
/ 13 марта 2019

Я бы объединил оба кадра данных в год. Затем вы можете просто отфильтровать результирующие кадры данных со строками, где дата от col находится между датами start и end. После различных манипуляций с индексами, необходимых для слияния и окончательного выбора столбца, он дает:

pd.DataFrame(pd.concat([col, pd.Series(col.index.year,
                       index=col.index, name='year')],axis=1)
         .rename_axis('dat').reset_index().merge(cur_blocks, on='year')
         .query('(start <= dat) & (dat <= end)').set_index('dat')
         .rename_axis('')['X'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...