2012-12-13 58 views
0

我有一个节点集群,其中每个节点产生大约200个关于CPU /网络/磁盘性能的统计信息。到目前为止,我已经遍历了各种节点的日志文件并解析它们成每个节点的数据帧的对象并投入通过节点ID键控一个字典:熊猫字典的数据帧值,需要图形建议

(此处的第一列是数据帧的索引标签)

{ '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

从各种示例中,我可以设法创建条形图。将统计信息名称更改为列而不是索引,后来只允许选择统计信息与参数匹配的那些行。还将该节点值添加为列。将所有节点的数据框放入更大的列表中。最后做数据透视表并将枢轴放入一个数据框中,并以bar模式绘制数据框,以创建必要的图形。 –

回答

3

我认为最好的方法是将所有的数据框合并在一起,然后你可以使用所有漂亮的熊猫函数来分割和混合你想要的任何东西。

让我们先创建一些示例数据:

# 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应该是类似的字典。我将它们合并是这样的:

# 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') 

这给你一个包含所有数据一个不错的单数据帧,采用熊猫内建功能的基本绘图功能可以很简单的:

def plotstat(df, stat): 
    return df.xs(stat, axis=1, level=1).plot(kind='bar', title=stat) 

plotstat(dfall, 'Avg IPC (w/ idle)') 

其中给出:

enter image description here


你当然可以ü根据数据量和最常用的方式,堆叠/取消堆叠以构建DataFrame有点不同。

+0

太好了,谢谢你的建议,我现在就试试。 –