【问题标题】:Missing values in Time Series in pythonpython中时间序列中的缺失值
【发布时间】:2018-08-24 19:11:51
【问题描述】:

我有一个时间序列数据框,该数据框很大,并且在 2 列(“湿度”和“压力”)中包含一些缺失值。我想以一种聪明的方式来估算这个缺失值,例如使用最近邻居的值或前后时间戳的平均值。有没有简单的方法可以做到这一点?我试过用 fancyimpute 但数据集包含大约 180000 个示例并给出内存错误

【问题讨论】:

  • 您能否将几行 DataFrame 发布为文本而不是图像?
  • 这在很大程度上取决于您要应用的插补方法。您可以简单地提取适用的列并在 that 数据框上进行估算吗?然后将这些值复制回原始表。否则,您还尝试了哪些其他方法?一个简单的浏览器搜索会出现十几个对我来说非常有用的点击。

标签: python pandas nan imputation


【解决方案1】:

您的数据似乎是按小时计算的。只取前一小时和后一小时的平均值怎么样?还是把window size改成2,意思是前后两小时的平均值?

使用其他变量进行插补可能会很昂贵,只有在虚拟方法效果不佳(例如引入过多噪声)时才应考虑这些方法。

【讨论】:

    【解决方案2】:

    你可以像这样使用rolling

    frame = pd.DataFrame({'Humidity':np.arange(50,64)})
    
    frame.loc[[3,7,10,11],'Humidity'] = np.nan
    
    frame.Humidity.fillna(frame.Humidity.rolling(4,min_periods=1).mean())
    

    输出:

    0     50.0
    1     51.0
    2     52.0
    3     51.0
    4     54.0
    5     55.0
    6     56.0
    7     55.0
    8     58.0
    9     59.0
    10    58.5
    11    58.5
    12    62.0
    13    63.0
    Name: Humidity, dtype: float64
    

    【讨论】:

      【解决方案3】:

      考虑interpolate (Series - DataFrame)。这个例子展示了如何用直线填充任意大小的空隙:

      df = pd.DataFrame({'date': pd.date_range(start='2013-01-01', periods=10, freq='H'), 'value': range(10)})
      df.loc[2:3, 'value'] = np.nan
      df.loc[6, 'value'] = np.nan
      df
                       date  value
      0 2013-01-01 00:00:00    0.0
      1 2013-01-01 01:00:00    1.0
      2 2013-01-01 02:00:00    NaN
      3 2013-01-01 03:00:00    NaN
      4 2013-01-01 04:00:00    4.0
      5 2013-01-01 05:00:00    5.0
      6 2013-01-01 06:00:00    NaN
      7 2013-01-01 07:00:00    7.0
      8 2013-01-01 08:00:00    8.0
      9 2013-01-01 09:00:00    9.0
      
      df['value'].interpolate(method='linear', inplace=True)
                       date  value
      0 2013-01-01 00:00:00    0.0
      1 2013-01-01 01:00:00    1.0
      2 2013-01-01 02:00:00    2.0
      3 2013-01-01 03:00:00    3.0
      4 2013-01-01 04:00:00    4.0
      5 2013-01-01 05:00:00    5.0
      6 2013-01-01 06:00:00    6.0
      7 2013-01-01 07:00:00    7.0
      8 2013-01-01 08:00:00    8.0
      9 2013-01-01 09:00:00    9.0
      

      【讨论】:

      • 时间序列不是线性的,考虑全年的温度,它遵循正弦运动,该值受许多因素影响1.季节性,2.趋势,3.其他随机因素。在“R”中有一个名为 imputeTS 的包,我不知道有一个等效的 python 包。
      • 我认为我们必须使用method ='time' 而不是method ='linear'
      • 感谢@MohammadElNesr 的意见。这对我帮助很大。
      • @MohammadElNesr,感谢您添加有关 method='time' 的信息。我使用线性级数range(10) 作为一个简单的例子,但是任何值序列都可以证明如果日期序列是均匀间隔的,就像在原始问题中一样,method='linear' 和@987654331 之间没有区别@.
      【解决方案4】:

      插值和菲尔纳:

      由于是时间序列问题,我将在答案中使用 o/p 图形图像进行解释:

      假设我们有如下时间序列数据:(x 轴 = 天数,y = 数量)

      pdDataFrame.set_index('Dates')['QUANTITY'].plot(figsize = (16,6))
      

      我们可以看到时间序列中有一些 NaN 数据。 nan 的 % = 总数据的 19.400%。现在我们要估算 null/nan 值。

      我将尝试向您展示用于在数据中填充 Nan 值的 interpolate 和 filna 方法的 o/p。

      interpolate() :

      首先我们将使用插值:

      pdDataFrame.set_index('Dates')['QUANTITY'].interpolate(method='linear').plot(figsize = (16,6))
      

      注意:这里没有时间插值方法

      fillna() 带回填方法

      pdDataFrame.set_index('Dates')['QUANTITY'].fillna(value=None, method='backfill', axis=None, limit=None, downcast=None).plot(figsize = (16,6))
      

      fillna() 与回填方法 & 限制 = 7

      limit:这是向前/向后填充的连续 NaN 值的最大数量。换句话说,如果有超过这个数量的连续 NaN 的间隙,它只会被部分填充。

      pdDataFrame.set_index('Dates')['QUANTITY'].fillna(value=None, method='backfill', axis=None, limit=7, downcast=None).plot(figsize = (16,6))
      

      我发现 fillna 函数更有用。但是您可以使用任何一种方法来填充两列中的 nan 值。

      有关这些功能的更多详细信息,请参阅以下链接:

      1. 菲尔娜:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.fillna.html#pandas.Series.fillna
      2. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.interpolate.html

      还有一个 Lib:impyute,您可以查看。有关此库的更多详细信息,请参阅此链接:https://pypi.org/project/impyute/

      【讨论】:

        猜你喜欢
        • 2020-12-13
        • 2018-05-14
        • 2021-03-07
        • 1970-01-01
        • 2016-03-28
        • 2021-01-22
        • 2016-01-16
        • 2020-10-23
        • 1970-01-01
        相关资源
        最近更新 更多