我有类似这样的数据
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')
这显然是一种可怕的方法。这确实很慢,但是可以。处理此问题的正确方法是什么?
答案 0 :(得分: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()
)