0

全て、

私は現在、自分用に構築した小さなバックテスト アプリのいくつかのサブルーチンを最適化しようとしています。すべてのデータが保持されている「current_data」パンダパネルがあります。

次のようにアクセスしようとしています。

self.current_data.at[order['instrument'], self.current_day, 'low']

ただし、これは非常に遅いです。ドキュメントから、値を設定していないため、これはビューを返す必要があるようです。最新のパンダ (0.11.0) を使用しています。

なぜこれが起こっているのか教えていただけますか?そして、これを行うためのより速い方法はありますか?

ちなみに、プロファイラーが frame.py:383( init ) が毎回呼び出されていることを示しているため、これがコピーであることはわかっています。オブジェクトのサイズを小さくすると、この行が大幅に高速化されます。

乾杯!

編集:

問題を再現する方法は次のとおりです。問題はおそらく .at にはないことがわかりました。

items = ['A', 'B', 'C', 'D']
cols = ['a', 'b', 'c', 'd']


indices = pd.date_range(datetime.datetime.now(), periods=1000, freq="D")
res = {}
for item in items:
    res[item] = pd.DataFrame(np.random.randn(1000, 4), columns=cols, index=indices)

first = pd.Panel(res)

print timeit.Timer("""
for i in range(100, 200):
    today = indices[i]
    first_change = first.ix[:, :i + 1, :]
    first_change.at["A", today, "a"]
    first_change.at["A", today, "b"]
    first_change.at["A", today, "c"]
""", setup="from __main__ import first, indices").timeit(number=50)/50.0

#--- Time: 0.0307311664639

indices = pd.date_range(datetime.datetime.now(), periods=10000, freq="D")
res = {}
for item in items:
    res[item] = pd.DataFrame(np.random.randn(10000, 4), columns=cols, index=indices)
second = pd.Panel(res)

print timeit.Timer("""
for i in range(8100, 8200):
    today = indices[i]
    second_change = second.ix[:, :i + 1, :]
    second_change.at["A", today, "a"]
    second_change.at["A", today, "b"]
    second_change.at["A", today, "c"]
""", setup="from __main__ import second, indices").timeit(number=50)/50.0

#--- Time: 0848793384464

とにかく、これは基本的に何が起こっているのかです。おそらく.ix関数にありますが、単にビューを返すだけなので、なぜもっと時間がかかるのかわかりません。

この問題はおそらく問題ではないと思います。

4

1 に答える 1

0

何か他のものを測定しているに違いありませんat。これは一定時間の操作です。あなたが行っていることの詳細を示してください(例:サンプルパネルとアクセサー)

In [24]: p = Panel(randn(1,1,1))

In [25]: %timeit p.at[0,0,0]
100000 loops, best of 3: 5.33 us per loop

In [26]: p = Panel(randn(10,10,10))

In [27]: %timeit p.at[0,0,0]
100000 loops, best of 3: 5.34 us per loop

In [28]: p = Panel(randn(100,100,100))

In [29]: %timeit p.at[0,0,0]
100000 loops, best of 3: 5.28 us per loop

In [30]: p = Panel(randn(1000,1000,1000))

In [31]: %timeit p.at[0,0,0]
100000 loops, best of 3: 5.36 us per loop
于 2013-05-28T13:01:56.647 に答える