【问题标题】:Pandas average of previous rows fulfilling condition满足条件的前几行的 Pandas 平均值
【发布时间】:2021-05-15 09:23:46
【问题描述】:

我有一个巨大的数据框(>20m 行),每行包含一个时间戳和一个数字变量 X。我想分配一个新列,其中每一行的新列中的值是 X 在在指定时间窗口内的前几行,例如时间戳不超过 5 分钟前的所有行的平均值。由于时间戳不是定期的,我不能只取固定切片

目前我发现的最佳方法是“卡特彼勒”算法,它遍历数据帧一次并根据时间帧窗口是否被破坏来移动开始/结束索引。然而,这被证明是不可行的慢,我想知道是否有一种聪明的矢量化方式来做到这一点?也许涉及 np 数组?

谢谢

【问题讨论】:

  • 这个平均值是否包括行本身。即它是前 5 分钟的平均值,不包括当前时间戳还是包括它?
  • 最好没有,但往往在每个“窗口”中的子集的大小是如此之大,以至于包括它不会真正影响任何事情

标签: python pandas performance dataframe numpy


【解决方案1】:

将您的时间戳设置为索引并使用 rolling() function。您可以将窗口设置为时间偏移。例如:

# creating the dataset
import numpy as np

np.random.seed(113)

df = pd.DataFrame({'timestamp': pd.date_range('2021-01-01', '2021-01-02', freq='1S'),
                 'value': np.random.randint(1,10,86401)})

# This randomly drops rows to make the dataset fragmented
df = df.drop(np.random.choice(range(1,86401), 85000, replace=False))
df.head(10)
              timestamp  value
0   2021-01-01 00:00:00      6
58  2021-01-01 00:00:58      7
237 2021-01-01 00:03:57      9
390 2021-01-01 00:06:30      7
481 2021-01-01 00:08:01      8
575 2021-01-01 00:09:35      4
580 2021-01-01 00:09:40      9
735 2021-01-01 00:12:15      7
894 2021-01-01 00:14:54      2
927 2021-01-01 00:15:27      5

现在使用 5 分钟窗口的 rolling() 函数。

df['rolling_mean'] = df.set_index('timestamp') \
  .rolling('5T', closed='left')['value'].mean().values

df.head(10)
              timestamp  value  rolling_mean
0   2021-01-01 00:00:00      6           NaN
58  2021-01-01 00:00:58      7      6.000000
237 2021-01-01 00:03:57      9      6.500000
390 2021-01-01 00:06:30      7      9.000000
481 2021-01-01 00:08:01      8      8.000000
575 2021-01-01 00:09:35      4      7.500000
580 2021-01-01 00:09:40      9      6.333333
735 2021-01-01 00:12:15      7      7.000000
894 2021-01-01 00:14:54      2      7.000000
927 2021-01-01 00:15:27      5      4.500000

这应该是前 5 分钟内的平均值,不包括当前时间。

【讨论】:

  • 漂亮,不知道这是一个内置功能。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-10-24
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多