【问题标题】:How to use glmulti from python using rpy2?如何使用 rpy2 从 python 中使用 glmulti?
【发布时间】:2020-03-07 12:59:18
【问题描述】:

考虑以下数据框

import pickle
a='pickle.loads(b\'\\x80\\x03cpandas.core.frame\\nDataFrame\\nq\\x00)\\x81q\\x01}q\\x02(X\\x05\\x00\\x00\\x00_dataq\\x03cpandas.core.internals.managers\\nBlockManager\\nq\\x04)\\x81q\\x05(]q\\x06(cpandas.core.indexes.base\\n_new_Index\\nq\\x07cpandas.core.indexes.base\\nIndex\\nq\\x08}q\\t(X\\x04\\x00\\x00\\x00dataq\\ncnumpy.core.multiarray\\n_reconstruct\\nq\\x0bcnumpy\\nndarray\\nq\\x0cK\\x00\\x85q\\rC\\x01bq\\x0e\\x87q\\x0fRq\\x10(K\\x01K\\n\\x85q\\x11cnumpy\\ndtype\\nq\\x12X\\x02\\x00\\x00\\x00O8q\\x13K\\x00K\\x01\\x87q\\x14Rq\\x15(K\\x03X\\x01\\x00\\x00\\x00|q\\x16NNNJ\\xff\\xff\\xff\\xffJ\\xff\\xff\\xff\\xffK?tq\\x17b\\x89]q\\x18(X\\x0b\\x00\\x00\\x00priceToBookq\\x19X\\x04\\x00\\x00\\x00betaq\\x1aX\\x0e\\x00\\x00\\x00price to salesq\\x1bX\\x0c\\x00\\x00\\x00gross profitq\\x1cX\\x0c\\x00\\x00\\x0052WeekChangeq\\x1dX\\n\\x00\\x00\\x00market capq\\x1eX\\x04\\x00\\x00\\x00ebitq\\x1fX\\r\\x00\\x00\\x00total revenueq X\\x0c\\x00\\x00\\x00payout ratioq!X\\x08\\x00\\x00\\x00pe ratioq"etq#bX\\x04\\x00\\x00\\x00nameq$Nu\\x86q%Rq&h\\x07cpandas.core.indexes.range\\nRangeIndex\\nq\\\'}q((h$NX\\x05\\x00\\x00\\x00startq)K\\x00X\\x04\\x00\\x00\\x00stopq*K\\x07X\\x04\\x00\\x00\\x00stepq+K\\x01u\\x86q,Rq-e]q.h\\x0bh\\x0cK\\x00\\x85q/h\\x0e\\x87q0Rq1(K\\x01K\\nK\\x07\\x86q2h\\x12X\\x02\\x00\\x00\\x00f8q3K\\x00K\\x01\\x87q4Rq5(K\\x03X\\x01\\x00\\x00\\x00<q6NNNJ\\xff\\xff\\xff\\xffJ\\xff\\xff\\xff\\xffK\\x00tq7b\\x89B0\\x02\\x00\\x00\\xd1@,\\x9b9\\x8c)@Cz\\xe5\\xd5\\x94_\\xf5?\\x92(\\x0ffn9\\xf0?\\n+\\x15TT-\\x17@ \\xd5\\xb0\\xdf\\x13\\x03%@u\\xdek\\xad\\xd4\\xb8\\xfb?\\x1c\\xee#\\xb7&\\xbd\\xf3?-\\x98\\xf8\\xa3\\xa8\\xf3\\xf3?H\\xfd\\xf5\\n\\x0b\\xae\\xf1?:;\\x19\\x1c%/\\xf1?\\x9f\\x93\\xde7\\xbe\\xf6\\xf0?\\xbb}V\\x99)\\xad\\xf3?\\xae\\xbby\\xaaC.\\xf3?\\xa5,C\\x1c\\xeb\\xe2\\xf9?d\\x94g^\\x0e\\x13\\x12@\\x9e\\xc7r\\\\\\xd7i\\x06@\\xe4\\xe0\\x0c\\xddp\\xc8\\xcc?%\\x95)\\xe6 \\x18 @\\xa1\\xf4\\x85\\x90\\xf3\\x1e!@y6P\\x85\\xe4\\x89\\x0e@.\\xd9\\xc2=\\xe0\\x1b\\x0c@\\x00\\x00\\x00\\xc6\\x9e\\xe86B\\x00\\x00\\x00fF\\xb83B\\x00\\x00\\x00.\\xdc\\xb6\\x0bB\\x00\\x00\\x80\\x954\\xa5%B\\x00\\x00@\\\'1O3B\\x00\\x00\\x00\\xec\\xed58B\\x00\\x00\\x80\\t\\x93\\xa64B\\xf1\\xda\\x84\\xff\\x9d\\x82\\xd5?f\\xb8>\\x028#\\xa0?\\xc8^\\xef\\xfex/\\xb0\\xbf\\xab\\xd5\\x91\\x02\\x8f\\x18\\xd6?\\xd7\\xc05\\xfb,d\\xd6?r\\x8e\\xb6\\x01\\n\\xbb\\xc8?\\xc0\\xd52\\x00\\xf1F\\xc9?\\x00\\x00\\x00 \\x8b\\x1bqB\\x00\\x00\\x00\\xa0\\x92HKB\\x00\\x00\\x00\\x80\\xcb\\x8a B\\x00\\x00\\x00\\x00\\x98)_B\\x00\\x00\\x00`\\xca+pB\\x00\\x00\\x00\\xa0N\\xe4WB\\x00\\x00\\x00\\x00\\xc0\\x9fQB\\x00\\x00\\x00\\xc5\\x0c\\xc5-B\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00lIv\\xf0A\\x00\\x00\\x00\\xd9\\xb83\\x17B\\x00\\x00\\x80\\xa3\\x1c\\x01$B\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xc0\\x17\\xcaINB\\x00\\x00\\x00fF\\xb83B\\x00\\x00@\\xdcq\\xaaBB\\x00\\x00\\x00\\x87h\\x00*B\\x00\\x00\\xc0\\xca\\xd3L=B\\x00\\x00\\x00\\xec\\xed58B\\x00\\x00\\x80\\t\\x93\\xa64B\\xa1\\xf81\\xe6\\xae%\\xd0?\\x8b\\xfde\\xf7\\xe4a\\xd9?\\x00\\x00\\x00\\x00\\x00\\x00\\xf8?\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xf1\\xf4JY\\x868\\xd6?>(\\xc5\\x1ap\\xce\\xd4?\\xc3\\xf5(\\\\\\x8f\\xc2\\xcd?\\xad\\xbf%\\x00\\xff\\xe05@\\xc8$#gaG\\\'@\\x9a\\x99\\x99\\x99\\x99\\x996@{Ic\\xb4\\x8e\\x82>@^+\\xa1\\xbb$\\x8a;@UL\\xa5\\x9fp\\xbe)@0G\\x8f\\xdf\\xdb\\x84(@q8tq9ba]q:h\\x07h\\x08}q;(h\\nh\\x0bh\\x0cK\\x00\\x85q<h\\x0e\\x87q=Rq>(K\\x01K\\n\\x85q?h\\x15\\x89]q@(h\\x19h\\x1ah\\x1bh\\x1ch\\x1dh\\x1eh\\x1fh h!h"etqAbh$Nu\\x86qBRqCa}qDX\\x06\\x00\\x00\\x000.14.1qE}qF(X\\x04\\x00\\x00\\x00axesqGh\\x06X\\x06\\x00\\x00\\x00blocksqH]qI}qJ(X\\x06\\x00\\x00\\x00valuesqKh1X\\x08\\x00\\x00\\x00mgr_locsqLcbuiltins\\nslice\\nqMK\\x00K\\nK\\x01\\x87qNRqOuaustqPbX\\x04\\x00\\x00\\x00_typqQX\\t\\x00\\x00\\x00dataframeqRX\\t\\x00\\x00\\x00_metadataqS]qTub.\')'
a=eval(a)
a

我想在 python 中运行 glmulti 已知的函数。我尝试了很多方法,但都失败了。然后我做了无望的行为去r如下

将数据集作为excel文件作为

a.to_excel('test1.xlsx')

去r工作室

install.packages("glmulti", "rJava", "readxl")
library("glmulti", "rJava", "readxl")

getwd()

setwd(".Gp\\to\\the\\python directory where you are workingin")


my_data <- read_excel("test1.xlsx", sheet = 1)

更改数据框的列,因为它不适用于数据的主要值

j=1
for (i in paste0("x",1:length(my_data))){
  names(my_data)[j]=i
  j=j+1
}

选择我的 x 变量和 y 变量

y=my_data[,6]
x=my_data[, names(my_data) != names(my_data)[6]]

最后,我在 r 中运行我想要的函数

glmulti(names(y), names(x), data=my_data, method="h")

有没有更简单的方法可以使用 rpy2 从 python 运行它?如果可以,请您对此提出建议吗?

【问题讨论】:

    标签: r python-3.x statistics rpy2


    【解决方案1】:

    考虑使用rpy2 将Pandas 数据框转换为R 数据框,然后像现在一样从导入的包中调用glmulti

    不过,关于 R 的几点说明:

    • 除了标准库函数(例如,listsumtype)之外,每个函数或方法都派生自 Python 的包。但在 R 中,它的标准库包默认加载(例如,utilsstatsbase)用于日常方法(例如,read.csvheadsummary)。
    • 虽然您可以使用 base::names 等每个函数调用来限定包名称,但它在 Python 中不是必需的,但在与其他包发生名称冲突时很有帮助。
    • 您不需要for 循环来重命名所有列,但可以使用base::paste0 进行矢量化并使用stats::setNamesbase::colnames 进行分配。

    Python 处理

    import pandas as pd
    import pickle
    
    df_py = eval('pickle.loads(...)')
    
    # RE-ORDER COLUMNS BY MOVING SIXTH COLUMN TO FIRST POSITION
    cols = df_py.columns.to_list()
    new_order = [cols[5]] + cols[0:5] + cols[6:]
    
    df_py = df_py.reindex(new_order, axis=1)            
    
    print(df_py.head(10))
    

    R 处理

    from rpy2.robjects import pandas2ri
    from rpy2.robjects.packages import importr
    
    utils = importr('utils')
    base = importr('base')
    stats = importr('stats')
    glmulti = importr('glmulti')     # DOES NOT REQUIRE rJava PACKAGE BUT DOES REQUIRE Java LANGUAGE
    
    # CONVERT TO R DATAFRAME
    pandas2ri.activate()
    df_r = pandas2ri.py2ri(df_py)    # USING ABOVE PANDAS DATA FRAME
    
    # RENAME COLUMNS y, x1, x2, x3, ...
    df_r = stats.setNames(df_r, base.c("y", base.paste0("x", base.seq(1,base.length(df_r)[0]-1))))
    print(utils.head(df_r, 10))
    
    # CALL glmulti()
    glmulti.glmulti(y = base.names(df_r)[0],
                    xr = base.names(df_r)[1:],
                    data = df_r,
                    method = "h")
    

    【讨论】:

      猜你喜欢
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 2017-07-24
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      相关资源
      最近更新 更多