Python 在面板中使用.at函数时返回副本

Python 在面板中使用.at函数时返回副本,python,pandas,Python,Pandas,全部, 我目前正在尝试优化我为自己开发的一个小型回溯测试应用程序的一些子例程。我有一个“当前_数据”面板,其中保存了所有数据 我尝试按如下方式访问它: self.current_data.at[order['instrument'], self.current_day, 'low'] 然而,这是非常缓慢的。从文档来看,这似乎应该返回一个视图——因为我没有设置任何值。我用的是最新的熊猫(0.11.0) 你能告诉我为什么会这样吗?也许是一种更快的方法 顺便说一下,我知道这是一个副本,因为探查器显示

全部,

我目前正在尝试优化我为自己开发的一个小型回溯测试应用程序的一些子例程。我有一个“当前_数据”面板,其中保存了所有数据

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

self.current_data.at[order['instrument'], self.current_day, 'low']
然而,这是非常缓慢的。从文档来看,这似乎应该返回一个视图——因为我没有设置任何值。我用的是最新的熊猫(0.11.0)

你能告诉我为什么会这样吗?也许是一种更快的方法

顺便说一下,我知道这是一个副本,因为探查器显示frame.py:383(init)每次都被调用,如果我减小对象的大小,这条线的速度会大大加快

干杯

编辑:

下面是如何重新创建我的问题。我现在明白了,这个问题可能不在

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


问题可能不在这里。我想,那时。

你一定在测量其他东西,
是一个恒定时间操作。请展示您正在做的更多细节(例如,样本面板和访问器)


根据定义,该函数返回一个标量值。如果您正在放大,那么它将创建并返回一个新对象,请参见:,您想做什么?我只需要从面板中的特定位置获取特定标量。order['instrument']类似于AAPL,self.current_day是当天的索引,“low”是列名。我曾尝试使用ix执行相同的操作,但它需要更多的时间。请将DIM转换为:项目(低)x主要(日期)x次要(ID),将提供更好的性能。如果您是对的,则它不在.at中。查看编辑。奇怪的是.at所在的函数的累积运行时间增加了。这可能是cProfile中的一个bug,但我真的不知道。
.ix
在这种情况下,可能并不总是返回视图,这实际上取决于numpy如何对齐内存。如果您尝试使用转置面板(例如,您的专业是您的项目dim),那么我认为您将始终获得视图,但由于您正在迭代另一个dim,我不能100%确定。这可以解释差异。谢谢!我选择对所有内容进行一点重构,而不是处理所有这些小的性能问题。我现在使用的是数据帧和字典,基本上需要1秒来完成之前在8秒内完成的所有工作。因为我不必操纵很多范围/切片,所以我认为这是最好的选择。
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