【问题标题】:iteratively calling pandas datareader迭代调用 pandas datareader
【发布时间】:2013-08-22 01:44:10
【问题描述】:

我有一个带有股票列表的 python 字典。我试图在 for 循环中使用键(股票代码,见下文)迭代地为所有通过 pandas DataReader 填充价格/交易量的股票(以股票代码命名)生成多个 pandas DataFrame。 我想我在下面的代码中有一个基本的 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))

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果您只对股票进行迭代,您可以直接使用stocks 调用它

    DataReader(stocks, 'yahoo', datetime(2013, 1, 1), datetime(2013, 8, 1))
    

    您不需要迭代,因为 get_data_yahoo 会为您完成此操作。你会得到一个Panel,你可以像dictDataFrames一样使用它。你甚至不需要打电话给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 并对其进行操作要容易很多

    你可以用它做各种有趣的事情。这是按metricstockdate 分组的百分比变化:

    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 的天空是极限!

    【讨论】:

      【解决方案2】:

      stockName 是一个在股票代码列表中循环的变量。它包含股票代码字符串。当您将 DataFrame 分配给它时,此 DataFrame 在for 循环的下一轮中丢失。

      创建另一个变量,例如 dict,将股票数据分配到其中:

      stockdata = {}
      for stockName in stocks:
          stockdata[stockName] = DataReader(stockName,  "yahoo", datetime(2013,1,1), datetime(2013,8,1))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 2018-12-13
        • 2016-11-03
        • 2019-05-02
        • 2020-01-03
        相关资源
        最近更新 更多