0

我有一个节点集群,每个节点产生大约 200 个关于 CPU/网络/磁盘等性能的统计信息。到目前为止,我已经遍历了各种节点的日志文件,并将它们解析为每个节点的数据帧对象并放入 dict由节点 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 的新手,所以任何提示都会很棒。

4

1 回答 1

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,具体取决于数据量和您最常使用它的方式。

于 2012-12-13T08:30:41.890 回答