【问题标题】:Python Pandas: Vectorized operation bug?Python Pandas:矢量化操作错误?
【发布时间】: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

【问题讨论】:

    标签: python numpy python-3.x pandas


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      • 2016-06-20
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 2023-03-20
      相关资源
      最近更新 更多