如何修改此功能以接受多个数据帧?

How do I modify this function to accept multiple Dataframes?

我写了这个函数,我希望它接受一个以上的 DF,这样最终的图就有多条预测线,coef_DF 可以用其余的系数完成。

该函数从一个更大的数据集中提取所需的特征和目标,使用线性回归函数进行预测,然后建立模型,在数据集上绘制直线,并 returns 一个 df 与所有系数。

(这只是一个练习。)

def prep_model_and_predict(feature, target, dataset, degree):


    # part 1: make a df with relevant format and features 
        # degree >=1

    poly_df=pd.DataFrame()
    poly_df[str(target)] = dataset[str(target)]
    poly_df['power_1']   = dataset[str(feature)]

    #cehck if degree >1
    if degree > 1:
        for power in range(2, degree+1): #loop over reaming deg
            name = 'power_'+str(power)
            poly_df[name]=poly_df['power_1'].apply(lambda x: x**power)

    #part 2: make model and predictions

    features=list(poly_df.columns[1:])
    X=poly_df[features]
    y=poly_df[str(target)]
    model=LinearRegression().fit(X,y)
    predictions=model.predict(X)

    #part 3: put weghts in a nice df

    coef_df=pd.DataFrame()
    coef_df=coef_df.append({"Name":'Intercept', 'Value':model.intercept_},     ignore_index=True)
    coef_df=coef_df.append({'Name':'Power_1',   'Value':model.coef_[0]},   ignore_index=True)

    if degree > 1:
        for degree in range(2, degree+1):
            name = 'Power_' + str(degree)
            coef_df = coef_df.append({"Name":name, 
                                      'Value':'{:.3e}'.format(model.coef_[degree-1])}, ignore_index=True)
    #prt 4: plot it

    fig, ax = plt.subplots()
    ax.plot(poly_df['power_1'], poly_df[str(target)], '.',
            poly_df['power_1'], predictions, '-')

    ax.set_xlabel('Square footage, living area')
    ax.set_ylabel('Price per Sqft')
    ax.ticklabel_format(axis='y', style='sci', scilimits=(-2,2))

    return coef_df, ax

这是结果:

         Name        Value
0   Intercept       506738
1     Power_1  2.71336e-77
2     Power_2    7.335e-39
3     Power_3   -1.850e-44
4     Power_4    8.437e-50
5     Power_5    0.000e+00
6     Power_6    0.000e+00
7     Power_7    3.645e-55
8     Power_8    1.504e-51
9     Power_9    5.760e-48
10   Power_10    1.958e-44
11   Power_11    5.394e-41
12   Power_12    9.404e-38
13   Power_13   -3.635e-41
14   Power_14    4.655e-45
15   Power_15   -1.972e-49

非常感谢!

我不确定您的具体要求是什么。但我建议,下次尝试问一个容易 produce-able 并且可以由其他人在 SO 中运行的问题。

我已经尽力回答你的问题了。如果我误解了你的问题,请纠正我。

  • 将任意数量的 DataFrame 传递给您的函数并绘制它:

我创建了三个随机数据帧供使用:

df1 = pd.DataFrame(np.random.randint(0,10,size=(10, 2)), columns=list('AB'))
df2 = pd.DataFrame(np.random.randint(0,10,size=(10, 2)), columns=list('AB'))
df3 = pd.DataFrame(np.random.randint(0,10,size=(10, 2)), columns=list('AB'))

绘制它们的函数:

def plot_me(*kwargs):
    plt.figure(figsize=(13,9))
    lab_ind = 0
    for i in kwargs:

        plt.plot(i['A'], i['B'], label = lab_ind)
        lab_ind += 1
    plt.legend()
    plt.show()

得到的结果图:


  • 将模型的结果放入 DataFrame

关于你的第二个问题,我不会过多地关注你的确切细节——例如你的数据框的列名等。

对于这个特定示例,我生成了两个随机数组:

X = np.random.randint(0,50 ,size=(50, 2))
y = np.random.randint(0,2 ,size=(50, 1))

然后在该数据上拟合线性回归模型

model=LinearRegression().fit(X,y)
predictions=model.predict(X)

然后将其添加到 DataFrame 中:

res_df = pd.DataFrame(predictions,columns = ['Value'])

如果你打印 res_df

    Value
0   0.420395
1   0.459389
2   0.369648
3   0.416058
4   0.644088
5   0.362072
6   0.363157
7   0.468943
.      .
.      .