对熊猫面板数据进行升采样

问题描述

我有类似这样的数据

    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')

这显然是一种可怕的方法。这确实很慢,但是可以。处理此问题的正确方法是什么?

解决方法

您的方法可能很慢,因为您需要先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()
)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...