優れたpandas
パッケージを使用して、さまざまな気象診断データを大量に処理していますが、データをつなぎ合わせると、すぐにディメンションが不足します。ドキュメントを見ると、を使用するMultiIndex
と問題が解決する可能性がありますが、それを自分の状況に適用する方法がわかりません-ドキュメントには、ランダムなデータとDataFrame
sを使用してマルチインデックスを作成する例が示されていますが、既存のシリーズは示されていません時系列データ。
バックグラウンド
私が使用している基本的なデータ構造には、2つの主要なフィールドが含まれています。
metadata
、これは、数値が何であるかを説明するキーと値のペアで構成される辞書です。data
、これは番号自体を含むパンダのデータ構造です。
最小公分母は時系列データであるため、基本構造にはパンダSeries
オブジェクトがdata
エントリとして含まれ、metadata
フィールドにはそれらの数値が実際に何であるかが示されます(たとえば、東太平洋上の10メートルの風のベクトルRMSエラー、24時間の予測実験テスト1)。
私は、その最小公分母を採用し、さまざまな時系列を結合して、結果をより有用にし、簡単な組み合わせを可能にすることを検討しています。たとえば、すべての異なるリードタイムを確認したい場合があります-リードタイム(実験、地域など)を除いて同じメタデータエントリを共有する時系列を取得し、新しいオブジェクトを返すフィルタールーチンがあります。フィールドはmetadata
一般的なエントリのみで構成され(つまりLead Time
、削除されています)、フィールドは値で指定された列ラベルをdata
持つパンダになります。これをもう一度拡張して、結果のフレームを取得し、パンダを与えるために変化する別のエントリ(たとえば)と一緒にグループ化することができますDataFrame
Lead Time
Experiment
Panel
。アイテムインデックスがExperiment
構成フレームからのメタデータ値によって与えられ、オブジェクトの新しいメタデータにLead Time
またはが含まれていないエントリの場合Experiment
。
これらの複合オブジェクトを反復処理するiterseries
と、フレームのiterframes
ルーチンとパネルのルーチンがあり、1つのディメンションを削除するときに、適切なメタデータ/データのペアを再構築します(つまり、列全体でリードタイムが変化するフレームからのシリーズにはすべてが含まれます親のメタデータと、Lead Time
列ラベルから取得した値で復元されたフィールド)。これはうまくいきます。
問題
dropna
ディメンションが不足し(Panelで最大3D)、Panelですべてが整列された後、空の列を削除するなどの方法も使用できません(これにより、要約統計量をプロットするときにいくつかのバグが発生しました)。より高次元のデータでパンダを使用することについて読むことは、MultiIndex
とその使用について読むことにつながりました。ドキュメントに記載されている例を試しましたが、それを自分の状況に適用する方法がまだ少しわかりません。どんな方向でも役に立ちます。次のことができるようになりたい:
- 私の
Series
ベースのデータを任意の数の次元に沿ってマルチインデックスに結合しますDataFrame
(これは素晴らしいことです-シリーズからフレームを作成するための1つの呼び出しを排除し、次にフレームからパネルを作成するための別の呼び出しを排除します) - 結果のマルチインデックスを繰り返し
DataFrame
、単一のディメンションを削除して、コンポーネントのメタデータをリセットできるようにします。
編集-コードサンプルを追加
以下のWesMcKinneyの答えは、ほぼ正確に私が必要としているものです。問題は、要素のグループ化を開始した後、操作する必要のあるシリーズベースのストレージオブジェクトからDataFrameベースのオブジェクトへの最初の変換にあります。Data-Frame-backedクラスには、シリーズベースのオブジェクトのリストと列間で変化するメタデータフィールドを取り込む次のメソッドがあります。
@classmethod
def from_list(cls, results_list, column_key):
"""
Populate object from a list of results that all share the metadata except
for the field `column_key`.
"""
# Need two copies of the input results - one for building the object
# data and one for building the object metadata
for_data, for_metadata = itertools.tee(results_list)
self = cls()
self.column_key = column_key
self.metadata = next(for_metadata).metadata.copy()
if column_key in self.metadata:
del self.metadata[column_key]
self.data = pandas.DataFrame(dict(((transform(r[column_key]), r.data)
for r in for_data)))
return self
このルーチンで指定されたフレームを取得したら、以下に示すさまざまな操作を簡単に適用できます。特定のユーティリティは、names
呼び出し時にフィールドを使用できます。concat
これにより、列キーの名前が保存されるため、内部に保存する必要がなくなります。そのインデックスディメンションの名前としてMultiIndexにあります。
以下のソリューションを実装して、一致するシリーズベースのクラスのリストとキーのリストを取得し、グループ化を順番に実行できるようにしたいと思います。ただし、列が何を表すかは事前にわかりません。そのため、次のようにします。
- シリーズデータを1-DDataFrameに保存することは私には本当に意味がありません
- 最初のシリーズ->フレームグループ化からインデックスと列の名前を設定する方法がわかりません