服务访问日志分析
| 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)