0

私はパンダを見ましたが、私の目的には使いにくいかもしれません。おそらくそこにpythonツールキットがあり、私は知りません。以下のような状況に簡単に対処できるパッケージを教えてください。

特定の日付の 0、6、12、...、96 時間にサンプリングされた気象変数 (地理的領域) の瞬時値の一連の 2D numpy 配列があります。

私はそれをpython辞書として持っています:

values[0]:[[3, 2,...,9, 5][6, 7, ..., 6, 7]]
...
...
values[96]:[[2, 2,...,8, 5][6, 7, ..., 5, 6]]

構成可能な集計ステップで平均化する必要があります。たとえば、24 時間の集計ステップの場合、4 つの毎日の平均を取得します。

values_avg24h=average(values, aggr_step=24)
values_avg24h[24]=[[...][...]]
values_avg24h[48]=[[...][...]]
values_avg24h[72]=[[...][...]]
values_avg24h[96]=[[...][...]]

時間分解能は変更できます。また、元の値も同様に平均化できますが、異なる集計ステップで行うことができます。特定の既存のパッケージがそのすべてを解決する可能性があります。とにかく、この単純な問題に対する賢明な解決策でさえ感謝されます。

4

2 に答える 2

2

データが定期的な頻度でサンプリングされている場合(投稿が示しているようです)、pandas確かに役立ちます。

考えられる解決策の 1 つは、 (辞書のキーなど)が class であるオブジェクトpandasを作成することです。との要素は、numpy 配列の行と列になります。これは少し奇妙に聞こえるので、簡単な例を示します。Panelitemspandas.tseries.index.DatetimeIndexmajor_axisminor_axisPanel

>>> import pandas as pd
>>> import numpy as np
>>> start_date = '4/14/2013'  # Start today (default time is midnight)

# create the date_range we will use as panel items
>>> ind = pd.date_range(start=start_date, periods=20, freq='6H')

# Create data: thanks @mtadd
>>> values = {h:np.array([np.random.random_integers(1,10,5) for _ in 'x'*2])
              for h in np.r_[0:120:6]}

# Create the Panel object directly from the dict of 2D np.arrays
>>> my_panel = pd.Panel(values)

# Set the Panel's items to be the date_range we made earlier
>>> my_panel.items = ind

>>> my_panel.ix[0]  # Show first 2D array of data
        0   1   2   3  4
     0  4   3  10   6  6
     1  4  10   7  10  6
>>> values[0]  # Same as above, but from the dict
    array([[ 4,  3, 10,  6,  6],
           [ 4, 10,  7, 10,  6]])

セットアップが完了したので、Panelメソッドを使用しresampleます。2 つの引数を指定します。1 つ目は、データを配置する新しい周波数で、2 つ目はhowとして指定するキーワード引数ですmeanこれが私の答えの主要部分です!

>>> averaged = my_panel.resample('24H', how='mean')
>>> list(averaged.items)  # Show new time stamps for data
    [<Timestamp: 2013-04-14 00:00:00>,
     <Timestamp: 2013-04-15 00:00:00>,
     <Timestamp: 2013-04-16 00:00:00>,
     <Timestamp: 2013-04-17 00:00:00>,
     <Timestamp: 2013-04-18 00:00:00>]

'24H'メソッドに指定したパラメーターはresample、OA によって投稿された例の単なる拡張であることに注意してください。この引数が取り得る記述のタイプの詳細については、このリンクを参照してください。

平均が正しく計算されたことを確認するために、最初の項目をaveraged Panel手動で計算した平均と比較します。

>>> averaged.ix[0]
         0     1     2     3     4
    0  6.5  5.25  7.25  6.25  6.50
    1  5.0  6.75  5.25  6.50  5.25

>>> (values[0] + values[6] + values[12] + values[18]) / 4.
    array([[ 6.5 ,  5.25,  7.25,  6.25,  6.5 ],
           [ 5.  ,  6.75,  5.25,  6.5 ,  5.25]])

itemsオブジェクトを渡すと、タイム スタンプをより柔軟に設定できますdatetime.datetime。たとえば、元日の午後 1 時 37 分にサンプリングを開始し、50 期間にわたってサンプリングを継続した場合、次のようにすることができます。

>>> from datetime import datetime
>>> start = datetime(2013, 1, 1, 13, 37)  # 1:37 on 1/1/2013
>>> ind = pd.date_range(start, periods=50, freq='6H')

その後、以前と同じように続行します。生成する期間の数の代わりに、開始項目と終了項目を date_range に渡すこともできます。上記と同じ開始時刻から 2 月 28 日の午前 4 時 50 分まで 2 時間半ごとにデータを収集した場合、次のことができます。

>>> end = datetime(2013, 2, 28, 4, 50)  # 4:50 AM on 2/28/2013
>>> ind = pd.date_range(start, freq='2H 30MIN')

Panel渡された頻度と完全に一致する開始時刻と終了時刻を渡す必要がないことに注意してください。オブジェクトまたは時系列データの操作方法の詳細についてはpandas、それらの単語に記載されているリンクを確認してください。

于 2013-04-15T07:41:35.907 に答える
2
import numpy as np

def average(values, aggr_step=24):
    keys = np.array(values.keys())
    bins = range(aggr_step,1+keys.max(),aggr_step)
    npd = np.digitize(keys,bins)
    return {b:np.mean(np.r_[[values[k] for k in keys[npd==i]]],axis=0)
            for i,b in enumerate(bins)}

いくつかのサンプル値を作成し、テストします。

values = {h:np.array([np.random.random_integers(1,10,5) for _ in 'x'*2])
          for h in np.r_[0:100:6]}

{0: array([[ 1,  2, 10,  8,  7],
       [10,  1,  8,  2,  5]]),
 6: array([[ 7, 10,  7,  6,  4],
       [ 9,  4,  6,  1,  1]]),
 12: array([[ 7, 10, 10,  5,  4],
       [ 7,  6,  2,  6,  7]]),
 18: array([[9, 9, 8, 5, 8],
       [8, 9, 6, 1, 2]]),
 24: array([[8, 1, 5, 9, 7],
       [1, 1, 6, 8, 3]]),
 30: array([[ 7,  2,  8,  3,  4],
       [ 5, 10,  5,  6,  5]]),
 36: array([[ 6,  5,  9,  4,  5],
       [ 6, 10,  8, 10, 10]]),
 42: array([[ 2,  2,  6,  6,  9],
       [ 5,  7,  4,  8, 10]]),
 48: array([[10,  1,  1,  1,  8],
       [ 5,  6,  4,  5,  8]]),
 54: array([[ 6,  2,  6,  6,  6],
       [10,  6,  9,  4,  8]]),
 60: array([[ 6,  8,  2,  1,  7],
       [ 1, 10, 10,  2,  3]]),
 66: array([[4, 8, 7, 1, 3],
       [1, 3, 8, 4, 2]]),
 72: array([[ 8,  9,  8,  6,  7],
       [ 1,  4,  2, 10,  1]]),
 78: array([[ 2,  1,  3,  8,  9],
       [ 2,  8,  6, 10,  3]]),
 84: array([[ 1,  8,  9,  4,  3],
       [ 9, 10,  8,  3,  4]]),
 90: array([[ 4,  4,  2,  8,  6],
       [ 1,  3, 10,  2,  6]]),
 96: array([[ 9,  9,  8,  4,  4],
       [ 2,  8, 10,  3,  5]])}

average(values,24)

{24: array([[ 6.  ,  7.75,  8.75,  6.  ,  5.75],
       [ 8.5 ,  5.  ,  5.5 ,  2.5 ,  3.75]]),
 48: array([[ 5.75,  2.5 ,  7.  ,  5.5 ,  6.25],
       [ 4.25,  7.  ,  5.75,  8.  ,  7.  ]]),
 72: array([[ 6.5 ,  4.75,  4.  ,  2.25,  6.  ],
       [ 4.25,  6.25,  7.75,  3.75,  5.25]]),
 96: array([[ 3.75,  5.5 ,  5.5 ,  6.5 ,  6.25],
       [ 3.25,  6.25,  6.5 ,  6.25,  3.5 ]])}
于 2013-04-14T22:00:33.180 に答える