【发布时间】:2020-11-17 00:39:48
【问题描述】:
我已经将一些日志数据聚合成一个简单的 CSV 格式,这本质上是 API 调用。每个令牌都有一个限制/配额,有时我会收到增加配额或限制的请求。我希望能够直观地查看流量吞吐量,以了解每种 API 调用的吞吐量和所有 API 调用的总吞吐量。
我玩过 pandas 中的数据,并且可以在表格样式结构中获取它,该结构对每秒的 api 调用计数进行分组。
token
api timestamp
ActivateAPI 2020-07-13 14:09:30 1
2020-07-13 14:09:31 2
SuspendAPI 2020-07-13 14:09:23 1
2020-07-13 14:09:31 2
2020-07-13 14:09:32 2
TerminateAPI 2020-07-13 14:09:29 2
2020-07-13 14:09:39 1
2020-07-13 14:09:49 1
我也使用过 matplotlib 示例,因此了解如何制作堆叠面积图的概念
但是,在我的一生中,我似乎无法将我的数据框映射到堆叠区域图表中,该图表将提供沿底部(x 轴)的时间视图,并向上计数左侧(y 轴),然后每个区域堆栈代表一个 API。下面是我的代码,它执行数据框并手动制作堆叠图表,但需要帮助才能从我的数据框中获取图表,以便我可以为任何网络服务器日志生成图表
import matplotlib.pyplot as plt
import pandas as pd
from io import StringIO
date_format = "%m.%d.%Y %H:%M:%S,%f"
data = """timestamp~api~token
07.13.2020 14:09:23,928~SuspendAPI~TOKEN1
07.13.2020 14:09:29,324~TerminateAPI~TOKEN1
07.13.2020 14:09:29,424~TerminateAPI~TOKEN1
07.13.2020 14:09:30,678~ActivateAPI~TOKEN1
07.13.2020 14:09:31,678~ActivateAPI~TOKEN1
07.13.2020 14:09:31,886~SuspendAPI~TOKEN1
07.13.2020 14:09:31,886~SuspendAPI~TOKEN1
07.13.2020 14:09:31,978~ActivateAPI~TOKEN1
07.13.2020 14:09:32,786~SuspendAPI~TOKEN1
07.13.2020 14:09:32,886~SuspendAPI~TOKEN1
07.13.2020 14:09:39,324~TerminateAPI~TOKEN1
07.13.2020 14:09:49,324~TerminateAPI~TOKEN1"""
df = pd.read_csv(StringIO(data), sep='~')
df['timestamp'] = pd.to_datetime(df['timestamp'], format=date_format)
df.timestamp = df.timestamp.map(lambda x: x.replace(microsecond=0))
df.set_index('timestamp', inplace=True)
grouped = df.groupby([df.api, df.index]).count()
print(grouped)
x = range(1, 6)
y = [[1, 4, 6, 4, 1], [2, 2, 7, 5, 4], [2, 8, 5, 1, 6]]
# Basic stacked area chart.
plt.stackplot(x, y, labels=['ActivateAPI', 'SuspendAPI', 'TerminateAPI'])
plt.legend(loc='upper left')
plt.show()
【问题讨论】:
-
我有一种感觉,我可能需要更多地使用 pandas,也许还需要使用 daterange 和 fill 来为每个 api 每秒创建一个数据点,将窗口中任何缺失的时间帧的计数设置为 0。所以我现在正在玩这个
-
df.groupby(['timestamp','api']).size().unstack('api', fill_value=0).plot.area()? -
效果很好,我现在只需要了解它是如何工作的,随时发布它作为我可以接受的答案。
标签: python pandas matplotlib