0

それぞれがCPU /ネットワーク/ディスクなどのパフォーマンスに関する約200の統計を生成するノードのクラスターがあります。これまで、さまざまなノードのログファイルをループし、それらをノードごとのデータフレームオブジェクトに解析し、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が得られます。パンダの組み込み機能を使用した基本的なプロット関数は、次のように単純にすることができます。

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 に答える