Cythonise 一个 pandas 循环

Cythonise a pandas loop

任何人都可以帮助我展示如何将此循环转换为 cython 以提高性能。我知道您需要使用 cdef 创建静态类型以提高性能,但还需要什么:

如果我有一个包含列 'a' 的数据框 df。

 for i in range(0, len(df.a)-1):
     if (i < len(df.a)-1):
         y= i + 1
         while ((np.abs(df.a[y]- df.a[i]) <= 0.015) & (y < len(df.a)-1)):
             y = y + 1
         if df[a][y] - df[a][i] >= 0.015:
             df['dir_y'][i] = 1
             #print(1)
         else:
             df['dir_y'][i] = -1
             #print(-1)

我很确定 'cythonise' 不是一个看起来很合适的词。

如果不尝试评论您是否可以在不使用 Cython 的情况下在 Pandas 中写得更好(我不知道,但它肯定值得尝试),您需要执行的步骤是:

  1. cdef 迭代索引 iy 作为整数:cdef int i,y(cdef 位于它们所在函数的顶部)
  2. cdef 一个 memoryview 数组来访问 df.a/df['a'] 通过: cdef double[:] df_a_mv 然后稍后 df_a_mv = df.a (我已经猜到了这里的类型,但它可能是两倍)
  3. 用你的记忆视图(df_a_mv)替换你所有的df.a
  4. 在 Cython 中编译(参见 http://docs.cython.org/src/reference/compilation.html

您可能还想 运行 cython -a <your_file>.pyx 看看它做了什么 - 它生成一个 HTML 文件,黄色突出显示的行是未优化的位。

我不担心 df['dir_y'][i] - 它很少完成,你可能不能加快它们的速度。

作为最后一个小点:if (i < len(df.a)-1): 是不必要的 - 它由周围的 for 循环保证。