python - 如何使不同长度的不同数据帧变得长度相等(下采样和上采样)

标签 python pandas time-series interpolation resampling

我有许多长度不同的数据帧(时间序列),范围在 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)。下采样部分也工作得很好。

不起作用的是上采样部分的插值。它只返回长度为 100 的数据帧每列的第一个值刚刚复制到所有行

我需要的是使它们全部尺寸为 104(平均尺寸)。这意味着任何长度>104的df都需要下采样,任何长度<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 使用插值将 df1 上采样至长度 6 - 例如重新采样(rule).interpolate()

并使用 resample(rule).mean()df2 下采样至长度 6。

更新:

如果我可以将所有文件上采样到 179,那也很好。

最佳答案

我认为问题是当您在上采样情况下进行重新采样时,其他值不会保留。对于示例 df1,您可以通过在一列上使用 asfreq 来查看它:

print (df1.set_index(pd.date_range(start='1/1/1991' ,periods=len(df1), end='1/1/2000'))[1]
          .resample('33D').asfreq().isna().sum(0))
#99 rows are nan on the 100 length resampled dataframe

因此,当您执行 interpolate 而不是 asfreq 时,它实际上仅使用第一个值进行插值,这意味着第一个值在所有行上“重复”

要获得所需的结果,请在插值之前,即使在上采样情况下也使用 mean,例如:

print (df1.set_index(pd.date_range(start='1/1/1991' ,periods=len(df1), end='1/1/2000'))[1]
          .resample('33D').mean().interpolate().head())
1991-01-01    3.000000
1991-02-03    3.060606
1991-03-08    3.121212
1991-04-10    3.181818
1991-05-13    3.242424
Freq: 33D, Name: 1, dtype: float64

你会得到你想要的值。

总而言之,我认为在上采样和下采样情况下,您可以使用相同的命令

resampled = (df.set_index(pd.date_range(start='1/1/1991' ,periods=len(df), end='1/1/2000'))
               .resample('33D').mean().interpolate())

因为插值不会影响下采样情况下的结果。

关于python - 如何使不同长度的不同数据帧变得长度相等(下采样和上采样),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57661202/

相关文章:

Python:使用相对路径导入excel文件

r - 计算时间序列中缺失的月份

r - 如何获得R中矩阵的每四行之和

python - 如何加速 tkinter 嵌入 matplotlib 和 python

python - 如何在 pygame 的一个表面上有多个输入框并将这些输入存储在变量中?

python - 比较可变数量的列表是否相等的更好方法

python - 根据包含的字典键替换 Pandas DataFrame 列值

python - 在 dynamoDB 查询中使用字符串作为 FilterExpression 的参数

进行 groupby 计数时出现 python pandas 错误

database - 如何从 InfluxDB 获取 `MEASUREMENTS` 的大小?