self.data_source.ix[:, :cur_n, :]
と同等です
self.data_source.ix[:, indices[first_n:cur_n + 1], :]
ただし、2〜3倍高速になる可能性があります。
In [105]: import pandas as pd
In [106]: import numpy as np
In [107]: wp = pd.Panel(np.random.randn(2, 1000, 4))
In [108]: indices = wp.major_axis
In [109]: %timeit wp.ix[:, :499, :]
10000 loops, best of 3: 65.2 us per loop
In [110]: %timeit wp.ix[:, indices[0:500], :]
1000 loops, best of 3: 221 us per loop
In [114]: np.allclose(wp.ix[:, :499, :].values, wp.ix[:, indices[0:500], :].values)
Out[114]: True
self.data_source.ix[:, :cur_n, :]
基本的なスライスを使用します。元のパネルのビューを返します。ビューを変更すると、元のパネルも変更されることに注意してください。
indices[first_n:cur_n + 1]
NumPy の ndarray のサブクラスです。 ndarray でインデックスを作成すると、ビューではなくコピーが返されます。大きな配列のコピーを作成すると、ビューを返すよりも遅くなります。おそらく、速度向上の大部分はそこから来ています。ただし、元のパネルを変更せずに生成されたサブパネルを変更する場合など、コピーが必要になる場合があります。
転置を使用するという追加のアイデアを提供してくれた @Jeff に感謝します。私のマシンでは、大幅な改善が得られます。
In [131]: wpt = wp.transpose(1,0,2)
In [132]: %timeit wpt.ix[:499]
10000 loops, best of 3: 37.5 us per loop
In [109]: %timeit wp.ix[:, :499, :]
10000 loops, best of 3: 65.2 us per loop