パンダのデータフレームで複雑なスライスをベクトル化する

Asher11

速度を上げるために、このコードをベクトル化できるようにしたいと思います。目的は、2つの別々の配列に含まれている日付のペアのタプルから関数(この場合は標準偏差)を計算することです。

import pandas as pd
import numpy as np

asd_1 = pd.Series(0.01 * np.random.randn(252), index=pd.date_range('2011-1-1', periods=252))

index_1 = pd.to_datetime(['2011-2-2', '2011-4-3', '2011-5-1',])
index_2 = pd.to_datetime(['2011-2-15', '2011-4-16', '2011-5-17',])

index_tot = list(zip(index_1,index_2))

aux_learning_std = pd.DataFrame([np.nanstd(asd_1.loc[i:j]) for i, j in index_tot], index=index_1)

動作するソリューションはループを介して実行されますが、numpy / pandasを介してベクトル化できる方がはるかに高速です。最初は、次のようなものを使用することについて考えました。

df_aux = pd.concat([asd_1 for _ in range(len(index_1))], axis=1)
results = df_aux.apply(lambda x: np.nanstd(x.loc[i,j]), axis = 0)

しかし、ここでは、ベクトルを1つの操作にまとめることができません。

どんなアドバイスも大歓迎です。

ps:下に説明のための画像があります

ここに画像の説明を入力してください

Divakar

配列内の範囲全体のベクトル化された標準偏差

def get_ranges_arr(starts,ends):
    # Taken from http://stackoverflow.com/a/37626057/3293881
    counts = ends - starts
    counts_csum = counts.cumsum()
    id_arr = np.ones(counts_csum[-1],dtype=int)
    id_arr[0] = starts[0]
    id_arr[counts_csum[:-1]] = starts[1:] - ends[:-1] + 1
    return id_arr.cumsum()

def ranged_std(arr,starts,ends):
    # Get all indices and the IDs corresponding to same groups
    idx = get_ranges_arr(starts,ends)
    id_arr = np.repeat(np.arange(starts.size),ends-starts)
    
    # Extract relevant data
    slice_arr = arr[idx]
    
    # Simulate standard deviation implementation for a number of groups
    # using id_arr as the basis to perform various mathematical operations
    # within each group. Since, std. deviation performs sum/mean reduction,
    # we can simply use np.bincount for an efficient implementation.
    # Std. deviation formula used :
    #https://github.com/numpy/numpy/blob/v1.11.0/numpy/core/fromnumeric.py#L2939
    grp_counts = np.bincount(id_arr)
    mean_vals = np.bincount(id_arr,slice_arr)/grp_counts
    abs_vals = np.abs(slice_arr - mean_vals[id_arr])**2
    return np.sqrt(np.bincount(id_arr,abs_vals)/grp_counts)

サンプル実行(ルーピーバージョンに対して検証)

In [173]: arr = np.random.randint(0,9,(20))

In [174]: starts = np.array([2,6,11])

In [175]: ends = np.array([8,9,15])

In [176]: [np.std(arr[i:j]) for i,j in zip(starts,ends)]
Out[176]: [1.9720265943665387, 0.81649658092772603, 0.82915619758884995]

In [177]: ranged_std(arr,starts,ends)
Out[177]: array([ 1.97202659,  0.81649658,  0.8291562 ])    

ランタイムテスト

ケース#1:範囲の数が非常に少ない 3

In [21]: arr = np.random.randint(0,9,(20))

In [22]: starts = np.array([2,6,11])

In [23]: ends = np.array([8,9,15])

In [24]: %timeit [np.std(arr[i:j]) for i,j in zip(starts,ends)]
10000 loops, best of 3: 146 µs per loop

In [25]: %timeit ranged_std(arr,starts,ends)
10000 loops, best of 3: 45 µs per loop

ケース#2:まともな範囲の数 1000

In [32]: arr = np.random.randint(0,9,(1010))

In [33]: starts = np.random.randint(0,9,(1000))

In [34]: ends = starts + np.random.randint(0,9,(1000))

In [35]: %timeit [np.std(arr[i:j]) for i,j in zip(starts,ends)]
10 loops, best of 3: 47.5 ms per loop

In [36]: %timeit ranged_std(arr,starts,ends)
1000 loops, best of 3: 217 µs per loop

ケース#3:多数の範囲 10000

In [60]: arr = np.random.randint(0,9,(1010))

In [61]: arr = np.random.randint(0,9,(10010))

In [62]: starts = np.random.randint(0,9,(10000))

In [63]: ends = starts + np.random.randint(0,9,(10000))

In [64]: %timeit [np.std(arr[i:j]) for i,j in zip(starts,ends)]
1 loops, best of 3: 474 ms per loop

In [65]: %timeit ranged_std(arr,starts,ends)
100 loops, best of 3: 2.17 ms per loop

本当に驚くべきスピードアップ200x+


ranged_std私たちのケースを解決するために使用する

# Get start, stop numeric indices as needed for getting ranges array later on
starts = asd_1.index.searchsorted(index_1)
ends = asd_1.index.searchsorted(index_2)

# Create final dataframe output using ranged_std func
df = pd.DataFrame(ranged_std(asd_1.values,starts,ends+1),index=index_1)

検証のためのサンプル実行-

In [17]: asd_1 = pd.Series(0.01 * np.random.randn(252), index=\
    ...:                   pd.date_range('2011-1-1', periods=252))
    ...: 
    ...: index_1 = pd.to_datetime(['2011-2-2', '2011-4-3', '2011-5-1',])
    ...: index_2 = pd.to_datetime(['2011-2-15', '2011-4-16', '2011-5-17',])
    ...: 
    ...: index_tot = list(zip(index_1,index_2))
    ...: aux_learning_std = pd.DataFrame([np.nanstd(asd_1.loc[i:j]) for i, j in \
    ...:                                                index_tot], index=index_1)
    ...: 

In [18]: starts = asd_1.index.searchsorted(index_1)
    ...: ends = asd_1.index.searchsorted(index_2)
    ...: df = pd.DataFrame(ranged_std(asd_1.values,starts,ends+1),index=index_1)
    ...: 

In [19]: aux_learning_std
Out[19]: 
                   0
2011-02-02  0.007244
2011-04-03  0.012862
2011-05-01  0.010155

In [20]: df
Out[20]: 
                   0
2011-02-02  0.007244
2011-04-03  0.012862
2011-05-01  0.010155

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

パンダは複雑なマルチレベルの列データフレームをフラット化します

分類Dev

パンダでは、2つのデータフレームを複雑なマルチインデックスでマージします

分類Dev

パンダは、重複するインデックスを持つデータフレーム間でベクトル化された計算時にインデックスの順序を維持します

分類Dev

マルチインデックスパンダデータフレームで1対1のマッピングをフラット化する

分類Dev

パンダ-サブセット化データフレーム-最も外側のインデックスレベルのすべての値を取得する

分類Dev

パンダのマルチレベルデータフレームで不要なインデックスヘッダーを削除する方法

分類Dev

マルチレベルインデックスの1つのレベルでパンダデータフレームをフィルタリングする

分類Dev

パンダのマルチインデックスデータフレームをすべてのインデックスでグループ化する

分類Dev

パンダマルチインデックスの第2レベルでデータフレームのサブセットを選択する

分類Dev

パンダデータフレームで特定のシーケンスのラベルを作成する

分類Dev

パンダでデータフレームの複数の列スライスを取得する方法

分類Dev

パンダのデータフレームで比較をベクトル化する方法は?

分類Dev

パンダデータフレームの複数の列で論理演算子をベクトル化するにはどうすればよいですか?

分類Dev

パンダのデータフレームでネストされたJsonをフラット化する

分類Dev

行と列のラベルが付いたマトリックスのようなデータフレームを通常のパンダデータフレームに変換するにはどうすればよいですか?

分類Dev

リストにある(ない)インデックス値でパンダデータフレームをスライスする

分類Dev

最初の2つのレベルに重複するインデックスがあるマルチレベルのパンダデータフレームから行のリストを削除する

分類Dev

マルチインデックスデータフレームのインデックスレベルに複数の値を持つ行のリストを取得する方法をパンダ

分類Dev

マルチレベルインデックスデータフレームのすべての行に対して複雑なdfアクションを実行するにはどうすればよいですか?

分類Dev

コンストラクターでパンダデータフレームマルチインデックスを設定する方法

分類Dev

真のインデックスなしでパンダのデータフレームを再形成する

分類Dev

データフレームのリストに対するインデックスのベクトル化R

分類Dev

スマートポインタをエレガントに使用して、C ++で複雑なライフタイムをモデル化するにはどうすればよいですか?

分類Dev

Pythonパンダで2つの複雑なデータフレームをマージする方法は?

分類Dev

部分的なラベルでパンダのデータフレームをフィルタリングする方法

分類Dev

パンダのデータフレームで非常に複雑な条件で最大値と最小値を取得する

分類Dev

マルチインデックスデータフレームをスライスするパンダ

分類Dev

パンダを使用して複数のインデックスでデータフレームを単純化する方法は?

分類Dev

Jenkinsワークフローを使用して複数のパイプラインで複雑なバリューストリームを作成する方法

Related 関連記事

  1. 1

    パンダは複雑なマルチレベルの列データフレームをフラット化します

  2. 2

    パンダでは、2つのデータフレームを複雑なマルチインデックスでマージします

  3. 3

    パンダは、重複するインデックスを持つデータフレーム間でベクトル化された計算時にインデックスの順序を維持します

  4. 4

    マルチインデックスパンダデータフレームで1対1のマッピングをフラット化する

  5. 5

    パンダ-サブセット化データフレーム-最も外側のインデックスレベルのすべての値を取得する

  6. 6

    パンダのマルチレベルデータフレームで不要なインデックスヘッダーを削除する方法

  7. 7

    マルチレベルインデックスの1つのレベルでパンダデータフレームをフィルタリングする

  8. 8

    パンダのマルチインデックスデータフレームをすべてのインデックスでグループ化する

  9. 9

    パンダマルチインデックスの第2レベルでデータフレームのサブセットを選択する

  10. 10

    パンダデータフレームで特定のシーケンスのラベルを作成する

  11. 11

    パンダでデータフレームの複数の列スライスを取得する方法

  12. 12

    パンダのデータフレームで比較をベクトル化する方法は?

  13. 13

    パンダデータフレームの複数の列で論理演算子をベクトル化するにはどうすればよいですか?

  14. 14

    パンダのデータフレームでネストされたJsonをフラット化する

  15. 15

    行と列のラベルが付いたマトリックスのようなデータフレームを通常のパンダデータフレームに変換するにはどうすればよいですか?

  16. 16

    リストにある(ない)インデックス値でパンダデータフレームをスライスする

  17. 17

    最初の2つのレベルに重複するインデックスがあるマルチレベルのパンダデータフレームから行のリストを削除する

  18. 18

    マルチインデックスデータフレームのインデックスレベルに複数の値を持つ行のリストを取得する方法をパンダ

  19. 19

    マルチレベルインデックスデータフレームのすべての行に対して複雑なdfアクションを実行するにはどうすればよいですか?

  20. 20

    コンストラクターでパンダデータフレームマルチインデックスを設定する方法

  21. 21

    真のインデックスなしでパンダのデータフレームを再形成する

  22. 22

    データフレームのリストに対するインデックスのベクトル化R

  23. 23

    スマートポインタをエレガントに使用して、C ++で複雑なライフタイムをモデル化するにはどうすればよいですか?

  24. 24

    Pythonパンダで2つの複雑なデータフレームをマージする方法は?

  25. 25

    部分的なラベルでパンダのデータフレームをフィルタリングする方法

  26. 26

    パンダのデータフレームで非常に複雑な条件で最大値と最小値を取得する

  27. 27

    マルチインデックスデータフレームをスライスするパンダ

  28. 28

    パンダを使用して複数のインデックスでデータフレームを単純化する方法は?

  29. 29

    Jenkinsワークフローを使用して複数のパイプラインで複雑なバリューストリームを作成する方法

ホットタグ

アーカイブ