【发布时间】:2019-12-30 20:08:58
【问题描述】:
我有许多长度在 28 到 179 之间的不同长度的数据帧(时间序列)。我需要将它们全部设为 104。(对低于 104 的数据进行上采样,对高于 104 的数据进行下采样)
对于上采样,线性方法足以满足我的需要。对于下采样,值的平均值应该很好。
为了让所有文件的长度相同,我认为我需要让所有数据帧在相同的日期开始和结束。
我能够使用以下代码行将所有数据下采样到最小数据帧的大小(即 28):
df.set_index(pd.date_range(start='1/1/1991' ,periods=len(df), end='1/1/2000'), inplace=True)
resampled=df.resample('120D').mean()
但是,当我将它们输入到我需要它们的模型中时,这不会给我带来很好的结果,因为它会大大缩小较长的文件,从而扭曲数据。
这是我迄今为止尝试过的:
df.set_index(pd.date_range(start='1/1/1991' ,periods=len(df), end='1/1/2000'), inplace=True)
if df.shape[0]>100: resampled=df.resample('D').mean()
elif df.shape[0]<100: resampled=df.astype(float).resample('33D').interpolate(axis=0, method='linear')
else: break
现在,在上面的代码行中,我让文件的长度相同(长度为 100)。下采样部分也可以正常工作。
上采样部分的 interpoaltion 不起作用。它只返回长度为 100 的数据帧每列的第一个值刚刚复制到所有行。
我需要将它们全部设为 104(平均尺寸)。这意味着任何长度>104的df都需要下采样,任何长度
例如,请考虑以下两个df:
>>df1
index
0 3 -1 0
1 5 -3 2
2 9 -5 0
3 11 -7 -2
>>df2
index
0 3 -1 0
1 5 -3 2
2 9 -5 0
3 6 -3 -2
4 4 0 -4
5 8 2 -6
6 10 4 -8
7 12 6 -10
假设平均长度为 6,预期输出为:
df1 上采样 使用插值到长度 6 - 例如resamle(rule).interpolate().
并且使用resample(rule).mean() df2 下采样到长度 6。
更新:
如果我可以将所有文件上采样到 179,那也很好。
【问题讨论】:
-
我认为 pandas Groupby 在这里可能会有所帮助,但我是 python 新手,我不知道如何准确地应用它来解决这个问题。
标签: python pandas time-series interpolation resampling