Как выполнить сложное объединение в Pandas с терминами взаимодействия из вывода Statsmodel - PullRequest
0 голосов
/ 24 апреля 2019

Это расширение этой очереди: Для объединения сложных таблиц панд

У меня есть три разных взаимодействия в statsmodels GLM. Мне нужна финальная таблица, которая объединяет коэффициенты с другими результатами одномерного анализа.

Ниже приведен пример того, как выглядят таблицы с семейным положением и возрастным взаимодействием в модели. final_table - это таблица, в которой содержатся одномерные результаты. Я хочу объединить значения коэффициентов (среди других статистических данных, p_values, standard_error и т. Д.) Из результатов модели в эту финальную таблицу (это model_results в приведенном ниже коде).

df = {'variable': ['CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model'
                   ,'married_age','married_age','married_age', 'class_cc', 'class_cc', 'class_cc', 'class_cc', 'class_v_age'
                  ,'class_v_age','class_v_age', 'class_v_age'],
      'level': [0,100,200,250,500,750,1000, 'M_60', 'M_61', 'S_62', 'Harley_100', 'Harley_1200', 'Sport_1500', 'other_100'
                ,'Street_10', 'other_20', 'Harley_15', 'Sport_10'],
      'value': [460955.7793,955735.0532,586308.4028,12216916.67,48401773.87,1477842.472,14587994.92,10493740.36,36388470.44
                ,31805316.37, 123.4, 4546.50, 439854.23, 2134.4, 2304.5, 2032.30, 159.80, 22]}


final_table1 = pd.DataFrame(df)
final_table1

Присоединяйтесь к вышесказанному с помощью различных способов, которыми statsmodels сообщает результаты:

df2 = {'variable': ['intercept','driver_age_model:C(marital_status_model)[M]', 'driver_age_model:C(marital_status_model)[S]'
                    , 'CLded_model','C(class_model)[Harley]:v_age_model', 'C(class_model)[Sport]:v_age_model'
                    ,'C(class_model)[Street]:v_age_model', 'C(class_model)[other]:v_age_model'
                    , 'C(class_model)[Harley]:cc_model', 'C(class_model)[Sport]:cc_model' , 'C(class_model)[Street]:cc_model'
                    , 'C(class_model)[other]:cc_model']
       ,'coefficient': [-2.36E-14,-1.004648e-02,-1.071730e-02, 0.00174356,-0.07222433,-0.146594998,-0.168168491,-0.084420399
                        ,-0.000181233,0.000872798,0.001229771,0.001402564]}
model_results = pd.DataFrame(df2)
model_results

С желаемым конечным результатом:

df3 = {'variable': ['intercept', 'CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model'
                   ,'married_age','married_age','married_age', 'class_cc', 'class_cc', 'class_cc', 'class_cc', 'class_v_age'
                  ,'class_v_age','class_v_age', 'class_v_age'],
      'level': [None,0,100,200,250,500,750,1000, 'M_60', 'M_61', 'S_62', 'Harley_100', 'Harley_1200', 'Sport_1500', 'other_100'
                ,'Street_10', 'other_20', 'Harley_15', 'Sport_10'],
      'value': [None, 460955.7793,955735.0532,586308.4028,12216916.67,48401773.87,1477842.472,14587994.92,10493740.36,36388470.44
                ,31805316.37, 123.4, 4546.50, 439854.23, 2134.4, 2304.5, 2032.30, 159.80, 22],
       'coefficient': [-2.36E-14, 0.00174356,  0.00174356,  0.00174356,  0.00174356,  0.00174356 ,0.00174356 , 0.00174356
                       ,-1.004648e-02, -1.004648e-02,-1.071730e-02,-1.812330e-04,-1.812330e-04,8.727980e-04,1.402564e-03
                      ,-1.681685e-01, -8.442040e-02, -1.812330e-04, -1.465950e-01]}

results = pd.DataFrame(df3)
results

Когда я реализовал первый ответ, он произвел этот ответ.

1 Ответ

1 голос
/ 24 апреля 2019
df = {'variable': ['CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','married_age','married_age','married_age'],
      'level': [0,100,200,250,500,750,1000, 'M_60', 'M_61', 'S_62'],
      'value': [460955.7793,955735.0532,586308.4028,12216916.67,48401773.87,1477842.472,14587994.92,10493740.36,36388470.44,31805316.37]}


df2 = {'variable': ['intercept','driver_age_model:C(marital_status_model)[M]', 'driver_age_model:C(marital_status_model)[S]', 'CLded_model'],
       'coefficient': [-2.36E-14,-1.004648e-02,-1.071730e-02, 0.00174356]}

df3 = {'variable': ['intercept', 'CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','married_age','married_age','married_age'],
       'level': [None, 0,100,200,250,500,750,1000, 'M_60', 'M_61', 'S_62'],
       'value': [None, 60955.7793,955735.0532,586308.4028,12216916.67,48401773.87,1477842.472,14587994.92,10493740.36, 36388470.44,31805316.37],
       'coefficient': [-2.36E-14, 0.00174356,  0.00174356,  0.00174356,  0.00174356,  0.00174356 ,0.00174356 , 0.00174356,-1.004648e-02, -1.004648e-02,-1.071730e-02]}

final_table = pd.DataFrame(df)
model_results = pd.DataFrame(df2)
results = pd.DataFrame(df3)

# Change slightly df to match what we're going to merge
final_table.loc[final_table['variable'] == 'married_age', 'variable'] = 'married_age-'+final_table.loc[final_table['variable'] == 'married_age', 'level'].str[0]

# Clean df2 and get it ready for merge
model_results['variable'] = model_results['variable'].str.replace('driver_age_model:C\(marital_status_model\)\[', 'married_age-')\
                                                     .str.strip('\]')
# Merge
df4 = final_table.merge(model_results, how = 'outer', left_on = 'variable', right_on = 'variable')

#Clean
df4['variable'] = df4['variable'].str.replace('-.*', '', regex = True)

Практически то же самое, что и в прошлый раз, единственная разница была в том, как вы чистите df2.

...