迭代地调用pandas datareader

时间:2013-08-21 16:42:39

标签: python pandas

我有一个包含股票列表的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))

2 个答案:

答案 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>

你可以用这种方式做各种有趣的事情。以下是按stockdateIn [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))