在数据框中按组插值 - Python

时间:2015-12-07 01:40:44

标签: python pandas interpolation

我有一个熊猫数据框,其中包含一系列不均匀日期的不同类型水果的一系列价格值。我想做的是在每个水果类型的一致时间范围内插入水果的价格。

困难的部分是,目前,有些时候重叠,有些则没有(见下面的例子)。我宁愿不将插值扩展到提供的日期范围之外,因为这会留下太多的错误空间。所以我没有比较下面的水果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

如果我能提供更多信息,请与我们联系。谢谢你的帮助!

1 个答案:

答案 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