19

pandas をメインの Trace (MCMC のパラメーター空間の一連のポイント) オブジェクトとして使用したいと考えています。

パンダに保存したい文字列->配列の辞書のリストがあります。辞書内のキーは常に同じであり、キーごとに numpy 配列の形状は常に同じですが、形状はキーごとに異なる場合があり、次元数が異なる場合があります。

私はこれを使用していましたがself.append(dict_list, ignore_index = True)、1d 値に対してはうまくいくようですが、nd>1 値の場合、pandas は値をオブジェクトとして格納するため、適切なプロットやその他の優れた処理ができません。より良い動作を取得する方法について何か提案はありますか?

サンプルデータ

point = {'x': array(-0.47652306228698005),
         'y': array([[-0.41809043],
                     [ 0.48407823]])}

points = 10 * [ point]

次のようなことができるようになりたいです

df = DataFrame(points)

また

df = DataFrame()
df.append(points, ignore_index=True)

そして持っている

>> df['x'][1].shape
()
>> df['y'][1].shape 
(2,1)
4

3 に答える 3

12

比較的新しいライブラリxray [1] にはDataset、ユーザーのDataArray要求を正確に実行する構造が含まれています。

ここに、 IPythonセッションとして書かれた、あなたの問題に対する私の見解があります:

>>> import numpy as np
>>> import xray

>>> ## Prepare data:
>>> #
>>> point = {'x': np.array(-0.47652306228698005),
...          'y': np.array([[-0.41809043],
...                      [ 0.48407823]])}
>>> points = 10 * [point]

>>> ## Convert to Xray DataArrays:
>>> #
>>> list_x = [p['x'] for p in points]
>>> list_y = [p['y'] for p in points]
>>> da_x = xray.DataArray(list_x, [('x', range(len(list_x)))])
>>> da_y = xray.DataArray(list_y, [
...     ('x', range(len(list_y))),
...     ('y0', range(2)), 
...     ('y1', [0]), 
... ])

これらは、DataArrayこれまでに作成した 2 つのインスタンスです。

>>> print(da_x)
<xray.DataArray (x: 10)>
array([-0.47652306, -0.47652306, -0.47652306, -0.47652306, -0.47652306,
       -0.47652306, -0.47652306, -0.47652306, -0.47652306, -0.47652306])
Coordinates:
  * x        (x) int32 0 1 2 3 4 5 6 7 8 9


>>> print(da_y.T) ## Transposed, to save lines.
<xray.DataArray (y1: 1, y0: 2, x: 10)>
array([[[-0.41809043, -0.41809043, -0.41809043, -0.41809043, -0.41809043,
         -0.41809043, -0.41809043, -0.41809043, -0.41809043, -0.41809043],
        [ 0.48407823,  0.48407823,  0.48407823,  0.48407823,  0.48407823,
          0.48407823,  0.48407823,  0.48407823,  0.48407823,  0.48407823]]])
Coordinates:
  * x        (x) int32 0 1 2 3 4 5 6 7 8 9
  * y0       (y0) int32 0 1
  * y1       (y1) int32 0

DataArrayこれら 2 つを共通xの次元で にマージできるようになりましたDataSet

>>> ds = xray.Dataset({'X':da_x, 'Y':da_y})
>>> print(ds)
<xray.Dataset>
Dimensions:  (x: 10, y0: 2, y1: 1)
Coordinates:
  * x        (x) int32 0 1 2 3 4 5 6 7 8 9
  * y0       (y0) int32 0 1
  * y1       (y1) int32 0
Data variables:
    X        (x) float64 -0.4765 -0.4765 -0.4765 -0.4765 -0.4765 -0.4765 -0.4765 ...
    Y        (x, y0, y1) float64 -0.4181 0.4841 -0.4181 0.4841 -0.4181 0.4841 -0.4181 ...

そして最終的に、あなたが望む方法でデータにアクセスして集計することができます:

>>> ds['X'].sum()
<xray.DataArray 'X' ()>
array(-4.765230622869801)


>>> ds['Y'].sum()
<xray.DataArray 'Y' ()>
array(0.659878)


>>> ds['Y'].sum(axis=1)
<xray.DataArray 'Y' (x: 10, y1: 1)>
array([[ 0.0659878],
       [ 0.0659878],
       [ 0.0659878],
       [ 0.0659878],
       [ 0.0659878],
       [ 0.0659878],
       [ 0.0659878],
       [ 0.0659878],
       [ 0.0659878],
       [ 0.0659878]])
Coordinates:
  * x        (x) int32 0 1 2 3 4 5 6 7 8 9
  * y1       (y1) int32 0

>>> np.all(ds['Y'].sum(axis=1) == ds['Y'].sum(dim='y0'))
True

>>>> ds['X'].sum(dim='y0')
Traceback (most recent call last):
ValueError: 'y0' not found in array dimensions ('x',)

[1] pandas が 2D で行うように、ラベル付きの N 次元データを処理するためのライブラリ: http://xray.readthedocs.org/en/stable/data-structures.html#dataset

于 2015-05-06T17:42:48.607 に答える