我有一个熊猫数据框,其中包含一系列不均匀日期的不同类型水果的一系列价格值。我想做的是在每个水果类型的一致时间范围内插入水果的价格。
困难的部分是,目前,有些时候重叠,有些则没有(见下面的例子)。我宁愿不将插值扩展到提供的日期范围之外,因为这会留下太多的错误空间。所以我没有比较下面的水果01和02的价格,但01和03应该有一个我可以用来比较的窗口。我的目标是保持一致/重叠的日期范围,我可以比较水果价格的变化,即我应该能够比较水果01和水果03的内插价格,如9/21 / 14,9 / 28 / 14,10 / 5/14等。
至于插值,当我考虑使用什么类型的插值时,我应该考虑什么?我认为每周价格插值就足够了。
id date price
01 2014-09-21 3.41
01 2014-11-05 5.63
01 2015-02-22 6.22
02 2013-04-11 245.22
02 2013-05-20 250.05
03 2014-08-28 10.53
03 2014-10-01 12.43
如果我能提供更多信息,请与我们联系。谢谢你的帮助!
答案 0 :(得分:1)
我认为这与你想要完成的事情是一致的,但如果没有明确措辞的目标,就很难更准确。
pt = pd.pivot_table(df, values='price', columns='id', index='date')
>>> pt
id 1 2 3
date
2013-04-11 NaN 245.22 NaN
2013-05-20 NaN 250.05 NaN
2014-08-28 NaN NaN 10.53
2014-09-21 3.41 NaN NaN
2014-10-01 NaN NaN 12.43
2014-11-05 5.63 NaN NaN
2015-02-22 6.22 NaN NaN
df2 = (pt
.set_index(pd.DatetimeIndex(pt.index))
.resample('W')
.apply(lambda series: series.interpolate()))
for col in df2:
end_date = pt[col].last_valid_index()
df2.loc[df2.index > end_date, col] = np.nan
>>> df2
id 1 2 3
2013-04-14 NaN 245.220 NaN
2013-04-21 NaN 246.025 NaN
2013-04-28 NaN 246.830 NaN
2013-05-05 NaN 247.635 NaN
2013-05-12 NaN 248.440 NaN
2013-05-19 NaN 249.245 NaN
2013-05-26 NaN NaN NaN
2013-06-02 NaN NaN NaN
... ... ... ...
2014-08-31 NaN NaN 10.53
2014-09-07 NaN NaN 10.91
2014-09-14 NaN NaN 11.29
2014-09-21 3.410000 NaN 11.67
2014-09-28 3.727143 NaN 12.05
2014-10-05 4.044286 NaN NaN
...
2015-02-15 6.180667 NaN NaN
2015-02-22 6.220000 NaN NaN
如果你想把它压平:
>>> df2.stack().reset_index()
level_0 id 0
0 2013-04-14 2 245.220000
1 2013-04-21 2 246.025000
2 2013-04-28 2 246.830000
.. ... .. ...
31 2015-02-08 1 6.141333
32 2015-02-15 1 6.180667
33 2015-02-22 1 6.220000