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


187

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

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

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[k]что, вероятно, это неправильно.

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


1
Вы можете for i in len(df): if i + 1 != len(df): # sm.OLS(returns[returns.coloumns[i]], returns[returns.columns[ i+1]]), fit()
подписать cols

Ответы:


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

1
Кажется, я получаю только заголовок столбца, когда использую этот метод. Так, например: print (df) показывает мне данные в столбцах dataframe, но для c в df: print (c) печатает только заголовок, а не данные.
user1761806

5
Хорошо, игнорируй меня - я делал print (column), а не print (df [column])
user1761806

14
Не упустите столбцы с тем же именем!
freethebees

4
Это красиво и лаконично. Я бы предпочел for x in dfперебирать строки, хотя. : - /
Эрик Думинил

7
for idx, row in df.iterrows()перебирает строки. Поскольку совместные операции векторизованы, естественно, что основная итерация выполняется над столбцами :)
The Unfun Cat

69

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

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

33

Этот ответ заключается в переборе выбранных столбцов, а также всех столбцов в 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)

21

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

df1.ix[:,1]

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

df1.ix[0,]

Это возвращает первый ряд.

df1.ix[:,1]

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

df1.ix[0,1]

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


8
ixустарела, используйтеiloc
Йохан Обадия

8

Обходной путь - это транспонировать DataFrameи перебирать строки.

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

4
Транспонирование довольно дорогое :)
The Unfun Cat,

Может быть дорого, но это отличное решение для сравнительно небольших фреймов данных. Спасибо, Кдаурия!
elPastor

5

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

[column for column in df]


2
Укороченная версия: list(df.columns)или[c for c in df]
The Unfun Cat

4

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

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

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

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

3

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

  1. Создать список всех столбцов
  2. Используйте itertools для получения х комбинаций
  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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.