我有一个时间序列数据框,数据框非常大,并且在2列中包含一些缺失值('湿度'和压力')。我想以巧妙的方式来证明这些缺失的值,例如使用最近邻居的值或前一个和后一个时间戳的平均值。是否有一个简单的方法可以做到这一点?我尝试过fancyimpute但是数据集包含大约180000个示例并且给出了内存错误
答案 0 :(得分:5)
考虑interpolate
(documentation)。此示例显示如何使用直线填充任何大小的间隙:
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 :(得分:3)
您可以像这样使用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
答案 2 :(得分:0)
看起来您的数据是按小时计算的。如何才能获取之前和之后一小时的平均值?或者将窗口大小更改为2,表示前后两小时的平均值?
使用其他变量进行插入可能很昂贵,如果虚拟方法不能正常工作(例如引入过多噪声),则应该只考虑这些方法。
答案 3 :(得分:0)
<强>内插&Filna:强>
由于其时间序列问题,我将在答案中使用一些o / p图形图像以更好地理解它:
考虑到我们具有以下时间序列数据:(在x轴上=天数,y =数量)
pdDataFrame.set_index('Dates')['QUANTITY'].plot(figsize = (16,6))
我们可以看到时间序列中有一些NaN数据。 nan的百分比=总数据的19.400%。现在我们要估算null / nan值。
我将尝试向您展示插值和filna方法的o / p来填充数据中的Nan值。
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))
带有回填方法且限制= 7的fillna()
限制:这是连续的NaN值以向前/向后填充物的最大数量。换句话说,如果连续的NaN数量大于此数量的缺口,它将仅被部分填充。
pdDataFrame.set_index('Dates')['QUANTITY'].fillna(value=None, method='backfill', axis=None, limit=7, downcast=None).plot(figsize = (16,6))
我发现fillna函数更有用。但是您可以使用任何一种方法来填充两列中的nan值。
有关这些功能的更多详细信息,请参考以下链接:
还有一个Lib:impyute
您可以签出。有关此lib的更多详细信息,请参见以下链接:https://pypi.org/project/impyute/