首页 > 解决方案 > Pandas 将偏差最小的不规则时间序列滚动到规则间隔序列

问题描述

我有一个以时间戳作为索引的 DataFrame,其中最新数据的频率最高,数据越旧,频率越低(以节省内存)。

幸运的是,pandas 有这个rolling模块,它支持时间偏移,例如df.rolling('15T')15 分钟滚动窗口。但是应用于插入到常规时间索引的时间序列的滚动窗口的偏差非常大。尤其是峰要么变平要么太大。

代码可能看起来有点笨拙,但其中大部分只是生成示例数据并绘制它。应用滚动平均值的相关内容只有 4 行代码。
时间戳从最旧样本的 5 分钟样本开始,到 2 分钟样本,最后到最新数据的 1 分钟样本。
df是不规则间隔的时间序列,df2被重新采样并内插到 1 分钟频率,并且df3被重采样到 1 分钟而不进行内插。已应用滚动方式的 DataFrame 在r其名称后附加了一个。
打印标准偏差和标准以比较产生的偏差。
我生成各种不同滚动方式的示例代码如下。

tr1 = pd.date_range('20180820 1400', '20180820 1600', freq='1T')
tr2 = pd.date_range('20180820 1100', '20180820 1400', freq='2T')
tr3 = pd.date_range('20180820 0700', '20180820 1100', freq='5T')
tr = np.concatenate((tr3[:-1], tr2[:-1], tr1))
a = np.random.rand(tr.shape[0])
df = pd.DataFrame(data=a, index=tr, columns=['irreg. data'])
df2 = df.resample('1T').interpolate().rename(columns={'irreg. data': 'reg. data'})
df3 = df.asfreq('1T').rename(columns={'irreg. data': 'asfreq. data'})

freq = '15T'  # apply rolling mean with a window length of 15 minutes
dfr = df.rolling(freq).mean().rename(columns={'irreg. data': 'rolling irreg. data'})
df2r = df2.rolling(freq).mean().rename(columns={'reg. data': 'rolling reg. data'})
df3r = df3.rolling(freq).mean().rename(columns={'asfreq. data': 'rolling asfreq. data'})

fig = plt.figure()  # plot the comparison
ax1 = fig.gca()
df.plot.line(ax=ax1, marker='1')  # irregularly shaped time series
dfr.plot.line(ax=ax1, marker='o')  # roll. mean of irregularly shaped time series
df2.plot.line(ax=ax1)  # regularly shaped time series
df2r.plot.line(ax=ax1, marker='x')  # roll. mean of regularly shaped time series
df3.plot.line(ax=ax1)  # irreg. time series, resampled without interpolation
df3r.plot.line(ax=ax1, marker='4')  # roll. mean of irreg. time series, resampled without interpolation
ax1.legend()

dev_irreg = (dfr.resample('1T').interpolate().iloc[:, 0] - df2r.iloc[:, 0])
dev_asfreq = (df3r.resample('1T').interpolate().iloc[:, 0] - df2r.iloc[:, 0])
print('deviations irreg:', dev_irreg.std(axis=0), np.linalg.norm(dev_irreg))
print('deviations asfreq:', dev_asfreq.std(axis=0), np.linalg.norm(dev_asfreq))

我的问题:

是否有任何 pandas 模块可以产生与df2r(在应用滚动平均值之前内插到 1 分钟的数据帧)相当的结果,而无需内插数据?性能,尤其是内存使用是相关的,因此我想避免插值。
此外,与使用不规则间隔的时间序列相比,该asfreq方法的df3偏差可能稍好一些,但由于我必须从中计算差异,所以我不太喜欢“高原”。

提前感谢您的帮助!

标签: pythonpandasdataframetime-series

解决方案


推荐阅读