Як перебирати стовпчики фреймів даних панд для запуску регресії


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()os similar
EdChum

Відповіді:


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

1
Я, здається, повертаю заголовок стовпця лише тоді, коли використовую цей метод. Так, наприклад: print (df) показує мені дані в стовпцях фрейму даних, але для c в df: print (c) друкує лише заголовок, а не дані.
користувач1761806

5
Добре ігноруй мене - я робив друк (стовпець) не друкувати (df [колонка])
користувач1761806

14
Слідкуйте за однойменними колонками!
freethebees

4
Приємно і стисло. for x in dfХоча я хотів би повторити рядки. : - /
Ерік Думініл

7
for idx, row in df.iterrows()ітерація над рядками. Оскільки спільні операції векторизовані, природно, що основна ітерація над стовпцями :)
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.column відповідно до наших потреб. Наприклад, для перегляду всіх стовпців, окрім першого, ми можемо зробити:

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
Транспонування досить дорога :)
Unfun Cat

Це може бути дорогим, але це чудове рішення для відносно невеликих фреймів даних. Дякую кдаурія!
elPastor

5

Використовуючи розуміння списку, ви можете отримати всі назви стовпців (заголовок):

[column for column in df]


2
Коротша версія: list(df.columns)або[c for c in df]
Unfun Cat


3

Я трохи запізнююся, але ось як я це зробив. Етапи:

  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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.