跳转至

服务访问日志分析

service_id access_time response_time flow_bytes status_code
S001 2025/3/20 10:00 150 512 200
S001 2025/3/20 10:01 80 2048 200
S001 2025/3/20 10:02 600 15000 500
S002 2025/3/20 10:00 300 8000 200
S002 2025/3/20 10:01 -50 1024 abc
S003 2025/3/20 10:00 20 500 200
S003 2025/3/20 10:01 550 12000 500
S003 2025/3/20 10:02 400 8000 200
S001 2025/3/20 10:00 150 512 200
S002 2025/3/20 10:03 220 9000 200
# 某系统产生了大量服务访问日志,使用 Pandas + NumPy 完成数据清洗、统计计算和异常检测,不使用 for 循环遍历行,使用向量化操作。
# ## 任务要求
# ### 数据预处理
# 1. 转换时间字段为标准时间格式,按服务ID+访问时间排序
# 2. 清洗异常数据:响应时间 < 0、状态码非数字、缺失值直接删除
# 3. 对重复日志(服务 ID + 访问时间完全一致)进行去重,保留第一条
# ### 计算(numpy)
# 4. 新增列:响应时间分级:≤100ms = 正常 (0),100~500ms = 缓慢 (1),>500ms = 异常 (2)
# 5. 新增列:访问流量大小分级:流量≤1024 = 小 (0),1024~10240 = 中 (1),>10240 = 大 (2)
# 6. 计算每个服务的累计访问流量(按服务 ID 分组累加)
# ### 分组统计
# 7. 按服务ID分组统计:总访问次数、平均响应时间、最大响应时间、异常访问次数(分级 = 2)
# 8 筛选出平均响应时间 > 200ms 且 异常次数≥1的服务
# ### 结果输出
# 9. 输出清洗后的完整日志(保留关键字段)
# 10. 输出筛选后的服务统计结果

import pandas as pd
import numpy as np

file_path = "source.csv"
df = pd.read_csv(file_path)

# 1. 转换时间字段为标准时间格式,按服务ID+访问时间排序
df["access_time"] = pd.to_datetime(df["access_time"])
df = df.sort_values(by=["service_id", "access_time"])

# 2. 清洗异常数据:响应时间 < 0、状态码非数字、缺失值直接删除
df = df[df["response_time"] >= 0]
df = df[df["status_code"].apply(lambda x: isinstance(x, (int, float)))]
df = df.dropna()

# 3. 对重复日志(服务 ID + 访问时间完全一致)进行去重,保留第一条
df = df.drop_duplicates(subset=["service_id", "access_time"])

# 5. 新增列:响应时间分级:≤100ms = 正常 (0),100~500ms = 缓慢 (1),>500ms = 异常 (2)
df["response_time_level"] = np.where(
    df["response_time"] <= 100, 0, np.where(df["response_time"] <= 500, 1, 2)
)

# 6. 新增列:访问流量大小分级:流量≤1024 = 小 (0),1024~10240 = 中 (1),>10240 = 大 (2)
df["traffic_level"] = np.where(
    df["flow_bytes"] <= 1024, 0, np.where(df["flow_bytes"] <= 10240, 1, 2)
)

# 7. 计算每个服务的累计访问流量(按服务 ID 分组累加)
df["total_traffic"] = df.groupby("service_id")["flow_bytes"].transform("sum")

# 8. 按服务ID分组统计:总访问次数、平均响应时间、最大响应时间、异常访问次数(分级 = 2)
df_grouped = (
    df.groupby("service_id")
    .agg(
        total_access_count=("service_id", "count"),
        average_response_time=("response_time", "mean"),
        max_response_time=("response_time", "max"),
        anomaly_count=("response_time_level", lambda s: (s == 2).sum()),
    )
    .reset_index()
)

# 9 筛选出平均响应时间 > 200ms 且 异常次数≥1的服务
df_filtered = df_grouped[df_grouped["average_response_time"] > 200]

# 10. 输出清洗后的完整日志(保留关键字段)
print(df)

# 11. 输出筛选后的服务统计结果
print(df_filtered)