You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

支付数据模式识别需求:识别特定周期性支付规律

Got it, let's work through how to identify these two payment patterns effectively. I’ll break down actionable steps and code examples to make this concrete.


1. 识别连续等额支付模式

核心思路

要满足至少连续3个月支付金额相同,且中间不能有断档(比如month4无支付,month5就算金额和之前一样也不算连续)。关键是要同时跟踪两个维度:月份的连续性、金额的一致性。

实现步骤(以Python Pandas为例)

首先确保数据按月份排序,然后通过遍历判断连续状态:

import pandas as pd

# 假设你的支付数据结构如下(示例)
payment_data = pd.DataFrame({
    'month': [1, 2, 3, 5, 6, 7, 9],
    'amount': [150, 150, 150, 150, 150, 150, 200]
})

# 第一步:按月份排序,确保时间顺序正确
sorted_data = payment_data.sort_values('month').reset_index(drop=True)

# 计算月份间隔,检查是否连续
sorted_data['month_gap'] = sorted_data['month'].diff().fillna(1)
sorted_data['consecutive_streak'] = 1

# 遍历累加连续等额支付的次数
for i in range(1, len(sorted_data)):
    # 当月和上月是连续月份,且金额相等时,延续 streak
    if sorted_data.loc[i, 'month_gap'] == 1 and sorted_data.loc[i, 'amount'] == sorted_data.loc[i-1, 'amount']:
        sorted_data.loc[i, 'consecutive_streak'] = sorted_data.loc[i-1, 'consecutive_streak'] + 1
    else:
        # 断档或金额变化,重置 streak
        sorted_data.loc[i, 'consecutive_streak'] = 1

# 标记符合条件的记录(连续≥3个月)
sorted_data['is_consecutive_equal'] = sorted_data['consecutive_streak'] >= 3

关键说明

  • 这段代码会自动忽略断档的情况:比如示例中month4缺失,所以month5的150不会和month3的150算连续,直到month5-7形成新的连续3个月。
  • 如果实际场景中金额允许微小误差(比如手续费导致的几分钱差异),可以把金额相等的判断改成abs(sorted_data.loc[i, 'amount'] - sorted_data.loc[i-1, 'amount']) < 0.01。

2. 识别每三个月一次的周期性支付模式

核心思路

这类模式要求支付行为每3个月重复一次,且至少需要出现3次(比如month1→month4→month7)才能确认是周期性,而非偶然。同样需要结合时间间隔和金额一致性(通常周期性支付金额固定)。

实现步骤(以Python Pandas为例)

# 沿用上面的sorted_data,新增季度支付示例数据
sorted_data = pd.concat([sorted_data, pd.DataFrame({'month': [1,4,7], 'amount': [300,300,300]})]).sort_values('month').reset_index(drop=True)

sorted_data['is_quarterly_cycle'] = False

# 遍历每条记录,检查是否存在前两次的3个月间隔匹配
for idx, row in sorted_data.iterrows():
    # 计算当前记录往前推3个月、6个月的目标月份
    target_months = [row['month'] - 3, row['month'] - 6]
    # 查找这两个月份中金额相同的记录
    matches = sorted_data[(sorted_data['month'].isin(target_months)) & (sorted_data['amount'] == row['amount'])]
    # 如果两次匹配都存在,说明形成了完整的季度周期
    if len(matches) == 2:
        # 标记当前记录和匹配的历史记录
        sorted_data.loc[idx, 'is_quarterly_cycle'] = True
        for match_idx in matches.index:
            sorted_data.loc[match_idx, 'is_quarterly_cycle'] = True

关键说明

  • 这段代码支持任意起始月份的季度周期(比如month2→month5→month8,而非仅自然季度)。
  • 如果业务允许周期内金额有小幅波动,同样可以用误差阈值替代严格相等的判断。

额外建议

  • 预处理时务必清理重复的月份记录,避免干扰连续 streak 的计算。
  • 对于缺失的月份,可以考虑用pd.date_range生成完整的月份序列,填充无支付的记录为0或NaN,这样能更清晰地判断断档情况。

内容的提问来源于stack exchange,提问作者Grigorij Abramov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:10:35