如何在Python中按时间粒度统计CPU均值上下记录数并可视化
解决方案
一、Pandas数据处理方案
假设你的数据已加载为df,包含timestamp(时间戳列)和avg_cpu(CPU使用率列),先确保时间戳为datetime类型:
import pandas as pd df['timestamp'] = pd.to_datetime(df['timestamp'])
1. 按粒度统计高于/低于均值的记录数
小时粒度统计
# 给每条数据匹配对应小时的均值,并标记是否高于均值 hourly_groups = df.groupby(df['timestamp'].dt.floor('H'))['avg_cpu'] df['hourly_mean'] = hourly_groups.transform('mean') df['above_hourly_mean'] = df['avg_cpu'] > df['hourly_mean'] # 统计每小时的高低均值记录数 hourly_stats = df.groupby(df['timestamp'].dt.floor('H')).agg( 高于均值记录数=('above_hourly_mean', 'sum'), 低于均值记录数=('above_hourly_mean', lambda x: len(x)-x.sum()), 小时均值=('avg_cpu', 'mean') ).reset_index()
日粒度统计
# 给每条数据匹配对应日期的均值,并标记是否高于均值 daily_groups = df.groupby(df['timestamp'].dt.date)['avg_cpu'] df['daily_mean'] = daily_groups.transform('mean') df['above_daily_mean'] = df['avg_cpu'] > df['daily_mean'] # 统计每日的高低均值记录数 daily_stats = df.groupby(df['timestamp'].dt.date).agg( 高于均值记录数=('above_daily_mean', 'sum'), 低于均值记录数=('above_daily_mean', lambda x: len(x)-x.sum()), 日均值=('avg_cpu', 'mean') ).reset_index()
二、可视化方案(Matplotlib+Seaborn)
Output1:1月21日每小时CPU使用率+当日均值线
import matplotlib.pyplot as plt import seaborn as sns # 筛选1月21日数据并按小时聚合均值 target_date = pd.to_datetime('2024-01-21').date() jan21_data = df[df['timestamp'].dt.date == target_date] jan21_hourly = jan21_data.groupby(jan21_data['timestamp'].dt.hour)['avg_cpu'].mean().reset_index() jan21_daily_mean = jan21_data['avg_cpu'].mean() # 绘图 plt.figure(figsize=(12,6)) sns.barplot(x='timestamp', y='avg_cpu', data=jan21_hourly, palette='Blues') plt.axhline(y=jan21_daily_mean, color='red', linestyle='--', label=f'当日均值: {jan21_daily_mean:.2f}%') plt.title('1月21日每小时CPU使用率') plt.xlabel('小时') plt.ylabel('平均CPU使用率(%)') plt.legend() plt.xticks(rotation=0) plt.tight_layout() plt.show()
Output2:1月每日CPU使用率+当月均值线
# 聚合1月每日平均CPU使用率 jan_daily = df.groupby(df['timestamp'].dt.date)['avg_cpu'].mean().reset_index() jan_monthly_mean = df['avg_cpu'].mean() # 绘图 plt.figure(figsize=(14,6)) sns.lineplot(x='timestamp', y='avg_cpu', data=jan_daily, marker='o', linewidth=2, color='blue') plt.axhline(y=jan_monthly_mean, color='red', linestyle='--', label=f'当月均值: {jan_monthly_mean:.2f}%') plt.title('1月每日CPU使用率') plt.xlabel('日期') plt.ylabel('平均CPU使用率(%)') plt.legend() plt.xticks(rotation=45) plt.tight_layout() plt.show()
可选交互式方案(Plotly)
如果需要交互式图表,可替换为Plotly,以Output1为例:
import plotly.express as px fig = px.bar(jan21_hourly, x='timestamp', y='avg_cpu', title='1月21日每小时CPU使用率') fig.add_hline(y=jan21_daily_mean, line_dash='dash', line_color='red', annotation_text=f'当日均值: {jan21_daily_mean:.2f}%') fig.show()
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

