如何自动检测Pandas DataFrame中的设备拆装异常序列号
检测设备拆装数据中的异常序列号
首先整理你的数据集为可运行代码:
import pandas as pd id = ['A','A','A','A'] date = ['2022-01-01','2022-01-02','2022-01-03','2022-01-04'] serial_on=['A','C','D','D'] serial_off=['B','A','C','Z'] df= pd.DataFrame({'id':id,'date':date,'serial_on':serial_on,'serial_off':serial_off})
数据规则明确:每条记录代表当日拆除serial_off设备、安装serial_on设备;正常逻辑是安装新设备前必须先拆除当前运行的设备,你的目标是找出像D这样未被拆除就重复安装的异常序列号。
下面提供两种实现方式,其中包含你提到的图论方法:
方法1:状态追踪法(轻量高效)
核心是跟踪每个设备ID下当前运行的序列号,逐行校验操作是否符合规则:
# 先按设备ID和日期排序,确保操作顺序正确 df = df.sort_values(by=['id', 'date']).reset_index(drop=True) # 存储每个设备当前运行的序列号 current_running = {} anomaly_records = [] for _, row in df.iterrows(): dev_id = row['id'] install = row['serial_on'] remove = row['serial_off'] # 初始化设备的初始状态 if dev_id not in current_running: current_running[dev_id] = None # 异常判断:要安装的序列号正是当前运行的,且本次没有拆除它 if install == current_running[dev_id] and remove != install: anomaly_records.append({ '设备ID': dev_id, '日期': row['date'], '异常序列号': install, '原因': f"序列号{install}未被拆除就重复安装" }) # 更新当前运行的序列号:拆除旧设备后,新安装的设备成为当前运行项 current_running[dev_id] = install # 输出异常结果 print(pd.DataFrame(anomaly_records))
运行后会得到预期的异常记录:
设备ID 日期 异常序列号 原因 0 A 2022-01-04 D 序列号D未被拆除就重复安装
方法2:图论方法(适配复杂场景)
把拆装操作建模为有向图,适合后续扩展分析复杂的拆装网络冲突:
- 节点:设备序列号
- 有向边:从
serial_off指向serial_on,代表“拆除off后安装on”的操作
实现代码:
import networkx as nx # 按设备ID分组处理 grouped_df = df.groupby('id') anomaly_records = [] for dev_id, group in grouped_df: # 确保组内操作按日期排序 sorted_group = group.sort_values('date').reset_index(drop=True) # 初始化有向图 install_graph = nx.DiGraph() # 跟踪当前运行的序列号 active_serial = None for _, row in sorted_group.iterrows(): install = row['serial_on'] remove = row['serial_off'] # 添加拆装操作的边,附带日期属性 install_graph.add_edge(remove, install, date=row['date']) # 异常检测逻辑和状态追踪法一致 if active_serial == install and remove != install: anomaly_records.append({ '设备ID': dev_id, '日期': row['date'], '异常序列号': install, '原因': f"序列号{install}未被拆除就重复安装" }) # 更新当前活跃的序列号 active_serial = install # 输出异常结果 print(pd.DataFrame(anomaly_records))
这种图结构可以进一步扩展,比如分析整个设备网络中的循环拆装、跨设备的序列号冲突等复杂问题。
内容的提问来源于stack exchange,提问作者stat_man
相关产品推荐
相关产品推荐

