我在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()
但是我如何为数据框架中的每一列做到这一点呢?具体来说,我如何遍历列,以便在每个列上运行回归?
具体来说,我想在FSTMX上回归彼此的股票代码(FIUIX, FSAIX和FSAVX),并存储每次回归的残差。
我尝试过以下几种方法,但没有一种能达到预期的效果:
resids = {}
for k in returns.keys():
reg = sm.OLS(returns[k],returns.FSTMX).fit()
resids[k] = reg.resid
代码的返回[k]部分有问题吗?如何使用k值访问列?或者还有更简单的方法吗?
这个答案是遍历选定的列以及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)
我遇到这个问题是因为我正在寻找一个只包含列的干净迭代器(Series,没有名称)。
除非我弄错了,没有这样的事情,如果这是真的,有点烦人。特别是,人们有时想要为变量分配几个单独的列(Series),例如:
x, y = df[['x', 'y']] # does not work
有一个接近的df.items(),但它给出了一个元组迭代器(column_name, column_series)。有趣的是,有一个对应的df.keys()返回df.keys()。列,即列名作为索引,因此a, b= df[['x', 'y']].keys()正确分配a='x'和b='y'。但是没有对应的df.values(),因为df.values是df.values()Values是一个属性,返回底层numpy数组。
一种(不优雅的)方法是:
x, y = (v for _, v in df[['x', 'y']].items())
但没有我想的那么复杂。