Как перебирать столбцы фрейма данных pandas для запуска регрессии



Я уверен, что это просто, но как полный новичок в python, у меня возникли проблемы с выяснением, как перебирать переменные в pandas dataframe и запустить регрессию с каждым.



вот что я делаю:



all_data = {}
for ticker in ['FIUIX', 'FSAIX', 'FSAVX', 'FSTMX']:
all_data[ticker] = web.get_data_yahoo(ticker, '1/1/2010', '1/1/2015')

prices = DataFrame({tic: data['Adj Close'] for tic, data in all_data.iteritems()})
returns = prices.pct_change()


Я знаю, что могу запустить регрессию следующим образом:



regs = sm.OLS(returns.FIUIX,returns.FSTMX).fit()


но предположим, я хочу сделать это для каждого столбца в таблице данных. В частности, я хочу регрессировать FIUIX на FSTMX, а затем FSAIX на FSTMX, а затем FSAVX на FSTMX. После каждая регрессия я хочу сохранить остатки.



Я пробовал различные версии следующего, но я должен получить синтаксис неправильно:



resids = {}
for k in returns.keys():
reg = sm.OLS(returns[k],returns.FSTMX).fit()
resids[k] = reg.resid


Я думаю, что проблема в том, что я не знаю, как ссылаться на столбец returns по ключу, поэтому returns[k] Это, наверное, неправильно.



любое руководство по наилучшему способу сделать это было бы очень ценно. Возможно, есть общий подход панд, который мне не хватает.

723   8  

8 ответов:

for column in df:
    print(df[column])

можно использовать iteritems():

for name, values in df.iteritems():
    print '{name}: {value}'.format(name=name, value=values[0])

вы можете индексировать столбцы dataframe по позиции с помощью ix.

df1.ix[:,1]

это возвращает первый столбец, например. (0 будет индекс)

df1.ix[0,]

это возвращает первую строку.

df1.ix[:,1]

это будет значение на пересечении строки 0 и столбца 1:

df1.ix[0,1]

и так далее. Так что вы можете enumerate()returns.keys(): и использовать число для индексации фрейма данных.

этот ответ должен повторяться выбранные столбцы а также все столбцы в DF.

df.columns дает список, содержащий имена всех столбцов в DF. Сейчас это не очень полезно, если вы хотите перебрать все столбцы. Но это пригодится, когда вы хотите перебирать столбцы только по вашему выбору.

мы можем использовать список Python нарезки легко нарезать df.колонки согласно нашим потребностям. Например, для итерации по всем столбцам, кроме первого во-первых, мы можем сделать:

for column in df.columns[1:]:
    print(df[column])

аналогично перебирать все столбцы в обратном порядке, мы можем сделать:

for column in df.columns[::-1]:
    print(df[column])

мы можем перебирать все столбцы множеством интересных способов, используя эту технику. Также помните, что вы можете легко получить индексы всех столбцов, используя:

for ind, column in enumerate(df.columns):
    print(ind, column)

обходной путь заключается в транспонировании DataFrame и повторите по строкам.

for column_name, column in df.transpose().iterrows():
    print column_name

Я немного опоздал, но вот как я это сделал. Шаги:

  1. создать список всех столбцов
  2. используйте itertools, чтобы взять X комбинаций
  3. добавление каждого результата r-квадрат значения в таблице данных и исключенных из списка столбца
  4. Сортировать результат DF в порядке убывания R в квадрате, чтобы увидеть, что лучше всего подходит.

это код, который я использовал на DataFrame называется aft_tmt. Не стесняйтесь экстраполировать на ваше использование случай..

import pandas as pd
# setting options to print without truncating output
pd.set_option('display.max_columns', None)
pd.set_option('display.max_colwidth', None)

import statsmodels.formula.api as smf
import itertools

# This section gets the column names of the DF and removes some columns which I don't want to use as predictors.
itercols = aft_tmt.columns.tolist()
itercols.remove("sc97")
itercols.remove("sc")
itercols.remove("grc")
itercols.remove("grc97")
print itercols
len(itercols)

# results DF
regression_res = pd.DataFrame(columns = ["Rsq", "predictors", "excluded"])

# excluded cols
exc = []

# change 9 to the number of columns you want to combine from N columns.
#Possibly run an outer loop from 0 to N/2?
for x in itertools.combinations(itercols, 9):
    lmstr = "+".join(x)
    m = smf.ols(formula = "sc ~ " + lmstr, data = aft_tmt)
    f = m.fit()
    exc = [item for item in x if item not in itercols]
    regression_res = regression_res.append(pd.DataFrame([[f.rsquared, lmstr, "+".join([y for y in itercols if y not in list(x)])]], columns = ["Rsq", "predictors", "excluded"]))

regression_res.sort_values(by="Rsq", ascending = False)

через постижение списка, вы можете получить все имена столбцов (заголовок):

[column for column in df]

на основе принято отвечать, если индекс соответствующий каждому столбцу также нужные:

for i, column in enumerate(df):
    print i, df[column]

выше df[column] тип Series, который может быть просто преобразован в numpyndarrays:

for i, column in enumerate(df):
    print i, np.asarray(df[column])

Comments

    Ничего не найдено.