python - 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
偏差可能稍好一些,但由于我必须从中计算差异,所以我不太喜欢“高原”。
提前感谢您的帮助!
解决方案
推荐阅读
- face-api - 如何使用 face-api.js 检测活人脸而不是照片?
- .net - 使用 XPathCompiler 引用用户定义的 xsl:function
- c# - C# libreoffice 基本连接
- html - 在 Django 中访问模型属性
- python - 使用列表时,Tkinter 按钮只能工作一次
- gnome-shell - 如何通过命令行启动 gnome 的内置屏幕录像机?
- tensorflow - ImportError Keras 后端
- java - 如何配置后退按钮?
- c# - 如何邀请机器人参加 Microsoft Teams 实时活动
- apache-spark - pyspark 作业因“ OperationalError:(SQLDriverConnect) ”而失败