2016-01-22 3 views
2

У меня есть dataframe, который имеет около 370 столбцов. Я тестирую серию гипотез, которые требуют от меня использовать подмножества модели для соответствия кубической регрессионной модели. Я планирую использовать statsmodels для моделирования этих данных.Более эффективный способ означать центрирование подмножества столбцов в фрейме данных pandas и сохранение имен столбцов

Часть процесса для полиномиальной регрессии включает в себя средние значения центрирующих переменных (вычитая среднее из каждого случая для определенной функции).

Я могу сделать это с 3 строками кода, но это кажется неэффективным, учитывая, что мне нужно воспроизвести этот процесс на полдюжины гипотез. Имейте в виду, что мне нужно данные на уровне коэффициентов из вывода statsmodel, поэтому мне нужно сохранить имена столбцов.

Загляните на данные. Это подмножество столбцов, которые мне нужны для одного из моих тестов гипотез.

 i we you shehe they ipron 
0 0.51 0 0 0.26 0.00 1.02 
1 1.24 0 0 0.00 0.00 1.66 
2 0.00 0 0 0.00 0.72 1.45 
3 0.00 0 0 0.00 0.00 0.53 

Вот код, который означает центры и хранит имена столбцов.

from sklearn import preprocessing 
#create df of features for hypothesis, from full dataframe 
h2 = df[['i', 'we', 'you', 'shehe', 'they', 'ipron']] 

#center the variables 
x_centered = preprocessing.scale(h2, with_mean='True', with_std='False') 

#convert back into a Pandas dataframe and add column names 
x_centered_df = pd.DataFrame(x_centered, columns=h2.columns) 

Любые рекомендации относительно того, как сделать это более эффективным/быстрым, были бы замечательными!

ответ

2
df.apply(lambda x: x-x.mean()) 

%timeit df.apply(lambda x: x-x.mean()) 
1000 loops, best of 3: 2.09 ms per loop 

df.subtract(df.mean()) 

%timeit df.subtract(df.mean()) 
1000 loops, best of 3: 902 µs per loop 

и получают:

 i we you shehe they ipron 
0 0.0725 0 0 0.195 -0.18 -0.145 
1 0.8025 0 0 -0.065 -0.18 0.495 
2 -0.4375 0 0 -0.065 0.54 0.285 
3 -0.4375 0 0 -0.065 -0.18 -0.635 
+0

Спасибо очень много! Лямбда-функция отлично работала. Решения Python настолько просты ... Я всегда полагаю, что они будут более сложными, чем они всегда оказываются. еще раз спасибо !!! –

+0

Знаете ли вы, почему среднее значение, которое я получаю от такой операции, не равно нулю? –

+0

Если он очень близок к нулю (скажем, e-15), то это float-представление. Если он действительно отличается от нуля, то что-то еще отключено. Попробуйте, например: np.random.seed (42) values ​​= np.random.randint (-100, 100, 50) np.mean (значения - np.mean (значения)), что дает 3.97903932026e-15. – Stefan

Смежные вопросы