2013-08-21 2 views
2

주식 목록이있는 파이썬 딕트가 있습니다. 나는 for 루프에서 키 (주식 기호, 아래 참조)를 사용하여 pandas DataReader를 통해 가격/볼륨으로 채워진 모든 주식 (주식 기호로 명명 된)에 대해 여러 개의 팬더 데이터 프레임을 반복적으로 작성하려고합니다. 내가 만든 유일한 DataFrame이 "stockName"이기 때문에 나는 아래 코드에서 기본적인 파이썬 문제가 있다고 생각합니다. 당신의 도움이반복적으로 pandas 데이터 아님을 호출합니다.

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

답변

3

stockName에 대한 덕분에 주식 시세 목록에 루프 변수입니다. 티커 문자열이 들어 있습니다. DataFrame을 할당하면이 데이터 프레임은 for 루프의 다음 차례에 손실됩니다. 당신이에 주식 데이터를 할당

다른 변수를 만들고, 인스턴스에 대한 dict은 : 당신은 단지 주식을 반복하는 경우

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

당신은 stocks

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

직접 호출 할 수 있습니다 get_data_yahoo 이후로 반복 할 필요가 없습니다. dictDataFrame과 같이 사용할 수있는 Panel이 다시 표시됩니다. 당신은 여기

a 
b 
c 

은 결과의 인쇄됩니다

for key in dict(a=1, b=2, c=3): 
    print key 

이후 stocks.keys()를 호출 할 필요는 없다 : 당신이 속성을 통해 주식 기호에 액세스 할 수있게하려면

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, 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와 한계입니다!

관련 문제