我的数据看起来像这样
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()
)
关于python - 对 pandas 面板数据进行上采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63849236/