python - 一段时间内的累积总和
问题描述
我的数据框具有以下结构:
date_today = dt.datetime.now()
size=20
df = pd.DataFrame({"usd": pd.Series(np.random.randint(1,100,size))*10,
"sent": dt.datetime.now(),
"temp":np.random.randint(0,15, size=size)
})
df.sent += df.temp.map(dt.timedelta)
df.temp = np.random.randint(10,25, size=size)
df["reminder"] = df.sent + df.temp.map(dt.timedelta)
df.temp = np.random.randint(1,65, size=size)
df["completed"] = df.reminder + df.temp.map(dt.timedelta)
df.loc[df['temp']%3 == 0, ['reminder']] = [""]
df.loc[df['temp']%2 == 0, ['completed']] = [""]
df=df[["usd", "sent", "reminder", "completed"]]
usd 是我请求的钱(数字),其他列是日期时间(当我请求时,当我发送提醒时,以及当我收到钱时;最后两个可以为空)。我还创建了以下每个季度的列表:
date_index = []
previous_date=""
for m in range(0,14):
month = (m%12)+1
year = m//12
current_date = dt.date(2019+year, month, 1)
if previous_date:
timedelta = current_date-previous_date
date_index.append(previous_date+1*timedelta/4)
date_index.append(previous_date+2*timedelta/4)
date_index.append(previous_date+3*timedelta/4)
date_index.append(current_date)
previous_date = current_date
我想获得具有以下结构的数据框:
df_result = pd.DataFrame(columns=["date","sent_amount","reminder_amount","completed_amount"])
其中 df_result.date 列是前一点的 date_index 序列,sent_amount 是 df.sent 列 < df_result.date 的记录的 df.amount 列的总和,reminder_amount 是 df.amount 列的总和,其中 df.sent 列是 df.amount 列的总和。提醒栏是 < df_result.date。我可以通过循环来实现它,但我很想学习如何让我的代码更苗条。如果您对随机数据框创建或每个季度的列表有任何建议,我们也非常欢迎。
解决方案
您可以melt
将 DataFrame,cut
日期转换为从 开始的日期范围date_index
,然后按变量(已完成/提醒/发送)+日期的组合进行分组,sum
增加usd
金额,然后将其解压成列并cumsum
获得累积总和:
x = df.melt('usd', value_name='date')
x['date'] = pd.cut(x['date'], pd.to_datetime(date_index)).apply(lambda x: x.right)
x['variable'] += '_amount'
df_result = x.dropna().groupby(['variable', 'date'])['usd'].sum().unstack(0, 0).sort_index().cumsum()
print(df_result)
输出:
variable completed_amount reminder_amount sent_amount
date
2019-03-16 0 0 3180
2019-03-24 0 0 8840
2019-04-01 0 1700 10350
2019-04-08 0 3230 10350
2019-04-16 0 6200 10350
2019-04-23 320 6860 10350
2019-05-01 1170 6860 10350
2019-05-16 2300 6860 10350
2019-06-01 5130 6860 10350
2019-06-08 5710 6860 10350
推荐阅读
- opencv - OpenCV 文本检测
- django - Django url前缀关联
- android - 未解决的参考:requireLensFacing | 安卓工作室
- java - 获取 Firestore 中已删除文档的 ID
- django - 重定向后Django表单不可见
- javascript - 如何在 javascript 中从 jsx 表单创建键值数组?
- reactjs - 如果之前的访问来自另一个网站,则使用 react-router 返回
- nginx - 如果 URI 有斜杠,Nginx proxy_cache 未命中
- python - Seaborn:将显示栏颜色更改为特定颜色?
- java - 如何确保通过 java.net.Socket 的 TCP 传输成功?