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

如何自动检测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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:37:37