コンテンツにスキップ

データの構造をたどる

前のページではspn.kaguya.esa1.energy_fluxを直接呼びました。このページでは、知らないデータに出会ったときに どの変数があり、読むと何が返るかを、データを読む前に確かめる方法を扱います。

属性をたどってもファイルは読まない

spn.kaguya、spn.kaguya.esa1、spn.kaguya.esa1.energy_fluxは、どれもデータの場所を表すオブジェクトです。 属性を取り出しただけでは、ダウンロード・デコード・計算は起きません。 実際の処理はload()、plot()、compute()などのメソッドを呼んだときに始まります。

import sopran as spn

kg = spn.kaguya          # ミッション
kg.esa1                  # 機器
kg.esa1.energy_flux      # 物理量(エンドポイント)

変数を表す末端のオブジェクトを、このドキュメントではエンドポイントと呼びます。

読む前に確かめる

どの階層でもinfo()で短い説明を表示できます。エンドポイントでは、さらに次のメソッドが使えます。

ep = spn.kaguya.esa1.energy_flux
time = spn.day("2008-02-01")

ep.info()       # 説明、次元、単位、別名
ep.schema()     # 次元・単位・座標系の機械可読な定義
ep.plan(time)   # 読み込みに必要な元ファイルの一覧
ep.guide()      # 機器の詳しい説明(Markdown)。英語版は guide(language="en")
ep.example()    # その場で試せるコード例

info()の出力は次のようになります。

KAGUYA.ESA1.energy_flux
description: KAGUYA PACE ESA1 differential electron energy flux derived from counts with PACE INFO calibration tables.
dims: ('time', 'energy', 'look')
units: eV/(cm^2 s sr eV)
aliases: eflux, differential_energy_flux
example: kg.esa1.energy_flux.load(time)

dimsは配列の次元です。PACEのlookは検出器の視線方向の番号で、方向そのものではありません。 aliasesは同じ変数の別名で、kg.esa1.efluxでも同じエンドポイントに届きます。 全変数の次元と単位はスキーマに一覧があります。

読み込むと何が返るか

エンドポイントのload()は、変数1つ分のSopranArrayを返します。 機器のload()は、同じ時刻に測った複数の変数をまとめたオブジェクトを返します。

flux = spn.kaguya.esa1.energy_flux.load(time)   # SopranArray
esa1 = spn.kaguya.esa1.load(time)               # 機器単位の読み込み結果

esa1.counts          # SopranArray
esa1.energy_flux     # SopranArray
esa1.to_xarray()     # 全変数を持つ xarray.Dataset

SopranArrayは、用途に合わせて別のライブラリの型へ変換できます。

使いたいもの 呼び出し
xarray flux.to_xarray()、またはflux.xrで中身のDataArrayを直接
Polars flux.to_polars()
pandas flux.to_pandas()

3次元以上の配列をPolarsへ変換すると、既定では時刻ごとに1行を作り、残りの次元を配列型の列に入れます。 全次元を展開した縦長の表が必要なときはlayout="long"を指定します。 詳しくは読み込んだ配列を扱うを参照してください。

元ファイルと元の観測ビンへ戻る

校正やビンの組み直しを経た値だけでは、解析の妥当性を確かめられないことがあります。 SOPRANの読み込み結果は、出典の元ファイルと、デコード直後の記録を保持しています。

esa1.files           # 読み込んだ元ファイルのパス
esa1.pace            # デコード直後のヘッダーと記録の配列(ファイルが無ければ None)

元ファイルを直接デコードしたいときは、sopran.missions.kaguya.read_pace_pbf(files)を使います。

文字列のIDから読む

スクリプトやバッチ処理では、属性のパスを文字列で渡すこともできます。

counts = spn.load("kaguya.esa1.counts", time)   # spn.kaguya.esa1.counts.load(time) と同じ

IDの先頭には登録済みのデータ源(kaguya、artemis、omni、moon)を書きます。

次に読む

同じ期間を何度も指定するのが面倒になったら、解析条件を残すへ進んでください。