使用Python向量化函数

时间:2020-05-11 02:15:17

标签: python pandas numpy vectorization

我有一个要向量化的功能:

import pandas as pd
import numpy as np
import random
import statsmodels.api as sm

data = pd.DataFrame({
    'state': ['a', 'b', 'c']*200,
    'read': [random.uniform(10,50) for i in range(600)],
    'write': [random.uniform(0,10) for i in range(600)],
    'cansu': [random.uniform(11,20) for i in range(600)],
    'brink': [random.uniform(2,10) for i in range(600)]
})


loop = pd.DataFrame({
    'state': ['a','a','c','b','c'],
    'x': [1,2,3,2,4],
    'y': [2,3,4,4,1]
})

def regress(z,x,y):
    X = data.query("state==@z").iloc[:,x].values
    X = sm.add_constant(X)
    Y = data.query("state==@z").iloc[:,y].values
    result = sm.OLS(Y,X).fit()
    return result.params[1]

我知道我可以使用apply, list comprehensions, itertools, map, filter, reduce, np.vectorize, etc.和所有很酷的功能。但是,我希望能够执行以下操作:

loop['slope'] = regress(loop['state'].values, loop['x'].values, loop['y'].values)

目前不起作用。这可能吗?如果是,该如何重写或修改我的函数以使其成为可能?

1 个答案:

答案 0 :(得分:0)

以这种方式尝试

与您的代码相同:

{
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "web": "expo start --web",
    "eject": "expo eject"
  },
  "dependencies": {
    "expo": "~37.0.3",
    "react": "~16.9.0",
    "react-dom": "~16.9.0",
    "react-native": "https://github.com/expo/react-native/archive/sdk-37.0.1.tar.gz",
    "react-native-web": "~0.11.7"
  },
  "devDependencies": {
    "babel-preset-expo": "~8.1.0",
    "@babel/core": "^7.8.6"
  },
  "private": true
}

在列表中执行:

import statsmodels.api as sm

data = pd.DataFrame({
    'state': ['a', 'b', 'c']*200,
    'read': [random.uniform(10,50) for i in range(600)],
    'write': [random.uniform(0,10) for i in range(600)],
    'cansu': [random.uniform(11,20) for i in range(600)],
    'brink': [random.uniform(2,10) for i in range(600)]
})


loop = pd.DataFrame({
    'state': ['a','a','c','b','c'],
    'x': [1,2,3,2,4],
    'y': [2,3,4,4,1]
})

def regress(z,x,y):
    X = data.query("state==@z").iloc[:,x].values
    X = sm.add_constant(X)
    Y = data.query("state==@z").iloc[:,y].values
    result = sm.OLS(Y,X).fit()
    return result.params[1]
相关问题