【问题标题】:Rolling sum for a window of 2 days2天窗口的滚动总和
【发布时间】:2020-05-14 09:03:35
【问题描述】:

我正在尝试使用 trans_date 和使用 python 对下表中按 ID 分组的金额列计算滚动 2 天。

<table><tbody><tr><th>ID</th><th>Trans_Date</th><th>Trans_Time</th><th>Amount</th><th> </th></tr><tr><td>1</td><td>03/23/2019</td><td>06:51:03</td><td>100</td><td> </td></tr><tr><td>1</td><td>03/24/2019</td><td>12:32:48</td><td>600</td><td> </td></tr><tr><td>1</td><td>03/24/2019</td><td>14:15:35</td><td>50</td><td> </td></tr><tr><td>1</td><td>06/05/2019</td><td>16:18:21</td><td>75</td><td> </td></tr><tr><td>2</td><td>02/01/2019</td><td>18:02:52</td><td>200</td><td> </td></tr><tr><td>2</td><td>02/02/2019</td><td>10:03:02</td><td>150</td><td> </td></tr><tr><td>2</td><td>02/03/2019</td><td>23:47:51</td><td>800</td><td> </td></tr><tr><td>3</td><td>01/18/2019</td><td>11:12:58</td><td>1000</td><td> </td></tr><tr><td>3</td><td>01/23/2019</td><td>22:12:41</td><td>15</td><td> </td></tr></tbody></table>

最终,我正在尝试使用

来实现以下结果

<table><tbody><tr><th>ID</th><th>Trans_Date</th><th>Trans_Time</th><th>Amount</th><th>2d_Running_Total</th><th> </th></tr><tr><td>1</td><td>03/23/2019</td><td>06:51:03</td><td>100</td><td>100</td><td> </td></tr><tr><td>1</td><td>03/24/2019</td><td>12:32:48</td><td>600</td><td>700</td><td> </td></tr><tr><td>1</td><td>03/24/2019</td><td>14:15:35</td><td>250</td><td>950</td><td> </td></tr><tr><td>1</td><td>06/05/2019</td><td>16:18:21</td><td>75</td><td>75</td><td> </td></tr><tr><td>2</td><td>02/01/2019</td><td>18:02:52</td><td>200</td><td>200</td><td> </td></tr><tr><td>2</td><td>02/02/2019</td><td>10:03:02</td><td>150</td><td>350</td><td> </td></tr><tr><td>2</td><td>02/03/2019</td><td>23:47:51</td><td>800</td><td>950</td><td> </td></tr><tr><td>3</td><td>01/18/2019</td><td>11:12:58</td><td>1000</td><td>1000</td><td> </td></tr><tr><td>3</td><td>01/23/2019</td><td>22:12:41</td><td>15</td><td>15</td><td> </td></tr></tbody></table>

这个超链接非常接近解决这个问题,但问题是对于同一天有多个交易的记录,它为同一天提供了相同的值。 https://python-forum.io/Thread-Rolling-sum-for-a-window-of-2-days-Pandas

【问题讨论】:

  • 用于 HTML 表格数据的努力,但可能更容易遵循 this 创建复制/粘贴的熊猫示例。我之前问过一个类似的问题(也许是一样的?),你可以在这里查看:stackoverflow.com/questions/54357758/…——在 QI 中要求一个一般的“基于索引的限制”,但我的用例也是一个时间索引。跨度>
  • 感谢反馈,我同意将来使用 create copy/pastable pandas 会更容易。感谢您指出这一点。

标签: python pandas rolling-computation


【解决方案1】:

应该这样做:

import pandas as pd

# create dummy data
df = pd.DataFrame(
    columns = ['ID', 'Trans_Date', 'Trans_Time', 'Amount'],
    data = [
        [1, '03/23/2019', '06:51:03', 100],
        [1, '03/24/2019', '12:32:48', 600],
        [1, '03/24/2019', '14:15:35', 250],
        [1, '06/05/2019', '16:18:21', 75],
        [2, '02/01/2019', '18:02:52', 200],
        [2, '02/02/2019', '10:03:02', 150],
        [2, '02/03/2019', '23:47:51', 800],
        [3, '01/18/2019', '11:12:58', 1000],
        [3, '01/23/2019', '22:12:41', 15]
    ]
)

df_out = pd.DataFrame(
    columns = ['ID', 'Trans_Date', 'Trans_Time', 'Amount', '2d_Running_Total'],
    data = [
        [1, '03/23/2019', '06:51:03', 100, 100],
        [1, '03/24/2019', '12:32:48', 600, 700],
        [1, '03/24/2019', '14:15:35', 250, 950],
        [1, '06/05/2019', '16:18:21', 75, 75],
        [2, '02/01/2019', '18:02:52', 200, 200],
        [2, '02/02/2019', '10:03:02', 150, 350],
        [2, '02/03/2019', '23:47:51', 800, 950],
        [3, '01/18/2019', '11:12:58', 1000, 1000]
    ]
)

# convert into datetime object and set as index
df['Trans_DateTime'] = pd.to_datetime(df['Trans_Date'] + ' ' + df['Trans_Time'])
df = df.set_index('Trans_DateTime')

# group by ID and apply rolling window to the amount column
df['2d_Running_Total'] = df.groupby('ID')['Amount'].rolling('2d').sum().values.astype(int)
df.reset_index(drop=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2021-05-12
    • 2010-10-18
    • 1970-01-01
    • 2022-01-23
    • 2021-07-08
    • 1970-01-01
    相关资源
    最近更新 更多