如何在多索引 pandas 数据帧上将数据滞后 x 特定天数?
How to lag data by x specific days on a multi index pandas dataframe?
我有一个包含日期、资产和 price/volume 数据的 DataFrame。我正在尝试提取 7 天前的数据,但问题是我无法使用 shift(),因为我的 table 中缺少日期。
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
我已经尝试创建一个 lambda 函数来尝试使用 loc 和 timedelta 来创建此转换,但我只能输出空的 numpy 数组:
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'
我也想过做一些类似于 this 的事情来填补缺失的日期,但我的问题是我有多个索引、日期和尖点,所以我不能只重新索引这个.
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
你可以把date
和cusip
设置为索引,unstack
和shift
一起使用
shifted = df.set_index(["date", "cusip"]).unstack().shift(7).stack()
然后只需将 shifted
与原来的 df
合并
我有一个包含日期、资产和 price/volume 数据的 DataFrame。我正在尝试提取 7 天前的数据,但问题是我无法使用 shift(),因为我的 table 中缺少日期。
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
我已经尝试创建一个 lambda 函数来尝试使用 loc 和 timedelta 来创建此转换,但我只能输出空的 numpy 数组:
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'
我也想过做一些类似于 this 的事情来填补缺失的日期,但我的问题是我有多个索引、日期和尖点,所以我不能只重新索引这个.
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
你可以把date
和cusip
设置为索引,unstack
和shift
一起使用
shifted = df.set_index(["date", "cusip"]).unstack().shift(7).stack()
然后只需将 shifted
与原来的 df