我有一个节点集群,每个节点产生大约200个关于CPU /网络/磁盘等性能的统计信息。到目前为止,我已经通过各种节点的日志文件循环并将它们解析为每个节点的数据帧对象并放入进入由节点ID键入的字典:
(这里第一列是DataFrame的索引标签)
{ 'node00':
<DaFrame-display-begin>
core 0 core 1 core 2 core 3 group 0
Avg IPC (w/ idle) 0.09 0.12 0.06 0.06 0.08
Avg CPI (w/ idle) 11.17 8.03 15.62 16.97 12.95
Avg IPC (w/o idle) 0.48 0.78 0.64 0.63 0.63
Avg CPI (w/o idle) 2.10 1.28 1.56 1.59 1.63
User IPC (w/o idle) 0.70 1.02 0.85 0.84 0.85
........................................
,
'node01':
<DataFrame-display-begin>
Avg IPC (w/ idle) 0.05 0.12 0.06 0.06 0.08
Avg CPI (w/ idle) 9.17 8.03 15.62 16.97 12.95
Avg IPC (w/o idle) 0.48 0.78 0.64 0.63 0.63
Avg CPI (w/o idle) 2.10 1.28 1.56 1.59 1.63
User IPC (w/o idle) 0.70 1.02 0.85 0.84 0.85
}
我计划编写一个通用函数,它将统计信息的名称作为参数,然后在集群中的所有节点上绘制特定统计信息的条形图。不同芯的条可以堆叠或并排。但是x轴将需要点作为节点以便于比较。
有什么建议吗?我是Pandas / matplotlib的新手,所以任何提示都会很棒。
答案 0 :(得分:3)
我认为最好的方法是将所有数据帧合并在一起,然后你可以使用所有不错的Panda函数来切片和混合匹配,无论如何。
让我们先创建一些样本数据:
# node1
index = ['Avg IPC (w/ idle)', 'Avg CPI (w/ idle)', 'Avg IPC (w/o idle)', 'Avg CPI (w/o idle)', 'User IPC (w/o idle)']
core0 = [0.09, 11.17, 0.48, 2.10, 0.70]
core1 = [0.12, 8.03, 0.78, 1.28, 1.02]
core2 = [0.06, 15.62, 0.64, 1.56, 0.85]
core3 = [0.06, 16.97, 0.63, 1.59, 0.84]
group = [0.08, 12.95, 0.63, 1.63, 0.85]
data = {'core0': core0, 'core1': core1, 'core2': core2, 'core3': core3, 'group': group}
node01 = pd.DataFrame(data, index=index)
# node2
index = ['Avg IPC (w/ idle)', 'Avg CPI (w/ idle)', 'Avg IPC (w/o idle)', 'Avg CPI (w/o idle)', 'User IPC (w/o idle)']
core0 = [0.33, 11.17, 0.48, 2.10, 0.70]
core1 = [0.12, 8.99, 0.78, 1.28, 1.02]
core2 = [0.06, 15.62, 0.64, 1.56, 9.99]
core3 = [0.06, 16.99, 9.99, 1.59, 0.84]
group = [0.08, 12.95, 0.63, 9.99, 0.85]
data = {'core0': core0, 'core1': core1, 'core2': core2, 'core3': core3, 'group': group}
node02 = pd.DataFrame(data, index=index)
alldfs = {'node01': node01, 'node02': node02}
alldfs应该与你的dict类似。我会像这样合并它们:
# create 1 DataFrame
dfall = pd.concat(alldfs)
# name the levels for easy access
dfall.index.names = ['node','stat']
dfall.columns.name = 'core'
# pivot the 'stat' layer to the columns so only the nodes are on the index
dfall = dfall.unstack('stat')
这为您提供了一个包含所有数据的单个DataFrame,使用Pandas内置功能的基本绘图功能可以简单如下:
def plotstat(df, stat):
return df.xs(stat, axis=1, level=1).plot(kind='bar', title=stat)
plotstat(dfall, 'Avg IPC (w/ idle)')
给出了:
你当然可以使用stack / unstack来构建你的DataFrame,这取决于数据量和你最常使用它的方式。