Эффективное указание имен столбцов с одинаковым префиксом - PullRequest
0 голосов
/ 14 января 2019

Я провожу регресс с моим наблюдением на уровне компании. Я хочу контролировать тип компании [что она производит]. У меня есть эта информация в объектной переменной, которую я превращаю в категориальную, а затем извлекаю из нее пустышки.

df['Product Type'] = df['Product Type'].astype('category')
df =  pd.get_dummies(df, columns=['Product Type']).head()  

Моя выборка довольно большая, и в итоге я получаю много фиктивных переменных. Достаточно много работы, чтобы внедрить их в мою модель один за другим (их может быть 10-15).

reg = sm.OLS(endog=df['Y'], exog= df[['X1', 'Number of workers', 'X2', "Product Type_Jewellery", "Product_Type_Apparel", (all the other product dummies) ]], missing='drop')

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

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Та же идея, что и при простуде при использовании filter

sm.OLS(endog=df['Y'], 
       exog=df.filter(regex=r'X1|X2|Number|Product'), 
       missing='drop')
0 голосов
/ 14 января 2019

Используя statsmodels.formula.api, вам не нужно создавать манекены самостоятельно. Удалите пробелы из имен столбцов и укажите для столбца Категорий C(col_name)

import statsmodels.formula.api as smf

df = df.rename(columns={'Product Type': 'Product_Type',
                        'Number of workers': 'Number_of_workers'})

results = smf.ols(formula = 'Y ~ X1 + X2 + Number_of_workers + C(Product_Type)', 
                  data=df, missing='drop').fit()

Пример данных

import pandas as pd
import numpy as np
np.random.seed(123)
df = pd.DataFrame({'Y': np.random.randint(1,100,200),
                   'X1': np.random.normal(1,20,200),
                   'X2': np.random.normal(-10,1,200),
                   'Number of workers': np.arange(1,201,1)/10,
                   'Product Type': np.random.choice(list('abcde'), 200)})

Выход results.summary()

========================================================================================
                           coef    std err          t      P>|t|      [0.025      0.975]
----------------------------------------------------------------------------------------
Intercept               69.2836     23.105      2.999      0.003      23.711     114.856
C(Product_Type)[T.b]    11.3334      6.941      1.633      0.104      -2.356      25.023
C(Product_Type)[T.c]     1.3745      6.943      0.198      0.843     -12.321      15.070
C(Product_Type)[T.d]     2.0430      6.258      0.326      0.744     -10.300      14.386
C(Product_Type)[T.e]     3.8445      6.273      0.613      0.541      -8.528      16.217
X1                       0.0207      0.113      0.184      0.854      -0.202       0.243
X2                       1.4677      2.177      0.674      0.501      -2.825       5.761
Number_of_workers       -0.5803      0.369     -1.573      0.117      -1.308       0.147
==============================================================================

Обратите внимание, что с формулами api, поскольку ваш products создает полную основу, он автоматически отбросит одну из категорий, поскольку у нас есть перехват, аналогично тому, что вы найдете в stata.

0 голосов
/ 14 января 2019

Используйте str.contains, чтобы найти столбцы, содержащие "Product_ *", и доступ к ним становится легким.

c = df.columns[df.columns.str.contains('Product')]

Если регулярное выражение не требуется, вы можете инициализировать c как

c = df.columns[df.columns.str.contains('Product', regex=False)]

Или, используя str.startswith:

c = df.columns[df.columns.str.startswith('Product')]

Или понимание списка:

c = [c_ for c_ in df if c_.startswith('Product')]

Наконец, получите доступ к подмножеству, распаковав c:

subset = df[['X1', 'Number of workers', 'X2', *c]]
reg = sm.OLS(endog=df['Y'], exog=subset, missing='drop')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...