python 时间序列中的缺失值
Missing values in Time Series in python
我有一个时间序列数据框,该数据框很大并且在 2 列('Humidity' 和 'Pressure')中包含一些缺失值。我想以一种巧妙的方式来估算这些缺失值,例如使用最近邻居的值或之前和之后 timestamp.Is 的平均值有一个简单的方法吗?我试过使用 fancyimpute 但数据集包含大约 180000 个示例并给出内存错误
您的数据似乎是按小时计算的。取前一小时和后一小时的平均值怎么样?或者把window大小改成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
考虑 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
插值和滤波器:
由于是时间序列问题,我将在答案中使用 o/p 图形图像来进行解释:
假设我们有如下时间序列数据:(在 x 轴上 = 天数,y = 数量)
pdDataFrame.set_index('Dates')['QUANTITY'].plot(figsize = (16,6))
我们可以看到时间序列中有一些NaN数据。 nan 的百分比 = 总数据的 19.400%。现在我们要估算 null/nan 个值。
我将尝试向您展示 o/p 插值和 filna 方法来填充数据中的 Nan 值。
插值() :
1st 我们将使用插值:
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() with backfill method & limit = 7
limit:这是要 forward/backward 填充的连续 NaN 值的最大数量。换句话说,如果有超过这个连续NaN数的间隙,它只会被部分填充。
pdDataFrame.set_index('Dates')['QUANTITY'].fillna(value=None, method='backfill', axis=None, limit=7, downcast=None).plot(figsize = (16,6))
我发现 fillna 函数更有用。但是您可以使用任何一种方法来填充两列中的 nan 值。
有关这些函数的更多详细信息,请参阅以下 link:
- 菲尔娜:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.fillna.html#pandas.Series.fillna
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.interpolate.html
还有一个库:impyute
,您可以查看。有关此库的更多详细信息,请参阅此 link:https://pypi.org/project/impyute/
我有一个时间序列数据框,该数据框很大并且在 2 列('Humidity' 和 'Pressure')中包含一些缺失值。我想以一种巧妙的方式来估算这些缺失值,例如使用最近邻居的值或之前和之后 timestamp.Is 的平均值有一个简单的方法吗?我试过使用 fancyimpute 但数据集包含大约 180000 个示例并给出内存错误
您的数据似乎是按小时计算的。取前一小时和后一小时的平均值怎么样?或者把window大小改成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
考虑 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
插值和滤波器:
由于是时间序列问题,我将在答案中使用 o/p 图形图像来进行解释:
假设我们有如下时间序列数据:(在 x 轴上 = 天数,y = 数量)
pdDataFrame.set_index('Dates')['QUANTITY'].plot(figsize = (16,6))
我们可以看到时间序列中有一些NaN数据。 nan 的百分比 = 总数据的 19.400%。现在我们要估算 null/nan 个值。
我将尝试向您展示 o/p 插值和 filna 方法来填充数据中的 Nan 值。
插值() :
1st 我们将使用插值:
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() with backfill method & limit = 7
limit:这是要 forward/backward 填充的连续 NaN 值的最大数量。换句话说,如果有超过这个连续NaN数的间隙,它只会被部分填充。
pdDataFrame.set_index('Dates')['QUANTITY'].fillna(value=None, method='backfill', axis=None, limit=7, downcast=None).plot(figsize = (16,6))
我发现 fillna 函数更有用。但是您可以使用任何一种方法来填充两列中的 nan 值。
有关这些函数的更多详细信息,请参阅以下 link:
- 菲尔娜:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.fillna.html#pandas.Series.fillna
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.interpolate.html
还有一个库:impyute
,您可以查看。有关此库的更多详细信息,请参阅此 link:https://pypi.org/project/impyute/