Groupby 按条件过滤的滚动计数

问题描述 投票:0回答:1

我的数据集包含以下格式的交易列表:

交易_ID 卡号 交易日期时间 金额 商店
1 123 2023-06-24 12:20:24 100.0 A
2 456 2023-08-27 23:12:00 250.0 B
3 123 2023-09-02 09:00:03 416.12 A
4 123 2023-09-02 10:30:03 6580.0 C

我通过在线研究创建了一个函数,该函数计算每笔交易,该卡在特定时间范围内(例如过去一小时、三天或六个月)进行了多少笔交易:

def rolling_count(df, freq):
    return (df.set_index(transaction_datetime)
            .groupby("card_number")["card_number"]
            .rolling(freq, closed="left")
            .count()
            .fillna(0)
            .values

然后我使用这样的函数:

df["number_transactions_lastday"] = rolling_count(df, "1D")

我现在需要创建其他也考虑到商店的功能。因此,不要计算过去使用该卡进行的所有交易,而是只计算在同一家商店进行的交易。

我在网上看到了很多关于如何向此类操作添加一些条件的示例,但没有一个解决方案适用于我的案例。

如何在数据框中添加一个新列,在检查商店是否相同的同时进行滚动计数?

示例:

输入:

df["number_tr_store_last6m"] = rolling_count_store(df, "180D") # so 6 months

预期产出表:

交易_ID 卡号 交易日期时间 金额 商店 number_tr_store_last6m
1 123 2023-06-24 12:20:24 100.0 A 0
2 456 2023-08-27 23:12:00 250.0 B 0
3 123 2023-09-02 09:00:03 416.12 A 1
4 123 2023-09-02 10:30:03 6580.0 C 0
python-3.x pandas group-by rolling-computation
1个回答
0
投票

让我们看看下面的解决方案

import pandas as pd
from datetime import timedelta


data = {
    "transaction_ID": [1, 2, 3, 4],
    "card_number": [123, 456, 123, 123],
    "transaction_datetime": [
        "2023-06-24 12:20:24",
        "2023-08-27 23:12:00",
        "2023-09-02 09:00:03",
        "2023-09-02 10:30:03",
    ],
    "amount": [100.0, 250.0, 416.12, 6580.0],
    "store": ["A", "B", "A", "C"],
}

df = pd.DataFrame(data)
df["transaction_datetime"] = pd.to_datetime(
    df["transaction_datetime"], format="%Y/%m/%d %H:%M:%S"
)


def calculate_num_tr_store(row, days, df):
    start_date = row["transaction_datetime"] - timedelta(days=days)
    return len(
        df[
            (df["transaction_datetime"] > start_date)
            & (df["transaction_datetime"] < row["transaction_datetime"])
            & (df["store"] == row["store"])
        ].index
    )


df["number_tr_store_last6m"] = df.apply(calculate_num_tr_store, days=180, df=df, axis=1)
print(df)

输出:

transaction_ID  card_number  ... store  number_tr_store_last6m
0               1          123  ...     A                       0
1               2          456  ...     B                       0
2               3          123  ...     A                       1
3               4          123  ...     C                       0

[4 rows x 6 columns]
© www.soinside.com 2019 - 2024. All rights reserved.