Python 如何在多索引数据框中将数据延迟x个特定天数?
我有一个数据框,其中包含日期、资产,然后是价格/数量数据。我试图从7天前提取数据,但问题是我不能使用shift(),因为我的表中缺少日期Python 如何在多索引数据框中将数据延迟x个特定天数?,python,pandas,indexing,loc,Python,Pandas,Indexing,Loc,我有一个数据框,其中包含日期、资产,然后是价格/数量数据。我试图从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
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'
我也想过做一些类似的事情来填补缺失的日期,但我的问题是我有多个索引,日期和CUSIP,所以我不能只是重新索引这个
我真的不知道我还能做什么,但任何帮助都将不胜感激
merge
将DataFrame
与其自身合并,同时在右侧框架的日期列中添加7天。使用后缀
参数适当地命名列
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
merge
将DataFrame
与其自身合并,同时在右侧框架的日期列中添加7天。使用后缀
参数适当地命名列
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()
然后,只需将
shift
与原始df
合并,就可以将日期
和cusip
设置为索引,并将取消堆栈
和shift
一起使用
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
shifted = df.set_index(["date", "cusip"]).unstack().shift(7).stack()
然后简单地将
shift
与您的原始df
合并所需输出?抱歉,混淆-用所需输出更新(7天前的延迟)所需输出?抱歉,混淆-用所需输出更新(7天前的延迟)哈哈。。。我们两个都关注这个问题,可以用'
来代替nan
s,用'
哈哈。。。我们两人都关注这个问题,可以用'
fillna替换nan
s
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