【问题标题】:Access the output of python script in R executed through system command访问通过系统命令执行的R中python脚本的输出
【发布时间】:2018-05-13 18:08:43
【问题描述】:

我当前的问题是对以下链接的后续问题。

Not able to import pandas in R

我已经使用系统命令在 R 中执行了 python 代码。现在在python脚本结束时,我想访问在R中创建的Dataframe。一种方法是使用df.to_csv保存在python中创建的Dataframe,然后将其导入R。但我想知道直接访问输出的任何有效方法在R中。

x=system("/Users/ravinderbhatia/anaconda/bin/python /Users/ravinderbhatia/Downloads/Untitled3.py EMEA regulatory '10% productivity saves SOW'")

输出数据帧是:

description                       status region
10  10% productivity saves SOW   pending   EMEA
16  10% productivity saves SOW  approved   EMEA

X 只包含 0/1(状态)。如上所述,如何在R中直接访问Dataframe而不保存它。

Python script used is:


import pandas as pd 
import numpy as np
import sys


from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

arg1 = sys.argv[1]
arg2 = sys.argv[2]
arg3 = sys.argv[3]
print (arg1)
print (arg2)
print (arg3)

def get_similar_CRs(arg1, arg2,arg3):
##create dummy data
    cr_id=range(1,41)

    description=['change in design','More robust system required',
                 'Grant system adminstrator rights',
                 'grant access to all products',
                 'Increase the credit limit',
                 'EDAP Scenario',
                 'Volume prpductivity for NA 2015',
                 '5% productivity saves SOW',
                 'effort reduction',
                 'reduction of false claims',
                 'Volume productivity EMEA',
                 'Volume productivity for NA 2016',
                 '10% productivity saves SOW',
                ]
    region=['EMEA','Asia Pacific','UK']

    business=['card','secured loan','mortgage']
    type=['regulatory','system','audit']

    status=['pending','approved']

    data=pd.DataFrame()
    data['description']=np.random.choice(description, 40)
    data['cr_id']=cr_id
    data['region']=np.random.choice(region,40)
    data['business']=np.random.choice(business, 40)
    data['status']=np.random.choice(status,40)
    data['type']=np.random.choice(type,40)

    subset_data=data.loc[data.region == arg1]
    print (subset_data.head())
    subset_data=subset_data.loc[subset_data.type ==arg2]

    ##This has to be captured dynamically
    new_cr=arg3

    cr_list=data['description'].unique().tolist()

    similar_CR=[] ###global variable
#     for new_cr in new_cr_lis
    for cr in cr_list:
        result=similar(new_cr,cr)
        if result >=0.8:
            similar_CR.append(cr)

    temp=subset_data.loc[subset_data.description.isin(similar_CR)]
    temp=temp[['description','status','region']]
    return temp

temp= get_similar_CRs (arg1, arg2, arg3)

print temp

【问题讨论】:

    标签: python r system


    【解决方案1】:

    我建议查看reticulate 包(请参阅online vignette)。

    您可以使用py_run_file() 运行您的文件并使用py 访问python 主模块。所以假设你的文件叫做“Untitled3.py”,它创建的数据框叫做df,那么

    library(reticulate)
    
    use_python("/Users/ravinderbhatia/anaconda/bin/python")
    
    py_run_file("Untitled3.py")
    
    py$df
    

    编辑

    或者,您可以只从 python 文件中导入函数,然后从 R 中调用它们。例如,将 python 文件作为

    import pandas as pd 
    import numpy as np
    import sys
    from difflib import SequenceMatcher
    
    def similar(a, b):
        return SequenceMatcher(None, a, b).ratio()
    
    def get_similar_CRs(arg1, arg2,arg3):
        ##create dummy data
        cr_id=range(1,41)
    
        description=['change in design','More robust system required',
                     'Grant system adminstrator rights',
                     'grant access to all products',
                     'Increase the credit limit',
                     'EDAP Scenario',
                     'Volume prpductivity for NA 2015',
                     '5% productivity saves SOW',
                     'effort reduction',
                     'reduction of false claims',
                     'Volume productivity EMEA',
                     'Volume productivity for NA 2016',
                     '10% productivity saves SOW',
                    ]
        region=['EMEA','Asia Pacific','UK']
    
        business=['card','secured loan','mortgage']
        type=['regulatory','system','audit']
    
        status=['pending','approved']
    
        data=pd.DataFrame()
        data['description']=np.random.choice(description, 40)
        data['cr_id']=cr_id
        data['region']=np.random.choice(region,40)
        data['business']=np.random.choice(business, 40)
        data['status']=np.random.choice(status,40)
        data['type']=np.random.choice(type,40)
    
        subset_data=data.loc[data.region == arg1]
        print (subset_data.head())
        subset_data=subset_data.loc[subset_data.type ==arg2]
    
        ##This has to be captured dynamically
        new_cr=arg3
    
        cr_list=data['description'].unique().tolist()
    
        similar_CR=[] ###global variable
    #     for new_cr in new_cr_lis
        for cr in cr_list:
            result=similar(new_cr,cr)
            if result >=0.8:
                similar_CR.append(cr)
    
        temp=subset_data.loc[subset_data.description.isin(similar_CR)]
        temp=temp[['description','status','region']]
        return temp
    

    然后运行

    library(reticulate)
    
    # To install pandas and numpy in the regular python environment
    py_install("pandas", "numpy")
    
    py_run_file("Untitled3.py")
    
    py$get_similar_CRs("EMEA", "regulatory", "10% productivity saves SOW")
    
    #>                   description  status region
    #> 2  10% productivity saves SOW pending   EMEA
    #> 25 10% productivity saves SOW pending   EMEA
    

    【讨论】:

    • 我听说过网状包。所以你建议避免系统命令并更好地使用网状包。
    • 是的。它将为您提供一个更易于使用的 Python 代码界面;您还可以创建 python 函数并从 R 中调用它们。
    • py_run_file 给了我在上一个问题中遇到的相同问题。没有找到熊猫。它正在执行系统 ​​python,而不是 Anaconda Python。
    • 您可以指定要与use_python() 一起使用的python。查看更新的答案。
    • 如果没有最小的可重现示例,很难进一步提供帮助。你能分享你的python代码吗?
    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多