Pandas在Panel中使用.at函数时返回副本

时间:2013-05-27 23:31:54

标签: python pandas

所有

我目前正在尝试优化我为自己构建的小型回测应用程序的一些子例程。我有一个'current_data'pandas面板,其中包含所有数据。

我正在尝试按如下方式访问它:

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函数中,但它只是返回一个视图,所以我不明白为什么它会花费更多的时间。

问题可能不在.at那么,我想。

1 个答案:

答案 0 :(得分: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