【问题标题】:Upsampling on pandas panel data对熊猫面板数据进行上采样
【发布时间】:2020-12-30 02:31:51
【问题描述】:

我的数据看起来像这样

    date        ticker  x    y
0   2018-01-31  ABC     1    5
1   2019-01-31  ABC     2    6
2   2018-01-31  XYZ     3    7
3   2019-01-31  XYZ     4    8

所以这是一组年度观察结果。我想上采样到每月频率并向前填充新的观察结果。所以ABC看起来像

    date        ticker  x     y
0   2018-01-31  ABC     1     5
1   2018-02-28  ABC     1     5
...
22  2019-11-30  ABC     2     6
23  2019-12-31  ABC     2     6

请注意,我想填写最后一年,而不是直到最后一个日期。

现在我正在做类似的事情

newidx = df.groupby('ticker')['date'].apply(lambda x: 
    pd.Series(pd.date_range(x.min(),x.max()+YearEnd(1),freq='M'))).reset_index()
newidx.drop('level_1',axis=1,inplace=True)
df = pd.merge(newidx,df,on=['date','ticker'],how='left')

这显然是一种糟糕的方法。它真的很慢,但它确实有效。处理这个问题的正确方法是什么?

【问题讨论】:

  • 我认为不可能有更快的方法,但更简洁的方法可能是:)
  • 另一件事我意识到,由于两个数据框中的日期未对齐,您的方法没有给出预期的结果。

标签: python pandas panel-data


【解决方案1】:

您的方法可能很慢,因为您需要groupby,然后是merge。让我们尝试使用reindex 的另一个选项,这样您只需要groupby

(df.set_index('date')
   .groupby('ticker')
   .apply(lambda x: x.reindex(pd.date_range(x.index.min(),x.index.max()+YearEnd(1),freq='M'),
                              method='ffill'))
   .reset_index('ticker', drop=True)
   .reset_index()
)

【讨论】:

  • @ShubhamSharma 你是对的。我没有意识到 OP 想在明年填补所有的空缺。已更新。
  • .. 没问题 ;)
猜你喜欢
  • 2018-12-18
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 2017-10-09
  • 2016-11-25
  • 1970-01-01
  • 2018-11-16
相关资源
最近更新 更多