【发布时间】:2021-10-11 01:46:27
【问题描述】:
我有一个关于不同时期商品价格的时间序列数据:
import pandas as pd
d = {'ItemID': {0: '1',
1: '1',
2: '1',
3: '1',
4: '1',
5: '1',
6: '1',
7: '1',
8: '1',
9: '1',
10: '1',
11: '2',
12: '2',
13: '2',
14: '2',
15: '2',
16: '2',
17: '2',
18: '2',
19: '2',
20: '2',
21: '2'},
'Period': {0: '1',
1: '1',
2: '1',
3: '1',
4: '1',
5: '1',
6: '2',
7: '2',
8: '2',
9: '2',
10: '2',
11: '1',
12: '1',
13: '1',
14: '1',
15: '1',
16: '2',
17: '2',
18: '2',
19: '2',
20: '2',
21: '2'},
'Price': {0: 1,
1: 2,
2: 1,
3: 2,
4: 2,
5: 3,
6: 6,
7: 6,
8: 7,
9: 7,
10: 8,
11: 50,
12: 49,
13: 50,
14: 49,
15: 48,
16: 61,
17: 62,
18: 63,
19: 64,
20: 64,
21: 65}}
df = pd.DataFrame(d)
我想计算以下关于每件商品和期间的价格变化的统计数据:
- 条纹数
- 最大条纹长度
- 平均条纹长度
从本质上讲,连续是一个非递减值或非递增值的列表。在以下列表 [0,5,4,3,3] 中有 2 个条纹:[0,5] 和 [4,3,3]。
对于上述数据框,正确的输出是:
s = {'ItemID': {0: '1',1: '1', 2: '2', 3: '2'}, 'Period' : {0: '1',1: '2', 2: '1', 3: '2'},
'MaxStreakLength': {0: 4,1: 5, 2: 3, 3: 6},
'AvgStreakLength': {0: 3,1: 3, 2: 2.5, 3: 6},
'NumStreaks':{0: 2,1: 1, 2: 2, 3: 1}}
如何有效地做到这一点?初始数据帧非常大(数百万条记录)
【问题讨论】:
-
如果列表包含
[0, 1, 5, 4, 3, 3]怎么办?在这种情况下,你如何定义条纹? -
@ShubhamSharma 这是两个条纹:一个不减少的 [0,1,5] 和一个不增加的 [4,3,3]。我知道这可能有点惯用 - 5 可以被视为非减少连续的结束和非增加连续的开始。出于实际目的,我会将边框值分配给前面的条纹。
-
给定的解决方案可能适用于您的情况@Nick,因为您有多个条件它会有点冗长
标签: pandas dataframe time-series pandas-groupby