Python中的时间序列中缺少值

Mar*_*ico 8 python nan pandas imputation

我有一个时间序列数据框,该数据框很大,并且在两列(“湿度”和“压力”)中包含一些缺失值。我想以一种巧妙的方式来估算这些缺失的值,例如使用最近的邻居的值或前一个和后一个时间戳的平均值,是否有一种简单的方法?我尝试使用fancyimpute,但是数据集包含大约180000个示例,并给出了内存错误在此处输入图片说明

Pet*_*ler 8

考虑interpolate文档)。此示例显示如何用直线填充任何大小的间隙:

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
Run Code Online (Sandbox Code Playgroud)

  • 时间序列不是线性的,考虑一年中的温度,它遵循正弦运动,其值受许多因素影响 1.季节性,2.趋势,3.其他随机因素。在“R”中有一个名为 [imputeTS](https://cran.r-project.org/web/packages/imputeTS/imputeTS.pdf) 的包,为此,我不知道等效的 python 包。 (3认同)
  • 我认为我们必须使用`method ='time'`而不是`method ='linear'` (2认同)

Yog*_*esh 6

插值和菲尔纳:

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

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

pdDataFrame.set_index('Dates')['QUANTITY'].plot(figsize = (16,6))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

我将尝试向您展示内插和 filna 方法的 o/p 以填充数据中的 Nan 值。

插值():

第一,我们将使用插值:

pdDataFrame.set_index('Dates')['QUANTITY'].interpolate(method='linear').plot(figsize = (16,6))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

fillna() 带回填方法

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

在此处输入图片说明

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

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

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

在此处输入图片说明

我发现 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/


Sco*_*ton 5

你可以这样使用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())
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)