【问题标题】:Python Pandas - Passing a dataframe to other functionsPython Pandas - 将数据框传递给其他函数
【发布时间】:2017-05-23 11:17:37
【问题描述】:

编辑 - 我找到了一种使用 dataframe.describe() 进行数据帧的方法 - 我在更正的版本下面附上了 - 这样“DataExtract”只运行一次,然后返回数据帧以用于回归或散点图函数。

import pandas as pd


# Extracting the data - Real query would be extracting X and Y from a SQL query and converting to a pandas frame
def DataExtract(Y, X):
    d = {Y: [1, 3, 3, 9, 5],
         X: [6, 7, 8, 9, 10]}
    df = pd.DataFrame(d)
    df = df.copy(deep=True)
    return df


# Build process using the data extracted in DataExtract
def Regression(df):
    from statsmodels.formula.api import ols
    df.describe()
    df.columns = ['Y', 'X']
    model = ols("Y ~ X", df).fit()
    print(model.summary())


# Plot a graph for a given dataframe
def ScatterPlot(df):
    import matplotlib.pyplot as plt
    df.describe()
    df.columns = ['Y', 'X']
    df.plot.scatter(x='X', y='Y')
    plt.show()

DataSet = DataExtract("a","b")
Regression(DataSet)

-- 我已经开始开发一些分析功能并在初级阶段使用 Python,这主要归功于这个网站

我在下面附上了一个简化的示例,说明我当前如何编译我的函数,然后由 GUI 调用,这里我们有一个“DataExtract”函数生成一个框架,然后是“回归”或“ScatterPlot”,具体取决于用户想要处理数据。

然后用户将调用“CombinedRegression”或“CombinedScatterPlot”来生成输出

    import pandas as pd

    #Extracting the data - Real query would be extracting X and Y from a SQL query and converting to a pandas frame
    def DataExtract(Y, X):
            d = {Y : [1, 3, 3, 9, 5],
                 X : [6, 7, 8, 9, 10]}
            df = pd.DataFrame(d)
            df = df.copy(deep=True)
            return df

    #Build process using the data extracted in DataExtract
    def Regression(df):
            from statsmodels.formula.api import ols
            df.columns = ['Y','X']
            model = ols("Y ~ X", df).fit()
            print(model.summary())

    #Plot a graph for a given dataframe
    def ScatterPlot(df):
            import matplotlib.pyplot as plt
            df.columns = ['Y', 'X']
            df.plot.scatter(x='X', y='Y')
            plt.show()

   def CombinedRegression(Y,X):
        Regression(DataExtract(Y, X))

    def CombinedScatterPlot(Y,X):
        ScatterPlot(DataExtract(Y, X))

    CombinedRegression("given Y","given X")

    CombinedScatterPlot("given Y","given X")

这座建筑效率不高,因为我必须调用“组合”函数才能获得输出,这最终迫使我每次都生成“DataExtract”函数,即使它是用于两个回归的相同数据和散点图函数。 GUI 将根据单击的按钮向任一函数发出 a 和 b 槽

最终我想做的是 1) 使用参数 a 和 b 提取数据,以及 2) 在给定用户给出的命令的情况下,在回归或散点图中使用框架,或同时使用两者。

非常感谢您的帮助

【问题讨论】:

    标签: python performance function pandas parameter-passing


    【解决方案1】:

    一种方法是传递数据帧X 和数据帧Y

    import pandas as pd
    
    #Extracting the data - Real query would be extracting X and Y from a SQL query and converting to a pandas frame
    def DataExtract(Y, X):
        d = {Y : [1, 3, 3, 9, 5],
                 X : [6, 7, 8, 9, 10]}
        return df_X, df_Y
    
    #Build process using the data extracted in DataExtract
    def Regression(X, Y):
       from statsmodels.formula.api import ols
       model = ols("Y ~ X", df).fit()
       print(model.summary())
    
    #Plot a graph for a given dataframe
    def ScatterPlot(X, Y):
        import matplotlib.pyplot as plt
        plt.scatter(x=X, y=Y)
        plt.show()
    
    if __name__ == '__main__':
        X, Y = DataExtract()
        Regression(X, Y)
        Scatterplot(X, Y)
    

    【讨论】:

    • 您好 Roelant,感谢您的回答。我尝试运行您编写的序列并遇到错误,即使我将 2 个数据帧 df_X、df_Y 定义为 pd.DataFrame 它们似乎也没有传递给 Regression 或 ScatterPlot 函数。
    【解决方案2】:

    您真正需要做的就是使用您需要传递的 X、Y 参数调用您要运行的主函数。然后,在这些函数中,将其传递给 DataExtract 函数,该函数将创建并返回您的数据框,然后从那里继续。

    import pandas as pd
    
    #Extracting the data - Real query would be extracting X and Y from a SQL query and converting to a pandas frame 
    def DataExtract(Y, X): 
        d = {Y : [1, 3, 3, 9, 5], X : [6, 7, 8, 9, 10]} 
        df = pd.DataFrame(d)
        return df 
    
    #Build process using the data extracted in DataExtract 
    def Regression(X, Y):
        from statsmodels.formula.api import ols
        df = DataExtract(X, Y) 
        df.columns = ['Y','X']
        model = ols("Y ~ X", df).fit()
        print(model.summary()) 
    
    #Plot a graph for a given dataframe 
    def ScatterPlot(X, Y): 
        import matplotlib.pyplot as plt
        df = DataExtract(X, Y)
        df.columns = ['Y', 'X']
        df.plot.scatter(x='X', y='Y')
        plt.show()
    

    ...如果用户想要两者都做,您可以执行以下操作:

    def DoBoth(X, Y):
        ScatterPlot(X, Y)
        Regression(X, Y)
    

    【讨论】:

    • 嗨 pshep,感谢您的回答,您的序列运行完美,但是由于每次运行“回归”或“散点图”时都会运行 DataExtract,我们仍然会遇到效率问题,我想隔离“如果可能的话,从其他两个函数中提取“数据提取”(真正的“数据提取”查询会消耗更多内存)并运行一次,然后使用生成的帧。
    • 不知道数据是如何被调用的,可能无法在调用之间将数据帧保存在内存中。将数据框保存到文件(或另一个数据库)并调用它可能会容易得多,因为我假设提取的数据会比完整的数据集小得多。
    • @MatNaomi - 如果需要,我只是添加了一点来运行这两个函数。
    猜你喜欢
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2013-02-15
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多