我看了看,似乎找不到解决这个问题的办法.我想计算前30天的滚动总和的数据在每个日期的框架-由子组-为一组数据,这不是每天-它的间隔相当不规则.我一直在try 使用ChatGPT,这是在它的扭曲.

最初的建议是,我没有将DATE列转换为DATETIME格式以允许滚动计算,但现在使用以下代码:

import pandas as pd
from datetime import datetime, timedelta
import numpy as np

# Create a dataset with irregularly spaced dates spanning two years
np.random.seed(42)
date_rng = pd.date_range(start='2022-01-01', end='2023-12-31', freq='10D')  # Every 10 days
data = {'Date': np.random.choice(date_rng, size=30),
        'Group': np.random.choice(['A', 'B'], size=30),
        'Value': np.random.randint(1, 30, size=30)}

df = pd.DataFrame(data)

# Sort DataFrame by date
df.sort_values(by='Date', inplace=True)

df['Date'] = pd.to_datetime(df['Date'])

# Calculate cumulative sum by group within the previous 30 days from each day
df['RollingSum_Last30Days'] = df.groupby('Group')['Value'].transform(lambda x: x.rolling(window='30D', min_periods=1).sum())

我收到一个错误:

ValueError: window must be an integer 0 or greater

我在网上发现了关于30D格式是否适用于滚动窗口的相互矛盾的 comments ,但我并不知道如何解决这个问题.如果有任何帮助,我很感激.

在Python3.11.8的VSCode中运行.

推荐答案

如果您需要指定哪个列用作日期,但无法访问日期groupby.transform,则会出现问题.

你可以用groupby.apply:

# Calculate cumulative sum by group within the previous 30 days from each day
df['RollingSum_Last30Days'] = (df.groupby('Group', group_keys=False)
                                 .apply(lambda x: x.rolling(window='30D', on='Date', min_periods=1)['Value'].sum())
                              )

输出:

         Date Group  Value  RollingSum_Last30Days
9  2022-01-11     A     22                   22.0
12 2022-01-11     A     22                   44.0
6  2022-01-21     A      4                   48.0
1  2022-05-21     B     14                   14.0
23 2022-05-21     A      8                    8.0
15 2022-07-20     B     26                   26.0
4  2022-07-20     A     18                   18.0
18 2022-07-30     B     10                   36.0
7  2022-07-30     A      2                   20.0
5  2022-08-19     A      8                   10.0
10 2022-10-18     B     10                   10.0
16 2022-11-17     B     12                   12.0
11 2023-01-06     B      4                    4.0
21 2023-02-15     B     16                   16.0
26 2023-04-06     B     28                   28.0
19 2023-04-26     A      4                    4.0
28 2023-05-16     B      8                    8.0
0  2023-05-26     B      3                   11.0
8  2023-06-05     A      6                    6.0
29 2023-06-25     A     21                   27.0
17 2023-07-25     A      2                    2.0
20 2023-08-04     B     14                   14.0
22 2023-08-14     B     15                   29.0
14 2023-08-14     B     18                   47.0
3  2023-08-24     A      4                    4.0
24 2023-09-03     B     14                   47.0
25 2023-09-03     A     23                   27.0
27 2023-09-03     A     25                   52.0
13 2023-09-23     B     29                   43.0
2  2023-12-12     A     17                   17.0

Python相关问答推荐

三个给定的坐标可以是矩形的点吗

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

将整组数组拆分为最小值与最大值之和的子数组

在Pandas DataFrame操作中用链接替换'方法的更有效方法

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

使用groupby Pandas的一些操作

Python,Fitting into a System of Equations

如果条件不满足,我如何获得掩码的第一个索引并获得None?

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

如何在Polars中从列表中的所有 struct 中 Select 字段?

(Python/Pandas)基于列中非缺失值的子集DataFrame

Flask运行时无法在Python中打印到控制台

Polars map_使用多处理对UDF进行批处理

如何在Gekko中使用分层条件约束

当我定义一个继承的类时,我可以避免使用`metaclass=`吗?

TypeError:';Locator';对象无法在PlayWriter中使用.first()调用

如何在PYTHON中向单元测试S Side_Effect发送额外参数?

时间戳上的SOAP头签名无效

Fake pathlib.使用pyfakefs的类变量中的路径'

跨两个数据帧收集非索引列上的公共组