#python #pandas #loops #scikit-learn #regression
#python #панды #циклы #scikit-учиться #регрессия
Вопрос:
Доброе утро,
У меня есть следующий набор данных (составляющий это, поскольку основной набор данных является конфиденциальным):
country city total_customer total_purchase total_items
France Paris 2355231 7848589 84454
Germany Berlin 3211551 5646545 84564
Я хочу запустить линейную регрессию для каждой комбинации стран и городов и вывести ее в качестве конечного фрейма данных pandas следующим образом:
country city coef1 coef2 intercept
France Paris -0.294942 258.471387 -625.582231
Germany Berlin 1.987 422.4554 454.645
До сих пор я написал следующий код (мой набор данных небольшой, максимум 10 тыс. строк, поэтому я не слишком беспокоюсь о производительности):
import pandas as pd
from sklearn import linear_model
import statsmodels.api as sm
countries = df["country"].unique()
cities = df["city"].unique()
df_results = pd.DataFrame([], columns=['country','city','coef1','coef2','intercept'])
for country in countries:
for city in cities:
df[(df['country']== country)amp;(df['city']== city)]
y = df["total_customer"]
y = y.dropna()
x = df[["total_purchase","total_items"]]
x = x.dropna()
regr = linear_model.LinearRegression()
if df.empty:
continue
else:
regr.fit(x, y)
coef1 = regr.coef_[0]
coef2 = regr.coef_[1]
intercept = regr.intercept_
df_results = df_results.append({'country':country,'city':city,'coef1':coef1,'coef2':coef2,'intercept':intercept}, ignore_index=True)
Вывод следующий:
df_results
country city coef1 coef2 intercept
0 France Paris -0.294942 258.471387 -625.582231
1 Germany Berlin -0.294942 258.471387 -625.582231
Похоже, что результаты для coef1, coef2 и intercept будут одним выводом вместо вывода каждого запуска линейной регрессии, и я, похоже, не могу это исправить, поэтому, если кто-нибудь может просветить меня здесь, это было бы оценено, спасибо!
Комментарии:
1. Мне кажется, что вы подгоняете весь df, следите за
for city in cities
тем, чтобы вы не присваивали свой df обратно чему-либо.
Ответ №1:
У вас ошибка в первой строке в вашем цикле for:
df[(df['country']== country)amp;(df['city']== city)]
Есть пара вещей. Во-первых, здесь нет присваивания — вы просто указываете отфильтрованный фрейм данных, но не сохраняете его в переменной, поэтому позже в своих вычислениях вы каждый раз выполняете регрессию для всего вашего набора данных.
Во-вторых, если бы вы это сделали df = df[<filters>]
, у вас все равно была бы проблема, потому что вы каждый раз сокращали бы свой фрейм данных.
Что вы хотите сделать, это сохранить отфильтрованный фрейм данных как новую переменную, а затем использовать его для последующих вычислений:
df2 = df[(df['country']== country)amp;(df['city']== city)]
y = df2["total_customer"]
y = y.dropna()
x = df2[["total_purchase","total_items"]]
x = x.dropna()
...