Запуск анализа данных в разделах .groupby()

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Для текущего проекта я планирую выполнить тест на гетероскедастичность для набора данных, состоящего из столбцов Quarter , Policies и ProCon .

Я хотел бы выполнить отдельный тест для каждого отдельного квартала в наборе данных. Однако результат, который я в настоящее время получаю с помощью df.groupby(['Quarter']) , выглядит следующим образом:

 2009Q1   [(Lagrange multiplier statistic, 1.98098210004...
2009Q2   [(Lagrange multiplier statistic, 1.98098210004...
2009Q3   [(Lagrange multiplier statistic, 1.98098210004...
2009Q4   [(Lagrange multiplier statistic, 1.98098210004...
2010Q1   [(Lagrange multiplier statistic, 1.98098210004...
2010Q2   [(Lagrange multiplier statistic, 1.98098210004...
2010Q3   [(Lagrange multiplier statistic, 1.98098210004...
  

В настоящее время скрипт рассматривает глобальные данные, а не данные, относящиеся к конкретному кварталу, при запуске через набор. Есть ли какая-нибудь разумная настройка, чтобы сделать этот анализ отдельным для каждого квартала?

Соответствующий фрагмент кода выглядит следующим образом:

 df = pd.read_csv("hetsca.csv")
df = df.fillna("")

def analysis(row):

    #fit regression model
    fit = smf.ols('Policies ~ ProCon', data=df).fit()

    #perform Bresuch-Pagan test
    names = ['Lagrange multiplier statistic', 'p-value', 'f-value', 'f p-value']
    test = sms.het_breuschpagan(fit.resid, fit.model.exog)

    result = lzip(names, test)
    return result

# Grouping data and assigning this as a new dataframe
newdf = df.groupby(['Quarter']).apply(analysis).to_frame(name = 'result')
newdf.to_excel('result.xlsx')
  

Ответ №1:

Из того, что я мог понять ваш вопрос, я бы предложил следующую версию в code

 df = pd.read_csv("hetsca.csv")
df = df.fillna("")

def analysis(qtr, group):

    #fit regression model
    fit = smf.ols('Policies ~ ProCon', data=group).fit()

    #perform Bresuch-Pagan test
    names = ['Lagrange multiplier statistic', 'p-value', 'f-value', 'f p-value']
    test = sms.het_breuschpagan(fit.resid, fit.model.exog)

    #result = lzip(names, test)
    result = pd.DataFrame(data=[test], columns=names)
    result['Quarter']=qtr
    return result

# Grouping data and assigning this as a new dataframe
result = []
for qtr, group in df.groupby(['Quarter']):
    if len(result):
       result = pd.concat([result, analysis(qtr, group)])
    else:
       result = analysis(qtr, group)

# newdf = df.groupby(['Quarter']).apply(analysis).to_frame(name = 'result')
result.to_excel('result.xlsx')
  

Комментарии:

1. Спасибо за отличный вклад — я запускал ваш отредактированный / дополненный код. Для строки осталось только одно TypeError: cannot concatenate object of type '<class 'list'>'; only Series and DataFrame objs are valid сообщение result = pd.concat([result, analysis(group)]) , после этого скрипт, надеюсь, должен выполняться через

2. На самом деле я работал над аналогичной задачей, в которой мне приходилось обрабатывать группы из DataFrame по отдельности. Я реализовал это таким образом. Я сделал одну редакцию в цикле for, пожалуйста, попробуйте отредактированный код.

3. Я запускал скрипт еще раз. Он по-прежнему выдает ошибку TypeError: cannot concatenate object of type '<class 'list'>'; only Series and DataFrame objs are valid . Позвольте мне проверить, что может быть причиной этого…

4. поскольку test — это список, мне пришлось соответствующим образом отредактировать код, теперь он должен работать, пожалуйста, попробуйте

5. Мы добираемся до цели — еще раз спасибо за ваше участие. Теперь я вижу ValueError: Shape of passed values is (4, 1), indices imply (4, 4) строку return pd.DataFrame(data=test, columns=names)