在 Python 中向量化一个函数
Vectorizing a function in Python
我有一个要矢量化的函数:
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)
目前无法使用。这可能吗?如果是,我如何重写或修改我的函数以实现此目的?
这样试试
与您的代码相同:
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]
在列表中执行:
loop['slope'] = regress(list(loop['state'].values), list(loop['x'].values), list(loop['y'].values))
我有一个要矢量化的函数:
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)
目前无法使用。这可能吗?如果是,我如何重写或修改我的函数以实现此目的?
这样试试
与您的代码相同:
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]
在列表中执行:
loop['slope'] = regress(list(loop['state'].values), list(loop['x'].values), list(loop['y'].values))