Подтвердить что ты не робот

Как перебирать столбцы pandas dataframe для запуска регрессии

Я уверен, что это просто, но как полный новичок на 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()

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Этот ответ заключается в переборе выбранных столбцов, а также всех столбцов в DF.

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

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

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)

Ответ 4

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

df1.ix[:,1]

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

df1.ix[0,]

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

df1.ix[:,1]

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

df1.ix[0,1]

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

Ответ 5

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

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

Ответ 6

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

[column for column in df]

Ответ 7

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

  • Создайте список всех столбцов
  • Используйте itertools для принятия комбинаций x
  • Добавить каждый результат R-квадрат в результирующий фрейм данных вместе с исключенным списком столбцов
  • Сортировка результата 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)

Ответ 8

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

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

Приведенный выше тип df[column] - это Series, который можно просто преобразовать в numpy ndarray s:

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

Ответ 9

Для перебора содержимого фрейма данных (а не его имен столбцов) вы можете использовать

# df has 3 columns and 5 rows
df = pd.DataFrame(np.random.randint(0, 10, (5, 3)), columns=['A','B','C'])

for col in df.values:
    print(col)

какие выводы

[5 5 0]
[7 4 5]
[4 1 6]
[2 3 4]
[6 0 4]

Чтобы выполнить итерацию по столбцу, а не по строке, просто df.values:

for col in df.values.T:
    print(col)
[5 7 4 2 6]
[5 4 1 3 0]
[0 5 6 4 4]