如何使用 matplotlib 绘制聚合时间序列数据图表
How to chart aggregated time series data with matplotlib
我有一个错误的 csv 文件,其中包含每个错误发生时间的时间戳。示例数据如下所示
2020-01-06T02:54:01.012+0000, 500 Internal Server Error
2020-01-06T05:04:01.012+0000, 500 Internal Server Error
2020-01-06T05:44:01.012+0000, 500 Internal Server Error
2020-01-06T07:04:01.013+0000, 500 Internal Server Error
2020-01-06T08:04:01.012+0000, 500 Internal Server Error
2020-01-06T10:24:01.010+0000, 500 Internal Server Error
2020-01-06T17:48:31.192+0000, 503 Service Unavailable
2020-01-08T04:35:48.624+0000, 502 Bad Gateway
2020-01-08T16:56:04.814+0000, 503 Service Unavailable
我想使用 matplotlib 显示每分钟(或 30 秒)的错误,每个错误在图表上单独显示一条线。不知道聚合怎么做?这就是我尝试过的。有帮助吗?
import matplotlib.pyplot as plt
import pandas as pd
infile="example.csv"
dateparse = lambda time_str: pd.datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%S.%f')
df = pd.read_csv(infile, parse_dates=['datetime'], date_parser=dateparse, index_col="datetime", names=['datetime','error'])
df.plot()
plt.show()
从定义以下函数开始:
def counts(grp):
codeList = ['500', '502', '503']
return pd.Series([np.count_nonzero(grp.eq(code)) for code in codeList],
index=map(lambda x: 'Err_' + x, codeList))
它将很快应用到对您的重新采样产生的每个组
数据框。
阅读你的文件如下:
df = pd.read_csv('your_log.csv', names=['Date', 'Message'],
skipinitialspace=True, parse_dates=[0])
注意skipinitialspace参数,需要去掉initial space之后
每个逗号(在 date/time 之后)。
然后 运行: df.Date = df.Date.dt.tz_localize(None)
删除时区
结果中的部分 (+0000)。
由于比较完整的字符串很尴尬,我决定只比较错误
代码(每条消息的 3 个初始字符)。为此,让我们创建一个新的
只有错误代码的列:
df['Code'] = df.Message.str.slice(0,3)
下一步是通过重采样在每小时内生成错误数
并将上述函数应用于每个小时组:
errCnt = df.resample('1H', on='Date').Code.apply(counts).unstack(level=1)
如果您需要任何其他时间分辨率,请将 1H 更改为所需的周期。
最后一步是添加 Total 列(如果需要的话):
errCnt['Total'] = errCnt.sum(axis=1)
对于我的示例数据(有更多错误,周期较短),我得到:
Err_500 Err_502 Err_503 Total
Date
2020-01-06 02:00:00 1 0 0 1
2020-01-06 03:00:00 0 0 0 0
2020-01-06 04:00:00 0 0 0 0
2020-01-06 05:00:00 1 2 2 5
2020-01-06 06:00:00 0 0 0 0
2020-01-06 07:00:00 1 0 0 1
2020-01-06 08:00:00 1 0 0 1
我有一个错误的 csv 文件,其中包含每个错误发生时间的时间戳。示例数据如下所示
2020-01-06T02:54:01.012+0000, 500 Internal Server Error
2020-01-06T05:04:01.012+0000, 500 Internal Server Error
2020-01-06T05:44:01.012+0000, 500 Internal Server Error
2020-01-06T07:04:01.013+0000, 500 Internal Server Error
2020-01-06T08:04:01.012+0000, 500 Internal Server Error
2020-01-06T10:24:01.010+0000, 500 Internal Server Error
2020-01-06T17:48:31.192+0000, 503 Service Unavailable
2020-01-08T04:35:48.624+0000, 502 Bad Gateway
2020-01-08T16:56:04.814+0000, 503 Service Unavailable
我想使用 matplotlib 显示每分钟(或 30 秒)的错误,每个错误在图表上单独显示一条线。不知道聚合怎么做?这就是我尝试过的。有帮助吗?
import matplotlib.pyplot as plt
import pandas as pd
infile="example.csv"
dateparse = lambda time_str: pd.datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%S.%f')
df = pd.read_csv(infile, parse_dates=['datetime'], date_parser=dateparse, index_col="datetime", names=['datetime','error'])
df.plot()
plt.show()
从定义以下函数开始:
def counts(grp):
codeList = ['500', '502', '503']
return pd.Series([np.count_nonzero(grp.eq(code)) for code in codeList],
index=map(lambda x: 'Err_' + x, codeList))
它将很快应用到对您的重新采样产生的每个组 数据框。
阅读你的文件如下:
df = pd.read_csv('your_log.csv', names=['Date', 'Message'],
skipinitialspace=True, parse_dates=[0])
注意skipinitialspace参数,需要去掉initial space之后 每个逗号(在 date/time 之后)。
然后 运行: df.Date = df.Date.dt.tz_localize(None)
删除时区
结果中的部分 (+0000)。
由于比较完整的字符串很尴尬,我决定只比较错误 代码(每条消息的 3 个初始字符)。为此,让我们创建一个新的 只有错误代码的列:
df['Code'] = df.Message.str.slice(0,3)
下一步是通过重采样在每小时内生成错误数 并将上述函数应用于每个小时组:
errCnt = df.resample('1H', on='Date').Code.apply(counts).unstack(level=1)
如果您需要任何其他时间分辨率,请将 1H 更改为所需的周期。
最后一步是添加 Total 列(如果需要的话):
errCnt['Total'] = errCnt.sum(axis=1)
对于我的示例数据(有更多错误,周期较短),我得到:
Err_500 Err_502 Err_503 Total
Date
2020-01-06 02:00:00 1 0 0 1
2020-01-06 03:00:00 0 0 0 0
2020-01-06 04:00:00 0 0 0 0
2020-01-06 05:00:00 1 2 2 5
2020-01-06 06:00:00 0 0 0 0
2020-01-06 07:00:00 1 0 0 1
2020-01-06 08:00:00 1 0 0 1