7

私はパンダが初めてで、多次元データを処理する方法を学ぼうとしています。

私のデータ

私のデータが列 ['A'、'B'、'C'、'D'、'E'、'F'、'G'] の大きな CSV であると仮定しましょう。このデータは、いくつかのシミュレーション結果を示しています。['A', 'B', ..., 'F'] はシミュレーション パラメーターで、'G' は出力の 1 つです (この例では既存の出力のみです!)。

編集/更新: Boudがコメントで示唆した ように、私のものと互換性のあるデータを生成しましょう:

import pandas as pd
import itertools
import numpy as np

npData = np.zeros(5000, dtype=[('A','i4'),('B','f4'),('C','i4'), ('D', 'i4'), ('E', 'f4'), ('F', 'i4'), ('G', 'f4')])

A = [0,1,2,3,6] # param A: int
B = [1000.0, 10.000] # param B: float
C = [100,150,200,250,300] # param C: int
D = [10,15,20,25,30] # param D: int
E = [0.1, 0.3] # param E: float
F = [0,1,2,3,4,5,6,7,8,9] # param F = random-seed = int -> 10 runs per scenario

# some beta-distribution parameters for randomizing the results in column "G"
aDistParams = [ (6,1),
                (5,2),
                (4,3),
                (3,4),
                (2,5),
                (1,6),
                (1,7) ]

counter = 0
for i in itertools.product(A,B,C,D,E,F):
    npData[counter]['A'] = i[0]
    npData[counter]['B'] = i[1]
    npData[counter]['C'] = i[2]
    npData[counter]['D'] = i[3]
    npData[counter]['E'] = i[4]
    npData[counter]['F'] = i[5]

    np.random.seed = i[5]
    npData[counter]['G'] = np.random.beta(a=aDistParams[i[0]][0], b=aDistParams[i[0]][1])
    counter += 1

data = pd.DataFrame(npData)
data = data.reindex(np.random.permutation(data.index)) # shuffle rows because my original data doesn't give any guarantees

パラメータ ['A', 'B', ..., 'F'] はデカルト積 (つまり、ネストされた for ループ; アプリオリ) として生成されるため、考えられるそれぞれのシミュレーションを取得するために groupby を使用したいと考えています。出力を分析する前にシナリオ」。

パラメータ 'F' は、各シナリオ ('A'、'B'、...、'E' で定義される各シナリオ; 'F' がランダム シードであると仮定します) の複数の実行を記述するため、私のコードは次のようになります。 :

grouped = data.groupby(['A','B','C','D','E'])
# -> every group defines one simulation scenario

grouped_agg = grouped.agg(({'G' : np.mean}))
# -> the mean of the simulation output in 'G' over 'F' is calculated for each group/scenario

私は今何をしたいですか?

  • I : これらのグループ内の各シナリオ パラメータのすべての (一意の) 値を表示します。 Pythonの数行で一意の値を取得できますが、そのための関数があるかもしれません)

    • 更新:私のアプローチ
    • list(set(grouped_agg.index.get_level_values('A')))(「A」に関心がある場合。一意の値を取得するために set を使用します。高パフォーマンスが必要な場合は、おそらくやりたいことではありません)
    • =>[0, 1, 2, 3, 6]
  • II : いくつかのプロット (より低い次元の) を生成します -> いくつかの変数を一定にし、プロットする前にデータをフィルタリング/選択する必要があります (したがって、必要な手順) =>

    • 'B' 定数
    • 'C'、定数
    • 'E' 定数
    • 'D' = x 軸
    • 'G' = y 軸 / 集計からの出力
    • 'A' = もう 1 つの次元 = 2D プロット内の複数の色 -> 'A' の値ごとに 1 つの G/y 軸

    そのようなプロットをどのように生成しますか?

    データの再形成が重要なステップであり、パンダのプロット機能がそれを処理すると思います。おそらく、5 つの列 (パラメーター A の値ごとに 1 つ) と、各インデックス選択 + パラメーター A 選択に対応する G 値がある形状を達成することで十分ですが、私はまだその形状を達成することができませんでした.

ご意見ありがとうございます。

(私は考えられたキャノピー内でパンダ0.12を使用しています)

サーシャ

4

1 に答える 1

2

I: あなたの例と望ましい出力を理解できたとしても、グループ化が必要な理由がわかりません。

data.A.unique()

II: 更新されました....

上でスケッチした例を実装します。次のように、ランダム シード ('F') に対して 'G' を平均化したとします。

data = data.groupby(['A','B','C','D','E']).agg(({'G' : np.mean})).reset_index()

B、C、および E が指定した定数値を持つ行を選択することから始めます。

df1 = data[(data['B'] == const1) & (data['C'] == const2) & (data['E'] == const3)]

ここで、「G」を「D」の関数として、「A」の値ごとに異なる色でプロットします。

df1.set_index('D').groupby('A')['G'].plot(legend=True)

上記をいくつかのダミーデータでテストしましたが、説明どおりに機能します。各「A」に対応する「G」の範囲は、同じ軸上に異なる色でプロットされています。

III: その幅広い質問にどう答えたらよいかわかりません。

IV: いいえ、それはあなたにとって問題ではないと思います。

よりシンプルで小さなデータ セットで遊んで、パンダに慣れることをお勧めします。

于 2013-11-18T15:01:21.017 に答える