问题描述
我是Julia的新手,我有一个要在Julia中使用的Python函数。基本上,该函数的作用是接受数据帧(作为numpy ndarray传递),过滤器值和列索引列表(来自数组),并使用Python中的statsmodels
包运行逻辑回归。到目前为止,我已经尝试过:
using PyCall
py"""
import pandas as pd
import numpy as np
import random
import statsmodels.api as sm
import itertools
def reg_frac(state,ind_vars):
rows = 2000
total_rows = rows*13
data = pd.DataFrame({
'state': ['a','b','c','d','e','f','g','h','i','j','k','l','m']*rows,\
'y_var': [random.uniform(0,1) for i in range(total_rows)],\
'school': [random.uniform(0,10) for i in range(total_rows)],\
'church': [random.uniform(11,20) for i in range(total_rows)]}).to_numpy()
try:
X,y = sm.add_constant(np.array(data[(data[:,0] == state)][:,ind_vars],dtype=float)),np.array(data[(data[:,0] == state),1],dtype=float)
model = sm.Logit(y,X).fit(cov_type='HC0',disp=False)
rmse = np.sqrt(np.square(np.subtract(y,model.predict(X))).mean())
except:
rmse = np.nan
return [state,ind_vars,rmse]
"""
reg_frac(state,ind_vars) = (py"reg_frac"(state::Char,ind_vars::Array{Any}))
但是,当我运行此命令时,我并不期望结果为NaN
。我认为它正在运行,但是我缺少一些东西。
reg_frac('b',Any[i for i in 2:3])
0.000244 seconds (249 allocations: 7.953 KiB)
3-element Array{Any,1}:
'b'
[2,3]
NaN
感谢您的帮助。
解决方法
在Python代码中,您拥有str
,而在Julia代码中,您拥有Char
,这是不一样的。
Python:
>>> type('a')
<class 'str'>
朱莉娅:
julia> typeof('a')
Char
因此,您的比较无效。 您的函数可能如下所示:
reg_frac(state,ind_vars) = (py"reg_frac"(state::String,ind_vars::Array{Any}))
现在:
julia> reg_frac("b",Any[i for i in 2:3])
3-element Array{Any,1}:
"b"
[2,3]
0.2853707270515166
但是,我建议使用Vector{Float64}
,而不是使用Vector{Any}
来将PyCall实时转换为numpy向量,因此看起来您的代码仍然可以改进(取决于您实际计划的内容)要做)。