迭代通过pandas数据帧和numpy

时间:2017-01-30 09:18:07

标签: python pandas numpy iteration

我来自java背景,是numpy和pandas的新手。 我想将以下伪代码翻译成python。

theta[0...D] - numpy
input[1...D][0...N-1] - Pandas data frame

PSEUDO CODE:

mean = theta[0]
for(row = 0 to N-1)
     for(col = 1 to D)
          mean += theta[col] * input[row][col]

实现:

class simulator:
    theta = np.array([])
    stddev = 0

    def __init__(self, v_coefficents, v_stddev):
        self.theta = v_coefficents
        self.stddev = v_stddev

    def sim( self, input ):
        mean = self.theta[0]
        D = input.shape[0]
        N = input.shape[1]

        for index, row in input.iterrows():
            mean = self.theta[0]
            for i in range(D):
                mean += self.theta[i+1] *row['y']

我关注最后一行代码中的迭代: mean += self.theta[i+1] *row['y']

1 个答案:

答案 0 :(得分:3)

由于您正在使用NumPy,我建议将pandas数据帧作为数组提取,然后我们可以使用theta和提取的input版本作为数组。< / p>

因此,从我们开始,我们将数组作为 -

input_arr = input.values

然后,伪代码的翻译将是 -

mean = theta[0]
for row in range(N):
    for col in range(1,D+1):    
        mean += theta[col] * input_arr[row,col]

要执行总和减少,NumPy支持向量化操作和broadcasting,我们只需输出 -

mean = theta[0] + (theta[1:D+1]*input_arr[:,1:D+1]).sum()

这可以通过np.dot作为矩阵乘法进一步优化,如此 -

mean = theta[0] + np.dot(input_arr[:,1:D+1], theta[1:D+1]).sum()

请注意,如果您认为input的长度为D-1,那么我们需要进行少量修改:

  1. Loopy代码包含:input_arr[row,col-1]而不是input_arr[row,col]
  2. 矢量化代码将包含:input_arr而不是input_arr[:,1:D+1]
  3. 基于comments -

    的示例运行
    In [71]: df = {'y' : [1,2,3,4,5]}
        ...: data_frame = pd.DataFrame(df)
        ...: test_coefficients = np.array([1,2,3,4,5,6])
        ...: 
    
    In [79]: input_arr = data_frame.values
        ...: theta = test_coefficients
        ...: 
    
    In [80]: theta[0] + np.dot(input_arr[:,0], theta[1:])
    Out[80]: 71