基于时间和组的滚动条件和 在Python/Pandas中,我有一项显然很难完成的任务。
我有这样一个数据帧:基于时间和组的滚动条件和 在Python/Pandas中,我有一项显然很难完成的任务。,python,pandas,time-series,rolling-computation,cumsum,Python,Pandas,Time Series,Rolling Computation,Cumsum,我有这样一个数据帧: | DATETIME | PRODUCT | AMOUNT | 我需要为每种产品(我有两种以上的产品)生成最后一列,其中包含过去5分钟内(比如说售出产品)的累计金额。请参见以下示例: | DATETIME | PRODUCT | AMOUNT | CUM SUM | | 2020-01-01 17:10:00 | A | 20 | 20 -> 20 | | 2020-01-01 17:12:
| DATETIME | PRODUCT | AMOUNT |
我需要为每种产品(我有两种以上的产品)生成最后一列,其中包含过去5分钟内(比如说售出产品)的累计金额。请参见以下示例:
| DATETIME | PRODUCT | AMOUNT | CUM SUM |
| 2020-01-01 17:10:00 | A | 20 | 20 -> 20 |
| 2020-01-01 17:12:00 | B | 30 | 30 -> 30 |
| 2020-01-01 17:13:00 | A | 10 | 20+10 -> 30 |
| 2020-01-01 17:13:00 | A | 15 | 20+10+15 -> 45 |
| 2020-01-01 17:16:00 | B | 10 | 30+10 -> 40 |
| 2020-01-01 17:17:00 | A | 15 | 10+15+15 -> 40 |
| 2020-01-01 17:20:00 | B | 20 | 10+20 -> 30 |
| 2020-01-01 17:20:00 | B | 10 | 10+20+10 -> 40 |
| 2020-01-01 17:25:00 | A | 10 | 10 -> 10 |
请注意,couples(datetime,product)可能不是唯一的,但是我仍然必须基于数据帧索引来保持订单
我试过:
.Rolling('5分钟')
Groupby(product).cumsum()
:但我无法将总和限制在最后几分钟>>> from io import StringIO
>>> df = pd.read_csv(StringIO("""
DATETIME PRODUCT AMOUNT
2020-01-01 17:10:00 A 20
2020-01-01 17:12:00 B 30
2020-01-01 17:13:00 A 10
2020-01-01 17:13:00 A 15
2020-01-01 17:16:00 B 10
2020-01-01 17:17:00 A 15
2020-01-01 17:20:00 B 20
2020-01-01 17:20:00 B 10
2020-01-01 17:25:00 A 10"""), sep=r'\s\s+')
>>> df['DATETIME'] = pd.to_datetime(df['DATETIME'])
>>> df
DATETIME PRODUCT AMOUNT
0 2020-01-01 17:10:00 A 20
1 2020-01-01 17:12:00 B 30
2 2020-01-01 17:13:00 A 10
3 2020-01-01 17:13:00 A 15
4 2020-01-01 17:16:00 B 10
5 2020-01-01 17:17:00 A 15
6 2020-01-01 17:20:00 B 20
7 2020-01-01 17:20:00 B 10
8 2020-01-01 17:25:00 A 10
>>> df['CUM SUM'] = (df.set_index('DATETIME')
.groupby('PRODUCT')
.apply(lambda x: x.rolling('5T').sum()
).values)
>>> df
DATETIME PRODUCT AMOUNT CUM SUM
0 2020-01-01 17:10:00 A 20 20.0
1 2020-01-01 17:12:00 B 30 30.0
2 2020-01-01 17:13:00 A 10 30.0
3 2020-01-01 17:13:00 A 15 45.0
4 2020-01-01 17:16:00 B 10 40.0
5 2020-01-01 17:17:00 A 15 40.0
6 2020-01-01 17:20:00 B 20 30.0
7 2020-01-01 17:20:00 B 10 40.0
8 2020-01-01 17:25:00 A 10 10.0
我注意到我错过了值后面的右括号,已修复
编辑
这适用于熊猫1.2.0,也适用于熊猫1.0.5:
>>> df['CUM SUM'] = (df.set_index('DATETIME')
.groupby('AMOUNT')
.apply(lambda x: x.rolling('5T').sum().reset_index(drop=True))
.values)
你能不能先重新采样(5分钟)然后滚动?@DanailPetrov谢谢,但我需要一个移动窗口,而不是固定的时间步长。我想这非常接近我需要的,但会出现“ValueError:无法从重复轴重新编制索引”我想在原始数据框中,您的索引已经设置为
DATETIME
,在这种情况下,您不需要结尾处的.values
部分,也不需要.set\u index('DATETIME')
部分。不,DATETIME
只是一列。我还尝试了我的示例dataframe,但出现了相同的错误(推断.values
之前的括号),您是否只尝试运行右侧?我的意思是不给数据框赋值?如果是,这是否也会产生错误?最后一个(对于1.0.5
)与行不正确匹配,因为右侧是按PRODUCT
分组的,并且在重置索引后仍保持分组状态。无论如何,在更新到1.2.0
之后,您提出的第一个建议似乎终于奏效了!非常感谢。
>>> df['CUM SUM'] = (df.set_index('DATETIME')
.groupby('AMOUNT')
.apply(lambda x: x.rolling('5T').sum().reset_index(drop=True))
.values)