如何处理Python时间序列中的缺失值?
在本文中,我们将讨论如何使用Python编程语言处理时间序列中的缺失值。
时间序列是按固定时间间隔记录的一系列观察结果。时间序列分析有助于了解给定资产、证券或经济变量如何随时间变化。这里的另一个大问题是为什么我们需要处理数据集中的缺失值以及为什么数据中存在缺失值?
- 在数据集的预处理过程中,缺失数据的处理非常重要,因为许多机器学习算法不支持缺失值。
- 由于读取或记录数据的问题,时间序列可能会出现缺失点。
为什么我们不能用全局平均值更改缺失值,因为时间序列数据可能具有季节性或趋势?传统方法(例如均值和众数插补、删除和其他方法)不足以处理缺失值,因为这些方法会导致数据偏差。使用某些程序或算法产生的值对缺失数据进行估计或插补可能是最小化传统数据方法的偏差效应的最佳解决方案。最后,数据将完成并准备好用于下一个分析或数据挖掘步骤。
方法一:使用 ffill() 和 bfill() 方法
该方法根据顺序和条件填充缺失值。这意味着该方法将 'nan 的值替换为最后观察到的非 nan 值或下一个观察到的非 nan 值。
- backfill - bfill : 根据最后观察到的值
- forwardfill - ffill :根据下一个观察值
Python3
# import the libraries
import pandas as pd
import numpy as np
# dataframe with index as timeseries
time_sdata = pd.date_range("09/10/2021", periods=9, freq="W")
df = pd.DataFrame(index=time_sdata)
print(df)
# there are four missing values
df["example"] = [10001.0, 10002.0, 10003.0, np.nan,
10004.0, np.nan, np.nan, 10005.0, np.nan]
gfg1 = df.ffill()
print("Using ffill() function:-")
print(gfg1)
# here we are doing Backfill Missing Values
# in the output the last value has NaN because
# there is no backward value for that
gfg2 = df.bfill()
print("Using bfill() function:-")
print(gfg2)
Python3
# import the libraries
import pandas as pd
import numpy as np
# dataframe with index as timeseries
time_sdata = pd.date_range("09/10/2021", periods=9, freq="W")
df = pd.DataFrame(index=time_sdata)
print(df)
# there are four missing values
df["example"] = [10001.0, 10002.0, 10003.0, np.nan,
10004.0, np.nan, np.nan, 10005.0, np.nan]
# using interpolate() to fill the missing
# values in a specific order
# dealing with missing values
dataframe1 = df.interpolate()
print(dataframe1)
Python3
# import the libraries
import pandas as pd
import numpy as np
# dataframe with index as timeseries
time_sdata = pd.date_range("09/10/2021", periods=9, freq="W")
df = pd.DataFrame(index=time_sdata)
print(df)
# there are four missing values
df["example"] = [10001.0, 10002.0, 10003.0, np.nan,
10004.0, np.nan, np.nan, 10005.0, np.nan]
# Interpolating Missing Values to two values
dataframe = df.interpolate(limit=2, limit_direction="forward")
print(dataframe)
输出:
方法二:使用 Interpolate() 方法
该方法比上面的 fillna() 方法更复杂。它由不同的方法组成,包括“线性”、“二次”、“最近”。插值是填充时间序列数据中缺失值的有效方法。浏览以下链接以获取更多示例。
Python3
# import the libraries
import pandas as pd
import numpy as np
# dataframe with index as timeseries
time_sdata = pd.date_range("09/10/2021", periods=9, freq="W")
df = pd.DataFrame(index=time_sdata)
print(df)
# there are four missing values
df["example"] = [10001.0, 10002.0, 10003.0, np.nan,
10004.0, np.nan, np.nan, 10005.0, np.nan]
# using interpolate() to fill the missing
# values in a specific order
# dealing with missing values
dataframe1 = df.interpolate()
print(dataframe1)
输出:
方法 3:使用带限制参数的 Interpolate() 方法
这是向前/向后填充的连续 NaN 值的最大数量。换句话说,如果有超过这个数量的连续 NaN 的间隙,它只会被部分填充。
句法:
DataFrame.interpolate(method=’linear’, axis=0, limit=None, inplace=False, limit_direction=None, limit_area=None, downcast=None, **kwargs)
注意:具有 MultiIndex 的 DataFrame/Series 仅支持 method='linear'。
Python3
# import the libraries
import pandas as pd
import numpy as np
# dataframe with index as timeseries
time_sdata = pd.date_range("09/10/2021", periods=9, freq="W")
df = pd.DataFrame(index=time_sdata)
print(df)
# there are four missing values
df["example"] = [10001.0, 10002.0, 10003.0, np.nan,
10004.0, np.nan, np.nan, 10005.0, np.nan]
# Interpolating Missing Values to two values
dataframe = df.interpolate(limit=2, limit_direction="forward")
print(dataframe)
输出: