私はサンプルデータセットを与えて、元のサンプルデータセットから複数のサンプルを選択したいとします。私はこの小さな関数をPythonで書いています。pandas range_dateの機能が極端に遅くなる
import timeit
import pandas as pd
import numpy as np
sample_data = np.random.randn(10000, 15)
index = pd.date_range("20000101", periods=10000, freq='B')
sample_data_df = pd.DataFrame(sample_data, index=index)
def f(n, sample_data_df, f):
s = (1+sample_data_df).resample(f, axis=0)
r = s.prod()-1
out = r.sample(n, replace=True)
# out_index = pd.date_range(start=sample_data_df.index[0],
# periods=len(out.index),
# freq=f)
# out.index = output_index
return out
start_time = timeit.default_timer()
N = 1000
a = [f(500, sample_data_df, 'BM') for i in range(N)]
elapsed = timeit.default_timer() - start_time
print(elapsed)
このコードを実行すると、35.8964748383秒かかります。しかし、私はすなわち
def f(n, sample_data_df, f):
s = (1+sample_data_df).resample(f, axis=0)
r = s.prod()-1
out = r.sample(n, replace=True)
out_index = pd.date_range(start=sample_data_df.index[0],
periods=len(out.index),
freq=f)
out.index = output_index
return out
、私は機能の行のコメントを解除することになるブロックのそれぞれに取り付けられたインデックスを持っていると思い今機能は72.2418179512をとります。これは気違いです。このようなインデックスを各出力に含める必要がある場合は、どのように高速化できますか?私は一度インデックスを生成し、後でそれを各出力に添付することに気付いています。しかし、他のケースでも関数を使用したいので、インデックス付けの割り当てが関数内で行われると非常に感謝します。
また、インデックス作成のほかに、速度を向上させるための他の情報源がありますか? 35.8964748383の索引付けをしなくても長い時間がかかります。
あなたが関数内でリサンプリングする必要がありますか? – DJK
@ djk47463はい、この関数は実際に再サンプリングする目的のクラスのメソッドです。私が考えていたのは、インデックス作成を追加するデコレータを書くことです。それはピジョンソニックですか?あなたはなぜパンダのインデックス作成が遅いのか知っていますか?私のような初心者のために:インデックス作成はかなり安いもののように聞こえる。パンダでは日付の種類が効率的に処理されないのですか? – math
頻度が1日より大きいリサンプリング/日付範囲は、パンダの既知のperf問題です。リンクされた問題を参照してください。 https://github.com/pandas-dev/pandas/issues/16463 – chrisb