Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于时间和组的滚动条件和 在Python/Pandas中,我有一项显然很难完成的任务。_Python_Pandas_Time Series_Rolling Computation_Cumsum - Fatal编程技术网

基于时间和组的滚动条件和 在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)可能不是唯一的,但是我仍然必须基于数据帧索引来保持订单

我试过:

  • 滚动功能:但不幸的是,我没有固定的窗口大小,也没有唯一的耦合(datetime、product),所以我不能使用datetime作为索引,然后使用
    .Rolling('5分钟')
  • Groupby(product).cumsum()
    :但我无法将总和限制在最后几分钟
  • 可能,我需要一些平滑的,性能水平不太差的东西,以应用于一个相当大的df

    你有什么提示吗

    提前感谢。

    您可以使用,按时间窗口(5分钟=='5T')和:

    我正在添加确切的步骤,看看您是否能找到df的任何差异:

    >>> 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)