使用Pandas识别并标记供应商的连续发票
供应商发票连续标记实现方案
需求明确
- 单一供应商场景:标记连续的发票为1,非连续为0
- 多供应商补充规则:只要当前行的下一行属于其他供应商,当前行的连续标记必须设为0
实现方案(SQL版本)
假设你的数据集表名为supplier_invoices,包含字段:supplier_id(供应商唯一标识)、invoice_id(发票号)、invoice_date(发票日期,用来判断连续逻辑,要是按发票顺序走就用自增ID)
第一步:关联下一行数据
先按供应商分组、发票日期排序,用窗口函数把下一行的供应商ID和发票日期拉出来:
WITH ranked_invoices AS ( SELECT supplier_id, invoice_id, invoice_date, -- 取当前行的下一行供应商ID LEAD(supplier_id) OVER (ORDER BY supplier_id, invoice_date) AS next_supplier_id, -- 取同一供应商下的下一张发票日期 LEAD(invoice_date) OVER (PARTITION BY supplier_id ORDER BY invoice_date) AS next_invoice_date FROM supplier_invoices )
第二步:生成连续标记
根据规则写CASE逻辑生成is_consecutive字段:
SELECT supplier_id, invoice_id, invoice_date, CASE -- 下一行是其他供应商,直接标记0 WHEN next_supplier_id != supplier_id THEN 0 -- 同一供应商下,下一张发票日期连续(这里按日期差1天算连续,你可以改成发票ID自增1之类的业务规则) WHEN DATEDIFF(next_invoice_date, invoice_date) = 1 THEN 1 -- 其他情况都标记0 ELSE 0 END AS is_consecutive FROM ranked_invoices;
多供应商示例验证
拿实际数据测试下:
原始数据:
| supplier_id | invoice_id | invoice_date |
|---|---|---|
| A | INV001 | 2024-01-01 |
| A | INV002 | 2024-01-02 |
| B | INV003 | 2024-01-01 |
| B | INV004 | 2024-01-03 |
执行SQL后得到的结果:
| supplier_id | invoice_id | invoice_date | is_consecutive |
|---|---|---|---|
| A | INV001 | 2024-01-01 | 1 |
| A | INV002 | 2024-01-02 | 0 |
| B | INV003 | 2024-01-01 | 0 |
| B | INV004 | 2024-01-03 | 0 |
其他实现思路(Python Pandas)
如果用Pandas处理,逻辑和SQL一致:
import pandas as pd # 读取数据集 df = pd.read_csv('supplier_invoices.csv') # 按供应商和发票日期排序 df = df.sort_values(['supplier_id', 'invoice_date']) # 获取下一行的供应商ID和发票日期 df['next_supplier_id'] = df['supplier_id'].shift(-1) df['next_invoice_date'] = df['invoice_date'].shift(-1) # 生成连续标记 df['is_consecutive'] = 0 # 同一供应商且日期连续的标记1 mask_consecutive = (df['supplier_id'] == df['next_supplier_id']) & ((df['next_invoice_date'] - df['invoice_date']).dt.days == 1) df.loc[mask_consecutive, 'is_consecutive'] = 1 # 下一行是其他供应商的强制设为0 mask_new_supplier = df['supplier_id'] != df['next_supplier_id'] df.loc[mask_new_supplier, 'is_consecutive'] = 0
内容的提问来源于stack exchange,提问作者Gustavo A. Marín Acevedo
相关产品推荐
相关产品推荐

