如何迭代pandas数据框的列以运行回归

我确信这很简单,但作为python的一个完整的新手,我很难找出如何遍历pandas数据框中的variables,并与每个运行一个回归。

这是我正在做的事情:

 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() 

但是假设我想为数据框中的每一列执行此操作。 特别是,我想在FSTMX上倒退FIUIX,然后在FSTMX上倒退FSAIX,然后在FSTMX上倒退FSAVX。 每次回归后,我想存储残差。

我已经尝试了以下各种版本,但我必须得到错误的语法:

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

我认为问题是我不知道如何通过键引用返回列,所以returns[k]可能是错误的。

任何指导最好的方式来做到这一点将不胜感激。 也许我错过了一种常见的pandas方法。

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

你可以使用iteritems()

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

您可以使用ix按位置对数据框列编制索引。

 df1.ix[:,1] 

这例如返回第一列。 (0将是索引)

 df1.ix[0,] 

这将返回第一行。

 df1.ix[:,1] 

这将是行0和列1的交点处的值:

 df1.ix[0,1] 

等等。 所以你可以enumerate() returns.keys():并使用数字索引数据框。

解决方法是转置DataFrame并遍历行。

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

这个答案是迭代选定的列以及DF中的所有列。

df.columns给出了一个包含DF中所有列名的列表。 现在,如果你想迭代所有的列,这不是很有用。 但是当你想迭代你所select的列时,它就派上用场了。

我们可以根据我们的需要,轻松地使用Python的列表切片来分割df.columns。 例如,要遍历除第一列之外的所有列,我们可以这样做:

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

与以相反顺序遍历所有列类似,我们可以这样做:

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

我们可以使用这种技术以很多很酷的方式迭代所有的列。 另外请记住,您可以轻松使用所有列的索引:

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

我有点晚了,但是我是这么做的。 步骤:

  1. 创build所有列的列表
  2. 使用itertools来获取x个组合
  3. 将每个结果的R平方值与排除列列表一起追加到结果数据框中
  4. 按R的降序对结果DF进行sorting,以查看哪一个最适合。

这是我在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]