Как задержать данные по x определенным дням на мультииндексном панде? - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть фрейм данных, который содержит даты, активы, а затем данные о цене / объеме.Я пытаюсь получить данные за 7 дней назад, но проблема в том, что я не могу использовать shift (), потому что в моей таблице отсутствуют даты.

 date   cusip   price   price_7daysago
1/1/2017    a   1   
1/1/2017    b   2   
1/2/2017    a   1.2 
1/2/2017    b   2.3 
1/8/2017    a   1.1         1
1/8/2017    b   2.2         2

Я пытался создать лямбда-функцию, чтобы попытаться использовать loc и timedelta для создания этого сдвига, но мне удалось вывести только пустые пустые массивы:

def row_delta(x, df, days, colname):
    if datetime.strptime(x['recorddate'], '%Y%m%d') - timedelta(days) in [datetime.strptime(x,'%Y%m%d') for x in   df['recorddate'].unique().tolist()]:
        return df.loc[(df['recorddate_date'] == df['recorddate_date'] - timedelta(days)) & (df['cusip'] == x['cusip']) ,colname]
    else:
        return 'nothing'

IЯ также подумал о том, чтобы сделать что-то похожее на this , чтобы заполнить пропущенные даты, но моя проблема в том, что у меня есть несколько индексов, дат и фрагментов, поэтому я не могу просто переиндексировать это.

Я не совсем уверен, что еще я могу сделать, но любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

вы можете установить date и cusip в качестве индекса и использовать unstack и shift вместе

shifted = df.set_index(["date", "cusip"]).unstack().shift(7).stack()

, а затем просто объединить shifted с вашим исходным df

0 голосов
/ 21 сентября 2018

merge DataFrame с самим собой при добавлении 7 дней в столбец даты для правого фрейма.Используйте аргумент suffixes для правильного именования столбцов.

import pandas as pd

df['date'] = pd.to_datetime(df.date)
df.merge(df.assign(date = df.date+pd.Timedelta(days=7)), 
         on=['date', 'cusip'],
         how='left', suffixes=['', '_7daysago'])

Вывод: df

        date cusip  price  price_7daysago
0 2017-01-01     a    1.0             NaN
1 2017-01-01     b    2.0             NaN
2 2017-01-02     a    1.2             NaN
3 2017-01-02     b    2.3             NaN
4 2017-01-08     a    1.1             1.0
5 2017-01-08     b    2.2             2.0
...