Проблема с вложенным циклом и df.append

#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()
...