如何在多索引熊猫数据框中将数据滞后x特定天?

时间:2018-09-21 00:38:02

标签: 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         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的事情来填写丢失的日期,但是我的问题是我有多个索引,日期和临时表,所以我不能只是为此重新索引。

我不确定我还能做什么,但是任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以将datecusip设置为索引,并同时使用unstackshift

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

然后只需将shifted与原始df合并