Python Pandas:矢量化操作错误?
Posted
技术标签:
【中文标题】Python Pandas:矢量化操作错误?【英文标题】:Python Pandas: Vectorized operation bug? 【发布时间】:2012-10-11 18:09:03 【问题描述】:日期系列看起来像这样。
In [89]:
db.close[:5]
Out[89]:
datetime
2012-06-28 23:58:00 1.243925
2012-06-28 23:59:00 1.244125
2012-06-29 00:00:00 1.244065
2012-06-29 00:01:00 1.243875
2012-06-29 00:02:00 1.243865
Name: close
我想从每个元素中减去前一个元素。
In [93]:
db.close[1:5] - db.close[:4]
Out[93]:
datetime
2012-06-28 23:58:00 NaN
2012-06-28 23:59:00 0
2012-06-29 00:00:00 0
2012-06-29 00:01:00 0
2012-06-29 00:02:00 NaN
Name: close
数组被减去而没有偏移。
但是当我比较数组元素时...
n [94]:
db.close[1:5] == db.close[:4]
Out[94]:
datetime
2012-06-28 23:59:00 False
2012-06-29 00:00:00 False
2012-06-29 00:01:00 False
2012-06-29 00:02:00 False
Name: close
【问题讨论】:
【参考方案1】:这实际上是故意的。算术运算会进行数据对齐,但比较不会。过去我考虑过更改它,但发现它导致了太多问题(尤其是在将 Series 传递给期望 NumPy 数组的函数时,例如,numpy.diff
)。
编辑:要对齐,您可以手动对齐:
In [10]: numpy.equal(*a.align(b))
Out[10]:
2000-01-03 False
2000-01-04 True
2000-01-05 True
2000-01-06 True
2000-01-07 True
2000-01-10 False
Freq: B
【讨论】:
感谢您的解释。我想避免迭代。因此有可能通过向量来制作我需要的东西吗?【参考方案2】:我找到了自己问题的答案。它可能对某人有用。
In [38]:
db.close.shift(periods=1).head() - db.close.head()
Out[38]:
datetime
2012-06-28 23:58:00 NaN
2012-06-28 23:59:00 -0.00020
2012-06-29 00:00:00 0.00006
2012-06-29 00:01:00 0.00019
2012-06-29 00:02:00 0.00001
Freq: T, Name: close
不幸的是,它比普通算术运算慢 2-3 倍。
In [40]:
%timeit db.close.shift(periods=1) - db.close
1000 loops, best of 3: 1.64 ms per loop
%timeit db.close - db.open
1000 loops, best of 3: 700 us per loop
【讨论】:
以上是关于Python Pandas:矢量化操作错误?的主要内容,如果未能解决你的问题,请参考以下文章
Python / Pandas是否可以向量化与相对类别中所有其他点的比较?