来自 Julia 的电话 Python
Call Python from Julia
我是 Julia 的新手,我有一个要在 Julia 中使用的 Python 函数。基本上该函数所做的是接受一个数据框(作为 numpy ndarray 传递)、一个过滤器值和一个列索引列表(来自数组)和 运行 使用 statsmodels
包的逻辑回归Python。到目前为止我试过这个:
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
s 而在 Julia 代码中你有 Char
s - 这是不一样的。
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}
,在 PyCall 中将 in-flight 转换为一个 numpy 向量,而不是使用 Vector{Any}
,所以看起来您的代码仍然可以改进(取决于什么你真的打算这样做)。
我是 Julia 的新手,我有一个要在 Julia 中使用的 Python 函数。基本上该函数所做的是接受一个数据框(作为 numpy ndarray 传递)、一个过滤器值和一个列索引列表(来自数组)和 运行 使用 statsmodels
包的逻辑回归Python。到目前为止我试过这个:
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
s 而在 Julia 代码中你有 Char
s - 这是不一样的。
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}
,在 PyCall 中将 in-flight 转换为一个 numpy 向量,而不是使用 Vector{Any}
,所以看起来您的代码仍然可以改进(取决于什么你真的打算这样做)。