2

我是 Julia 的新手,我有一个要在 Julia 中使用的 Python 函数。基本上,该函数的作用是接受数据帧(作为 numpy ndarray 传递)、过滤器值和列索引列表(来自数组)并使用statsmodelsPython 中的包运行逻辑回归。到目前为止,我已经尝试过:

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

任何帮助表示赞赏。

4

1 回答 1

1

在 Python 代码中你有strs 而在 Julia 代码中你有Chars - 这是不一样的。

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 中使用它会在飞行中转换为 numpy 向量而不是使用Vector{Any},所以看起来您的代码仍然可以改进(取决于您实际计划执行的操作)。

于 2020-09-02T17:10:02.920 回答