我的数据集包含以下格式的交易列表:
交易_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 |
让我们看看下面的解决方案
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]