熊猫在不规则时间序列上以最小的偏差滚动到规则间隔的序列

时间:2018-08-22 12:15:31

标签: python pandas dataframe time-series

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

幸运的是,熊猫具有rolling模块,该模块支持例如15滚动窗口的df.rolling('15T')的时间偏移。但是,应用于插值到常规时间索引的时间序列的滚动窗口偏差非常大。尤其是峰变平或太大。

该代码可能看起来有些笨拙,但大多数只是生成示例数据并将其绘制。与应用滚动均值相关的只有四行代码。
时间戳记从最早的样本的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))

我的问题:

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

谢谢您的帮助!

0 个答案:

没有答案