#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)
…