我有一个包含股票列表的python dict。我试图在for循环中使用密钥(股票代码,见下文)来迭代地为所有股票(以股票代码命名)制作多个pandas DataFrame,这些股票通过pandas DataReader填充价格/交易量。 我认为我在下面的代码中有一个基本的python问题,因为创建的唯一DataFrame是“stockName”。 谢谢你的帮助
print stocks.keys()
['TSO', 'WDC', 'EBIX', 'AAPL', 'GTAT', 'MSFT', 'BKE', 'VFSTX', 'ORCL', 'UIS', 'HSII', 'PETS', 'BBBY', 'RPXC', 'TZOO', 'DLB', 'SPLS', 'CHE', 'INTC', 'CF', 'GTN', 'FFIV', 'ATML', 'BAH', 'DHX', 'HRB', 'VIAB', 'LMT', 'NOC', 'VWO', 'ROST']
for stockName in stocks.keys():
stockName = DataReader(stockName, "yahoo", datetime(2013,1,1), datetime(2013,8,1))
答案 0 :(得分:7)
如果您只是对股票进行迭代,可以使用stocks
DataReader(stocks, 'yahoo', datetime(2013, 1, 1), datetime(2013, 8, 1))
您不需要进行迭代,因为get_data_yahoo
会为您执行此操作。您将获得一个Panel
,您可以像dict
DataFrame
一样使用stocks.keys()
。您甚至不需要致电for key in dict(a=1, b=2, c=3):
print key
,因为
a
b
c
将打印
In [3]: p = DataReader(stocks, 'yahoo', datetime.datetime(2013, 1, 1), datetime.datetime(2013, 8, 1))
In [4]: p
Out[4]:
<class 'pandas.core.panel.Panel'>
Dimensions: 6 (items) x 147 (major_axis) x 31 (minor_axis)
Items axis: Open to Adj Close
Major_axis axis: 2013-01-02 00:00:00 to 2013-08-01 00:00:00
Minor_axis axis: AAPL to WDC
结果如下:
In [7]: p.swapaxes('items', 'minor').AAPL
Out[7]:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 147 entries, 2013-01-02 00:00:00 to 2013-08-01 00:00:00
Data columns (total 6 columns):
Open 147 non-null values
High 147 non-null values
Low 147 non-null values
Close 147 non-null values
Volume 147 non-null values
Adj Close 147 non-null values
dtypes: float64(6)
如果您希望能够通过属性访问来访问股票代码吗
Panel
编辑: 更容易操纵生成的dict
,而不是填充metric
并对其执行某些操作。< / p>
你可以用这种方式做各种有趣的事情。以下是按stock
,date
和In [127]: df = p.to_frame(filter_observations=False)
In [128]: res = df.stack().reset_index()
In [129]: res.columns = ['date', 'metric', 'stock', 'value']
In [130]: res.set_index('date').groupby(['metric', 'stock']).apply(lambda x: x.value.pct_change()).stack()
Out[130]:
metric stock date
Adj Close AAPL 2013-01-03 -0.013
2013-01-04 -0.028
2013-01-07 -0.006
2013-01-08 0.003
2013-01-09 -0.016
2013-01-10 0.012
2013-01-11 -0.006
2013-01-14 -0.036
2013-01-15 -0.032
2013-01-16 0.042
2013-01-17 -0.007
2013-01-18 -0.005
2013-01-22 0.010
2013-01-23 0.018
2013-01-24 -0.124
...
Volume WDC 2013-07-12 -0.083
2013-07-15 -0.179
2013-07-16 -0.302
2013-07-17 -0.168
2013-07-18 0.589
2013-07-19 0.003
2013-07-22 0.049
2013-07-23 0.526
2013-07-24 0.176
2013-07-25 0.616
2013-07-26 -0.363
2013-07-29 -0.357
2013-07-30 0.554
2013-07-31 -0.252
2013-08-01 -0.158
Length: 27010, dtype: float64
分组的百分比变化:
pandas
天空是{{1}}的限制!
答案 1 :(得分:4)
stockName是一个在股票代码清单上循环的变量。它包含自动收报机字符串。当您为其分配DataFrame时,此for
循环的下一轮将丢失此DataFrame。
创建另一个变量,例如dict
,您可以将库存数据分配到:
stockdata = {}
for stockName in stocks:
stockdata[stockName] = DataReader(stockName, "yahoo", datetime(2013,1,1), datetime(2013,8,1))