如何修改此功能以接受多个Dataframe?

时间:2018-03-17 15:14:57

标签: python pandas machine-learning regression analytics

我写了这个函数,我希望它能接受多个DF,这样最终的绘图会有多个预测的绘制线,而coef_DF会用其余的系数完成。

该函数从更大的数据集中提取所需的特征和目标,以使用线性回归函数进行预测,然后生成模型,在数据集上绘制线条并返回包含所有系数的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

enter image description here

非常感谢!

1 个答案:

答案 0 :(得分:1)

我不确定你究竟要求的是什么。但我建议,下次尝试在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()

您得到的结果图:

enter image description here

  • 将模型的结果放入DataFrame

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

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

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

然后在此数据上插入 LinearRegression模型

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
.      .
.      .