【问题标题】:How to lag data by x specific days on a multi index pandas dataframe?如何在多索引熊猫数据框中将数据滞后 x 个特定天数?
【发布时间】:2018-09-21 00:38:02
【问题描述】:

我有一个包含日期、资产和价格/数量数据的 DataFrame。我正在尝试提取 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 的事情来填补缺失的日期,但我的问题是我有多个索引、日期和 cusips,所以我不能只重新索引。

【问题讨论】:

  • 想要的输出是什么?
  • 抱歉给您带来了困惑——更新为所需的输出(7 天前的滞后)

标签: python pandas indexing pandas-loc


【解决方案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

【讨论】:

  • 哈哈...我们俩都在关注这个问题,可以fillnanans替换为''
【解决方案2】:

您可以将datecusip 设置为索引并将unstackshift 一起使用

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

然后简单地将shifted 与您原来的df 合并

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 2020-02-13
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2015-02-22
    • 2021-11-11
    相关资源
    最近更新 更多