gpt4 book ai didi

python - Pandas - Resample/GroupBy DateTime Index 并执行计算

转载 作者:太空宇宙 更新时间:2023-11-04 00:17:53 24 4
gpt4 key购买 nike

我会尽力解释我需要帮助的地方。我有以下 df(如果不是数百万行,也有数千行)带有日期时间索引,如下例所示:

INDEX                   COL A       COL B
2018-05-07 21:53:13.731 0.365127 9391.800000
2018-05-07 21:53:16.201 0.666127 9391.800000
2018-05-07 21:53:18.038 0.143104 9391.800000
2018-05-07 21:53:18.243 0.025643 9391.800000
2018-05-07 21:53:18.265 0.640484 9391.800000
2018-05-07 21:53:18.906 -0.100000 9391.793421
2018-05-07 21:53:19.829 0.559516 9391.800000
2018-05-07 21:53:19.846 0.100000 9391.800000
2018-05-07 21:53:19.870 0.006560 9391.800000
2018-05-07 21:53:20.734 0.666076 9391.800000
2018-05-07 21:53:20.775 0.666076 9391.800000
2018-05-07 21:53:28.607 0.100000 9391.800000
2018-05-07 21:53:28.610 0.041991 9391.800000
2018-05-07 21:53:29.283 -0.053518 9391.793421
2018-05-07 21:53:47.322 -0.046302 9391.793421
2018-05-07 21:53:49.182 0.100000 9391.800000

我想做的是以 5 秒为间隔对行进行分组,并在每 5 秒间隔/子集上执行(有时是复杂的)计算。

例如,我想计算每 5 秒 block 内 A 列中正值与负值的百分比。

2018-05-07 21:53:102018-05-07 21:53:15 只包含一行,A 列是正数,所以我将使用 100% 创建一个新的 C 列。

类似地 2018-05-07 21:53:152018-05-07 21:53:20 在 A 列中有 8 行,其中 7 行是正数其中 1 项为阴性。所以 C 列将是 87.5%

我会发布示例代码,但我真的不确定执行此操作的最佳方法。示例输出(新 df)可能类似于下面的内容,其中 COL D 只是该 5 秒分组的 COL B 中的最小数字:

INDEX               COL C     COL D (MIN)
2018-05-07 21:53:10 100% 9391.800000
2018-05-07 21:53:15 12.5% 9391.793421
2018-05-07 21:53:20 100% 9391.800000
2018-05-07 21:53:25 66.7% 9391.793421
2018-05-07 21:53:30 nan nan
2018-05-07 21:53:35 nan nan
2018-05-07 21:53:40 nan nan
2018-05-07 21:53:45 100% 9391.793421

请记住,我想对每个分组进行许多不同的计算。因此使用内置的 .sum().mean().agg() 等不足以进行更复杂的计算。

感谢任何帮助,如果需要,我很乐意澄清问题。

最佳答案

我认为需要正值的百分比需要值的平均值 >0 :

df = df.resample('5S').agg({'COL A': lambda x: (x > 0).mean() * 100, 'COL B': 'min'})
print (df)
COL A COL B
INDEX
2018-05-07 21:53:10 100.000000 9391.800000
2018-05-07 21:53:15 87.500000 9391.793421
2018-05-07 21:53:20 100.000000 9391.800000
2018-05-07 21:53:25 66.666667 9391.793421
2018-05-07 21:53:30 NaN NaN
2018-05-07 21:53:35 NaN NaN
2018-05-07 21:53:40 NaN NaN
2018-05-07 21:53:45 50.000000 9391.793421

负值的百分比需要 <0 的平均值:

df = df.resample('5S').agg({'COL A': lambda x: (x < 0).mean() * 100, 'COL B': 'min'})
print (df)
COL A COL B
INDEX
2018-05-07 21:53:10 0.000000 9391.800000
2018-05-07 21:53:15 12.500000 9391.793421
2018-05-07 21:53:20 0.000000 9391.800000
2018-05-07 21:53:25 33.333333 9391.793421
2018-05-07 21:53:30 NaN NaN
2018-05-07 21:53:35 NaN NaN
2018-05-07 21:53:40 NaN NaN
2018-05-07 21:53:45 50.000000 9391.793421

正如@Alexander 指出的那样 0既不是积极的也不是消极的。所以最好在计数之前将其删除:

df = df.resample('5S').agg({'COL A': lambda x: (x[x.ne(0)] > 0).mean() * 100, 'COL B': 'min'})

关于python - Pandas - Resample/GroupBy DateTime Index 并执行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50246105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com