全て、
私は現在、自分用に構築した小さなバックテスト アプリのいくつかのサブルーチンを最適化しようとしています。すべてのデータが保持されている「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関数にありますが、単にビューを返すだけなので、なぜもっと時間がかかるのかわかりません。
この問題はおそらく問題ではないと思います。