【问题标题】:calculating streaks using numpy使用 numpy 计算条纹
【发布时间】:2019-08-16 10:10:37
【问题描述】:

我正在尝试仅使用 numpy 计算正负和无条纹。这个问题我必须弄清楚我所有的研究都认为我需要的方程的 groupby 分量。我在这里找到了熊猫回复Pythonic way to calculate streaks in pandas dataframe

我已经能够转换除 groupby 片段之外的所有片段。任何帮助表示赞赏

这是我想复制的熊猫代码。唯一的非 numpy 等价物是 groupby。我还在 numpy 中创建了自己的 shift 函数。

熊猫版:

def streaks(df, col):
    sign = np.sign(df[col])
    s = sign.groupby((sign!=sign.shift()).cumsum()).cumsum()
    return df.assign(u_streak=s.where(s>0, 0.0), 
    d_streak=s.where(s<0,0.0).abs())

我的部分 numpy 版本:

arr = np.array([0.2,0.1,0.1,0.0,-0.2,-0.1,0.0])
sign = np.sign(arr)
s = np.not_equal(sign, shift(sign))
# now I need to groupby and then sum and sum again 
np.cumsum(groupby(np.cumsum(s)))

预期的结果应该是:

array([1.,2.,3.,0.,-1.,-2.,0.])

【问题讨论】:

标签: python numpy pandas-groupby


【解决方案1】:

对于带有numpy的完整版,您不必使用groupby,您可以这样做:

arr = np.array([0.2,0.1,0.1,0.0,-0.2,-0.1,0.0])
sign = np.sign(arr)
s = np.abs(sign).cumsum() # or s = (arr != 0).cumsum()
streaks = (s - np.maximum.accumulate(np.where(arr == 0, s, 0)))*sign
print (streaks)
#[ 1.  2.  3.  0. -1. -2.  0.] 

它的作用是,每次arr 中的值不为 0 时,s 都会增加,然后您将从其中删除实际为 0 的位置的累积最大值,以便在 1 处“重新开始”计数下一个连胜,您只需乘以 sign 即可获得预期的输出。

编辑:上述方法假设正负条纹之间有一个 0,不假设这一点,您可以通过拆分正负情况来做到这一点:

arr = np.array([1.2,-1.2,0.2,0.1,0.1,0.0,-0.2,-0.1,0.0])
pos = np.clip(arr, 0, 1).astype(bool).cumsum()
neg = np.clip(arr, -1, 0).astype(bool).cumsum()
streaks = np.where(arr >= 0, pos-np.maximum.accumulate(np.where(arr <= 0, pos, 0)),
                             -neg+np.maximum.accumulate(np.where(arr >= 0, neg, 0)))
print (streaks)
#[ 1 -1  1  2  3  0 -1 -2  0]

【讨论】:

  • 适用于我提供的示例数组,但是当我更改值时它不起作用。仅添加两个新元素 arr = np.array([1.2,-1.2,0.2,0.1,0.1,0.0,-0.2,-0.1,0.0]) 得到 [ 1. -2 的结果。 3. 4. 5. 0. -1. -2。 0.] 而不是 [1.,-1., 1. 2. 3. 0. -1. -2。 0..]
  • @JohnHolmes 确实,我做了一个(错误的)假设,即条纹之间有一个 0
  • @BenT 谢谢先生,非常感谢。我在数据帧与 numpy 上运行了 timeit,您的解决方案速度提高了 2 倍,这是一个奖励。
猜你喜欢
  • 2019-11-02
  • 2018-07-10
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 2013-04-11
相关资源
最近更新 更多