【问题标题】:How to do a rolling aggregation of data week wise in python?如何在 python 中进行数据周的滚动聚合?
【发布时间】:2015-04-09 17:33:23
【问题描述】:

我有一个数据集,其结构是:日期 利润

数据集的一个样本是:

   Date     Profit
2013-06-21   14
2013-06-22   19
2013-06-23   11
2013-06-24   13
2013-06-25   6
2013-06-26   22
2013-06-27   22
2013-06-28   3
2013-06-29   5
2013-06-30   10
2013-07-01   17
2013-07-02   14
2013-07-03   9
2013-07-04   7

Sample input 是:

data = [('2013-06-21',14),
    ('2013-06-22',19),
    ('2013-06-23',11),
    ('2013-06-24',13),
    ('2013-06-25',6),
    ('2013-06-26',22),
    ('2013-06-27',22),
    ('2013-06-28',3),
    ('2013-06-29',5),
    ('2013-06-30',10),
    ('2013-07-01',17),
    ('2013-07-02',14),
    ('2013-07-03',9),
    ('2013-07-04',7)]

现在我想做一个rolling aggregation 并存储聚合。通过滚动聚合,我的意思是说第 1 周(2013 年 6 月 21 日至 2013 年 6 月 27 日)我想添加上一个日期的利润并将其与当前日期一起存储。所以对于2013-06-21,总和将是14,因为它是一周的第一天,但​​对于2013-06-22,它应该是previous date (2013-06-21)current date (2013-06-22) 的总和,并且应该与当前日期一起存储。这将持续到周末,然后在下周它将再次重新开始,新的一周没有之前的日期。所以第一周sample output 应该是这样的:

 Date     Profit
2013-06-21   14
2013-06-22   33  #(14 + 19)
2013-06-23   44  #(33 + 11)
2013-06-24   57  #(44 + 13) 
2013-06-25   63  #(57 + 6)
2013-06-26   85  #(63 + 22)
2013-06-27   107 #(85 + 22)

我尝试查看defaultdict 并这样做了:

def aggregate(data, key, value, func):
    measures_dict = collections.defaultdict(list)
    for k,v in zip(data[key], data[value]):
        measures_dict[k].append(v)

return [(k,func(measures_dict[k])) for k in measures_dict.keys()] 

但我没有得到结果,并认为defaultdict 不是正确的方法。我还查看了pandas,但我无法找到开始执行此操作的方法。谁能帮我做这个滚动聚合?

【问题讨论】:

  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的编码人员编写代码,但他们通常只有在发布者已经尝试自己解决问题时才会提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出和您实际获得的输出(控制台输出、堆栈跟踪、编译器错误 - 不管是什么适用的)。您提供的详细信息越多,您可能收到的答案就越多。
  • 另外,一周的定义是什么?是星期一还是星期天是一周的开始?
  • 这个数据是什么格式的?排序了吗?日期是否已经解析为对象,还是只是字符串?
  • @MartijnPieters 我是 python 新手,所以我无法继续使用任何方法。一周的开始不是由星期一或任何其他日期定义的。它实际上定义了一个开始日期。日期也是简单的字符串
  • @MartijnPieters 我确实试图查看defaultdict 的详细信息,但无法了解如何在我的案例中使用它

标签: python pandas aggregation itertools


【解决方案1】:

看到这个答案: Cumulative sum and percentage on column?

还有这个: http://pandas.pydata.org/pandas-docs/stable/basics.html#basics-dt-accessors 和这个: http://pandas.pydata.org/pandas-docs/stable/groupby.html

每周累积更新:

df = pd.DataFrame(data)
df.columns = ['Date','Profit']
df['Date'] = pd.to_datetime(df['Date'])
df['weekofyear'] = df['Date'].dt.weekofyear
df.reset_index('Date')
df.sort_index(inplace=True)
df['Weekly_Cum'] = df.groupby('weekofyear').cumsum()

输出:

         Date  Profit  weekofyear  Weekly_Cum
0  2013-06-21      14          25          14
1  2013-06-22      19          25          33
2  2013-06-23      11          25          44
3  2013-06-24      13          26          13
4  2013-06-25       6          26          19
5  2013-06-26      22          26          41
6  2013-06-27      22          26          63
7  2013-06-28       3          26          66
8  2013-06-29       5          26          71
9  2013-06-30      10          26          81
10 2013-07-01      17          27          17
11 2013-07-02      14          27          31
12 2013-07-03       9          27          40
13 2013-07-04       7          27          47

【讨论】:

  • 我想每周做滚动总和。因此,对于 2013-06-21 到 2013-06-27 的那一周,会有一个滚动总和,但从 2013-06-28 开始,它应该从新开始,而不是考虑 2013-06-27 的先前值
  • @JasonDonnald:也许是documentation can help here
  • @JasonDonnald 刚刚更新了每周累积。我确实通读了原始 cmets 并且我认为您可以先进行更多搜索,但是您确实发布了代码来创建我很欣赏的 df。而且我喜欢解决我在自己的工作中不会遇到的假网点问题。
【解决方案2】:

只是对@liam-foley 答案中的一个小修复:

df['year'] = df.index.year
df['weekofyear'] = df.index.weekofyear
df['Weekly_Cum'] = df.groupby(['year', 'weekofyear']).cumsum()

否则 cumsum 将计算索引中所有年份的同一工作日。

【讨论】:

    猜你喜欢
    • 2018-10-24
    • 1970-01-01
    • 2020-04-20
    • 2021-10-01
    • 2017-03-26
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多