Python 2.7 — statsmodels — форматирование и запись итогового вывода

Я выполняю логистическую регрессию, используя pandas 0.11.0 (обработка данных) и statsmodels 0.4.3 для фактической регрессии на Mac OSX Lion.

Я собираюсь запустить ~ 2900 различных моделей логистической регрессии, и мне нужно вывести результаты в файл csv и отформатировать определенным образом.

В настоящее время я знаю только выполнение print result.summary(), которое выводит результаты (как показано ниже) в оболочку:

 Logit Regression Results                           
  ==============================================================================
 Dep. Variable:            death_death   No. Observations:                 9752
 Model:                          Logit   Df Residuals:                     9747
 Method:                           MLE   Df Model:                            4
 Date:                Wed, 22 May 2013   Pseudo R-squ.:                -0.02672
 Time:                        22:15:05   Log-Likelihood:                -5806.9
 converged:                       True   LL-Null:                       -5655.8
                                         LLR p-value:                     1.000
 ===============================================================================
                   coef    std err          z      P>|z|      [95.0% Conf. Int.]
 -------------------------------------------------------------------------------
 age_age5064    -0.1999      0.055     -3.619      0.000        -0.308    -0.092
 age_age6574    -0.2553      0.053     -4.847      0.000        -0.359    -0.152
 sex_female     -0.2515      0.044     -5.765      0.000        -0.337    -0.166
 stage_early    -0.1838      0.041     -4.528      0.000        -0.263    -0.104
 access         -0.0102      0.001    -16.381      0.000        -0.011    -0.009
 ===============================================================================

Мне также понадобится отношение шансов, которое вычисляется print np.exp(result.params) и печатается в оболочке как таковое:

age_age5064    0.818842
age_age6574    0.774648
sex_female     0.777667
stage_early    0.832098
access         0.989859
dtype: float64

Мне нужно, чтобы каждый из них был записан в файл csv в виде очень длинной строки, например (на данный момент я не уверен, понадобятся ли мне такие вещи, как Log-Likelihood, но я включил их для полноты):

`Log-Likelihood, age_age5064_coef, age_age5064_std_err, age_age5064_z, age_age5064_p>|z|,...age_age6574_coef, age_age6574_std_err, ......access_coef, access_std_err, ....age_age5064_odds_ratio, age_age6574_odds_ratio, ...sex_female_odds_ratio,.....access_odds_ratio`

Я думаю, вы поняли картину — очень длинная строка со всеми этими фактическими значениями и заголовок со всеми обозначениями столбцов в аналогичном формате.

Я знаком с csv module в Python и все больше знаком с pandas. Не уверен, что эта информация может быть отформатирована и сохранена в pandas dataframe, а затем записана с использованием to_csv в файл после завершения всех ~2900 моделей логистической регрессии; это конечно было бы хорошо. Также можно записывать их по мере завершения каждой модели (используя csv module).

ОБНОВИТЬ:

Итак, я больше смотрел на сайт statsmodels, в частности, пытаясь выяснить, как результаты модели хранятся в классах. Похоже, есть класс под названием «Результаты», который нужно будет использовать. Я думаю, что использование наследования от этого класса для создания другого класса, в котором изменяются некоторые методы/операторы, может быть подходящим способом, чтобы получить требуемое форматирование. У меня очень мало опыта в том, как это сделать, и мне нужно будет потратить немало времени, чтобы понять это (и это нормально). Если кто-то может помочь / имеет больше опыта, это было бы здорово!

Вот сайт, на котором выложены классы: класс результатов statsmodels


person DMML    schedule 23.05.2013    source источник
comment
Добавил обновление в конец этого вопроса. Пожалуйста, взгляните!   -  person DMML    schedule 24.05.2013
comment
Если вы считаете свое обновление ответом, рассмотрите возможность самостоятельного ответа.   -  person Jacinda    schedule 24.05.2013


Ответы (5)


В настоящее время нет готовой таблицы параметров и статистики их результатов.

По сути, вам нужно складывать все результаты самостоятельно, будь то список, массив numpy или pandas DataFrame, зависит от того, что вам удобнее.

например, если мне нужен один массив numpy, который имеет результаты для модели, llf и результаты в сводной таблице параметров, тогда я мог бы использовать

res_all = []
for res in results:
    low, upp = res.confint().T   # unpack columns 
    res_all.append(numpy.concatenate(([res.llf], res.params, res.tvalues, res.pvalues, 
                   low, upp)))

Но может быть лучше согласовать с пандами, в зависимости от того, какая структура у вас есть в моделях.

Вы можете написать вспомогательную функцию, которая берет все результаты из экземпляра результатов и объединяет их в строку.

(не уверен, что удобнее писать в csv построчно)

изменить:

Вот пример сохранения результатов регрессии в кадре данных.

https://github.com/statsmodels/statsmodels/blob/master/statsmodels/sandbox/multilinear.py#L21

петля находится в строке 159.

summary() и аналогичный код вне статистических моделей, например http://johnbeieler.org/py_apsrtable/ для объединения несколько результатов, ориентирован на печать, а не на хранение переменных.

person Josef    schedule 25.05.2013
comment
Большое спасибо, что нашли время, чтобы прочитать все это и за ответ! Завтра попробую/поэкспериментирую! Изначально я пытался перебрать results.summary(), но это не сработало! - person DMML; 27.05.2013
comment
Еще раз спасибо за это! Извините, это заняло больше времени, чем я сказал, что свяжусь с вами. Я попробовал пример res_all=[], который вы привели, и он вернул TypeError: 'BinaryResultsWrapper' object is not iterable. Любые идеи? Я также посмотрю на github, который вы разместили. - person DMML; 29.05.2013
comment
Кроме того, глядя на это statsmodels.sourceforge.net/stable/_images/ похоже, что я имею дело с "BinaryResultsWrapper", а не просто с результатами... - person DMML; 29.05.2013
comment
Обнаружил, что по вызову, например, result.pvalues можно вывести эти результаты! Спасибо за помощь! Я приму это решение. - person DMML; 29.05.2013

Мне эта формулировка показалась более простой. Вы можете добавлять/вычитать столбцы, следуя синтаксису из примеров (pvals,coeff,conf_lower,conf_higher).

import pandas as pd     #This can be left out if already present...

def results_summary_to_dataframe(results):
    '''This takes the result of an statsmodel results table and transforms it into a dataframe'''
    pvals = results.pvalues
    coeff = results.params
    conf_lower = results.conf_int()[0]
    conf_higher = results.conf_int()[1]

    results_df = pd.DataFrame({"pvals":pvals,
                               "coeff":coeff,
                               "conf_lower":conf_lower,
                               "conf_higher":conf_higher
                                })

    #Reordering...
    results_df = results_df[["coeff","pvals","conf_lower","conf_higher"]]
    return results_df
person Afflatus    schedule 21.04.2016

  • results.params : для коэффициента
  • results.pvalues ​​: для p-значений

Кстати, вы можете использовать dir(results), чтобы узнать все атрибуты объекта

person Atendra    schedule 07.07.2014

Фактически существует встроенный метод, описанный в документации здесь:

f = open('csvfile.csv','w')
f.write(result.summary().as_csv())
f.close()

Я считаю, что это гораздо более простой (и чистый) способ вывода сводок в файлы csv.

person Jinhua Wang    schedule 26.07.2018

person    schedule
comment
Пожалуйста, предоставьте некоторый контекст для вашего ответа. Сам по себе код почти никогда не дает хорошего ответа - person Neuron; 25.04.2018
comment
@swu4, супер ответ. Большое спасибо. - person Md. Sabbir Ahmed; 01.05.2021