用熊猫循环数据框的最有效方式是什么?

我想以顺序的方式对数据框中的财务数据执行我自己的复杂操作。

例如,我正在使用以下来自雅虎财经的MSFT CSV文件:

Date,Open,High,Low,Close,Volume,Adj Close
2011-10-19,27.37,27.47,27.01,27.13,42880000,27.13
2011-10-18,26.94,27.40,26.80,27.31,52487900,27.31
2011-10-17,27.11,27.42,26.85,26.98,39433400,26.98
2011-10-14,27.31,27.50,27.02,27.27,50947700,27.27

....

然后我执行以下操作:

#!/usr/bin/env python
from pandas import *

df = read_csv('table.csv')

for i, row in enumerate(df.values):
    date = df.index[i]
    open, high, low, close, adjclose = row
    #now perform analysis on open/close based on date, etc..

这是最有效的方法吗? 考虑到对熊猫速度的关注,我会假设必须有一些特殊的函数来迭代这些值,以便也可以检索索引(可能通过生成器来提高内存效率)。 不幸的是, df.iteritems只能逐列迭代。


最新版本的熊猫现在包含一个用于遍历行的内置函数。

for index, row in df.iterrows():

    # do some logic here

或者,如果你想更快地使用itertuples()

但是,unutbu建议使用numpy函数来避免遍历行会产生最快的代码。


熊猫是基于NumPy阵列的。 使用NumPy数组加速的关键是一次执行整个数组的操作,而不是逐行或逐项执行。

例如,如果close是一个一维数组,并且您希望每日更改百分比,

pct_change = close[1:]/close[:-1]

这将计算整个百分比变化数组作为一个语句,而不是

pct_change = []
for row in close:
    pct_change.append(...)

因此,尽量避免我的Python循环for i, row in enumerate(...)完全for i, row in enumerate(...)排序,并考虑如何对整个数组(或数据框)上的操作执行计算,而不是逐行执行。


您可以通过转置循环遍历行,然后调用iteritems:

for date, row in df.T.iteritems():
   # do some logic here

在这种情况下,我不确定效率。 为了在迭代算法中获得最佳性能,您可能需要探索在Cython中编写它,以便您可以执行如下操作:

def my_algo(ndarray[object] dates, ndarray[float64_t] open,
            ndarray[float64_t] low, ndarray[float64_t] high,
            ndarray[float64_t] close, ndarray[float64_t] volume):
    cdef:
        Py_ssize_t i, n
        float64_t foo
    n = len(dates)

    for i from 0 <= i < n:
        foo = close[i] - open[i] # will be extremely fast

我建议首先用纯Python编写算法,确保它能够正常工作,看看它的速度有多快 - 如果速度不够快,可以用最少的工作将事情转换为Cython,以便获得与手写代码C一样快的东西/ C ++。

链接地址: http://www.djcxy.com/p/70917.html

上一篇: What is the most efficient way to loop through dataframes with pandas?

下一篇: Select rows from a DataFrame based on values in a column in pandas