【问题标题】:Count similar events in the previous 7 days统计过去 7 天内的类似事件
【发布时间】:2020-08-27 18:56:15
【问题描述】:

我正在尝试计算过去 7 天的事件重复率。事件由从我的银行帐户中扣除的特定金额定义(参见下面的数据框示例)。我尝试使用各种工具,例如滚动、groupby、resample 等,但无法将它们集成到工作解决方案中。我遇到的两个主要问题:

  1. 仅当金额相等时,我才需要执行 rolling.count()
  2. 我需要一个完整的 7 天窗口,而不是 7 行窗口(有些日子没有交易)

有什么想法吗?我也非常感谢您的解释。谢谢!!

date        description     amount       desired column (amount count in the last 7 days)
9/5/2019    asdkfjlskd      500          1
9/6/2019    dfoais          1200         1
9/7/2019    sadlfuhasd\     -12.99       1
9/8/2019    sdaf            500          2
9/9/2019    sdaf            -267.01      1
9/10/2019   sdaf            -39.11       1 
9/11/2019   sdaf            -18          1
9/11/2019   sdaf            500          3
9/13/2019   sdaf            500          1
9/14/2019   sdaf            -450         1
9/15/2019   sdaf            -140         1 
9/16/2019   sdaf            -6.8         1

【问题讨论】:

    标签: pandas group-by time-series rolling-computation windowing


    【解决方案1】:

    在 pandas 中正确的做法是使用 groupby-rolling,滚动窗口等于 7 天('7D'),就像这样:

    df["date"] = pd.to_datetime(df.date)
    df.set_index("date").groupby("amount").rolling("7D").count()
    

    这会导致:

    amount  date    
    -450.00 2019-09-14  1.0
    -267.01 2019-09-09  1.0
    -140.00 2019-09-15  1.0
    -39.11  2019-09-10  1.0
    -18.00  2019-09-11  1.0
    -12.99  2019-09-07  1.0
    -6.80   2019-09-16  1.0
    500.00  2019-09-05  1.0
            2019-09-08  2.0
            2019-09-11  3.0
            2019-09-13  3.0
    1200.00 2019-09-06  1.0
    

    请注意,此时间范围内的日期与 7 天期限的结束有关。也就是说,在截至 2019-09-13 的 7 天内,您有 3 笔 500 笔交易。

    如果您想将其“展平”回每笔交易的一行:

    tx_count = df.set_index("date").groupby("amount").rolling("7D").count()
    tx_count.columns=["similar_tx_count_prev_7_days"]
    tx_count = tx_count.reset_index()
    tx_count
    

    结果:

             amount date        similar_tx_count_prev_7_days
    0       -450.00 2019-09-14  1.0
    1       -267.01 2019-09-09  1.0
    2       -140.00 2019-09-15  1.0
    3       -39.11  2019-09-10  1.0
    4       -18.00  2019-09-11  1.0
    

    【讨论】:

    • 这太棒了!感谢您的解释。现在如何将其合并到原始数据框?
    【解决方案2】:

    我最终使用了以下方法。效率低吗?

    df3['test']=df3.apply(lambda x : df3[(df3['amount']== x.amount) & (df3['date'] < x.date ) & (df3['date'] >= (x.date-pd.DateOffset(days=7)))]['date'].count(), axis=1)
    

    【讨论】:

    • 我认为它的效率较低,因为您的 lambda 函数的“应用”不使用 pandas 的向量计算能力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2019-02-17
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多