【问题标题】:pandas dict of dataframe values, need graphing suggestion数据框值的熊猫字典,需要图形建议
【发布时间】:2012-11-30 21:07:29
【问题描述】:

我有一个节点集群,每个节点产生大约 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 的新手,所以任何提示都会很棒。

【问题讨论】:

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

标签: matplotlib pandas


【解决方案1】:

我认为最好的方法是将所有数据帧合并在一起,然后你可以使用所有不错的 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,具体取决于数据量和您最常使用的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2016-10-17
    相关资源
    最近更新 更多