【问题标题】:pandas: extrapolate missing values at the tailpandas:在尾部推断缺失值
【发布时间】:2017-12-28 02:08:33
【问题描述】:

我有一个 pandas 数据框 df,它的 GDP 值也带有 yyyy-mm TimePeriod 索引。

import numpy as np
import pandas as pd
import pandas_datareader.data as web
gdp = web.DataReader("GDP", "fred", start, end).resample('M').mean().interpolate(method='linear').round().to_period('M')

Date        GDP
2015-07    16528.0
2015-08    16534.0
2015-09    16541.0
2015-10    16548.0
2015-11    16556.0
2015-12    16564.0
2016-01    16572.0
2016-02    16602.0
2016-03    16633.0
2016-04    16664.0
2016-05    16702.0
2016-06    16740.0
2016-07    16778.0
2016-08    16803.0
2016-09    16827.0
2016-10    16851.0
2016-11    16869.0
2016-12    16886.0
2017-01    16903.0
2017-02    16946.0
2017-03    16988.0
2017-04    17031.0
2017-05    17075.0
2017-06    17120.0
2017-07    17164.0
2017-08        NaN
2017-09        NaN
2017-10        NaN
2017-11        NaN
2017-12        NaN

GDP 每季度发布一次。最新数据点是 2017 年第三季度。因此,我重新采样以获得每月值并在缺少值时进行插值。如何通过使用样条曲线或 3 个月移动平均线等来推断在今年余下的时间里填充 NaN 的剩余部分?我见过一些使用多项式的例子,但这看起来像是过度的东西(pandas extrapolation of polynomial)。我想知道是否有更简单的方法。谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    通过使用interpolate

    df.GDP=df.GDP.interpolate(method='spline', order=2)
    
    df
    Out[197]: 
           Date           GDP
    0   2015-07  16528.000000
    1   2015-08  16534.000000
    2   2015-09  16541.000000
    3   2015-10  16548.000000
    4   2015-11  16556.000000
    5   2015-12  16564.000000
    6   2016-01  16572.000000
    7   2016-02  16602.000000
    8   2016-03  16633.000000
    9   2016-04  16664.000000
    10  2016-05  16702.000000
    11  2016-06  16740.000000
    12  2016-07  16778.000000
    13  2016-08  16803.000000
    14  2016-09  16827.000000
    15  2016-10  16851.000000
    16  2016-11  16869.000000
    17  2016-12  16886.000000
    18  2017-01  16903.000000
    19  2017-02  16946.000000
    20  2017-03  16988.000000
    21  2017-04  17031.000000
    22  2017-05  17075.000000
    23  2017-06  17120.000000
    24  2017-07  17164.000000
    25  2017-08  17211.095399
    26  2017-09  17258.357329
    27  2017-10  17306.504998
    28  2017-11  17355.538404
    29  2017-12  17405.457549
    

    数据输入

    df
    Out[195]: 
           Date      GDP
    0   2015-07  16528.0
    1   2015-08  16534.0
    2   2015-09  16541.0
    3   2015-10  16548.0
    4   2015-11  16556.0
    5   2015-12  16564.0
    6   2016-01  16572.0
    7   2016-02  16602.0
    8   2016-03  16633.0
    9   2016-04  16664.0
    10  2016-05  16702.0
    11  2016-06  16740.0
    12  2016-07  16778.0
    13  2016-08  16803.0
    14  2016-09  16827.0
    15  2016-10  16851.0
    16  2016-11  16869.0
    17  2016-12  16886.0
    18  2017-01  16903.0
    19  2017-02  16946.0
    20  2017-03  16988.0
    21  2017-04  17031.0
    22  2017-05  17075.0
    23  2017-06  17120.0
    24  2017-07  17164.0
    25  2017-08      NaN
    26  2017-09      NaN
    27  2017-10      NaN
    28  2017-11      NaN
    29  2017-12      NaN
    

    【讨论】:

    • 但是,我已经在上面的代码中尝试过插值。它不能外推到“2017-12”。它停在“2017-07”。
    • @Zenvega 看到 order=2,你添加了吗?
    • @Zenvega 这是我根据你的 gdp 数据集得到的结果
    • @Zenvega 添加数据输入,不要忘记重新分配它
    • 我收到错误:{TypeError: float() argument must be a string or a number, not 'Period'}
    猜你喜欢
    • 2014-04-24
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多