2012-07-30 13 views
11

Ho due abbastanza grande (frammenti forniti) panda DateFrame s con date disuguali gli indici che desidero concat in uno:concat panda dataframe lungo indici TimeSeries

  NAB.AX         CBA.AX 
      Close Volume       Close Volume 
Date         Date 
2009-06-05 36.51 4962900    2009-06-08 21.95   0 
2009-06-04 36.79 5528800    2009-06-05 21.95 8917000 
2009-06-03 36.80 5116500    2009-06-04 22.21 18723600 
2009-06-02 36.33 5303700    2009-06-03 23.11 11643800 
2009-06-01 36.16 5625500    2009-06-02 22.80 14249900 
2009-05-29 35.14 13038600 --AND-- 2009-06-01 22.52 11687200 
2009-05-28 33.95 7917600    2009-05-29 22.02 22350700 
2009-05-27 35.13 4701100    2009-05-28 21.63 9679800 
2009-05-26 35.45 4572700    2009-05-27 21.74 9338200 
2009-05-25 34.80 3652500    2009-05-26 21.64 8502900 

Il problema è, se corro questo:

keys = ['CBA.AX','NAB.AX'] 
mv = pandas.concat([data['CBA.AX'][650:660],data['NAB.AX'][650:660]], axis=1, keys=stocks,) 

il seguente DateFrame viene prodotto:

        CBA.AX   NAB.AX   
           Close Volume Close Volume 
Date              
2200-08-16 04:24:21.460041  NaN  NaN  NaN  NaN 
2203-05-13 04:24:21.460041  NaN  NaN  NaN  NaN 
2206-02-06 04:24:21.460041  NaN  NaN  NaN  NaN 
2208-11-02 04:24:21.460041  NaN  NaN  NaN  NaN 
2211-07-30 04:24:21.460041  NaN  NaN  NaN  NaN 
2219-10-16 04:24:21.460041  NaN  NaN  NaN  NaN 
2222-07-12 04:24:21.460041  NaN  NaN  NaN  NaN 
2225-04-07 04:24:21.460041  NaN  NaN  NaN  NaN 
2228-01-02 04:24:21.460041  NaN  NaN  NaN  NaN 
2230-09-28 04:24:21.460041  NaN  NaN  NaN  NaN 
2238-12-15 04:24:21.460041  NaN  NaN  NaN  NaN 

qualcuno hai idea del perché questo potrebbe essere il caso?

Su un altro punto: c'è qualche libreria Python che carica dati da yahoo e la normalizza?

Cheers.

EDIT: Per riferimento:

data = { 
'CBA.AX': <class 'pandas.core.frame.DataFrame'> 
    DatetimeIndex: 2313 entries, 2011-12-29 00:00:00 to 2003-01-01 00:00:00 
    Data columns: 
     Close  2313 non-null values 
     Volume 2313 non-null values 
    dtypes: float64(1), int64(1), 

'NAB.AX': <class 'pandas.core.frame.DataFrame'> 
    DatetimeIndex: 2329 entries, 2011-12-29 00:00:00 to 2003-01-01 00:00:00 
    Data columns: 
     Close  2329 non-null values 
     Volume 2329 non-null values 
    dtypes: float64(1), int64(1) 
} 
+1

Qual è la vostra versione di panda? Sembra un errore corretto in 0.8.1 –

+0

Sì, ho anche pensato. Quando mi sono imbattuto per la prima volta su questo problema, stavo eseguendo la versione 0.8.0, ma ora sto utilizzando 0.8.1 e lo stesso risultato si verifica ... –

+1

Puoi inviarmi una e-mail con le versioni in pickle di questi DataFrames (wesmckinn AT gmail)? Non sono in grado di riprodurre il problema qui. Verifica inoltre che stai utilizzando NumPy 1.6.1 o una versione di sviluppo dopo il 6/5/2012. Forse meglio spostare questa discussione al GitHub –

risposta

7

E 'possibile leggere i dati con i panda e per concatenare esso.

Prima importare i dati

In [449]: import pandas.io.data as web 

In [450]: nab = web.get_data_yahoo('NAB.AX', start='2009-05-25', 
            end='2009-06-05')[['Close', 'Volume']] 

In [451]: cba = web.get_data_yahoo('CBA.AX', start='2009-05-26', 
            end='2009-06-08')[['Close', 'Volume']] 

In [453]: nab 
Out[453]: 
      Close Volume 
Date      
2009-05-25 21.15 9685100 
2009-05-26 21.64 8541900 
2009-05-27 21.74 9042900 
2009-05-28 21.63 9701000 
2009-05-29 22.02 14665700 
2009-06-01 22.52 6782000 
2009-06-02 22.80 10473400 
2009-06-03 23.11 9931400 
2009-06-04 22.21 17869000 
2009-06-05 21.95 8214300 

In [454]: cba 
Out[454]: 
      Close Volume 
Date      
2009-05-26 35.45 4529600 
2009-05-27 35.13 4521500 
2009-05-28 33.95 7945400 
2009-05-29 35.14 12548500 
2009-06-01 36.16 4509400 
2009-06-02 36.33 4304900 
2009-06-03 36.80 4845400 
2009-06-04 36.79 4592300 
2009-06-05 36.51 4417500 
2009-06-08 36.51   0 

Than concatenare esso:

In [455]: keys = ['CBA.AX','NAB.AX'] 

In [456]: pd.concat([cba, nab], axis=1, keys=keys) 
Out[456]: 
      CBA.AX   NAB.AX   
      Close Volume Close Volume 
Date           
2009-05-25  NaN  NaN 21.15 9685100 
2009-05-26 35.45 4529600 21.64 8541900 
2009-05-27 35.13 4521500 21.74 9042900 
2009-05-28 33.95 7945400 21.63 9701000 
2009-05-29 35.14 12548500 22.02 14665700 
2009-06-01 36.16 4509400 22.52 6782000 
2009-06-02 36.33 4304900 22.80 10473400 
2009-06-03 36.80 4845400 23.11 9931400 
2009-06-04 36.79 4592300 22.21 17869000 
2009-06-05 36.51 4417500 21.95 8214300 
2009-06-08 36.51   0  NaN  NaN 
1

tenta di partecipare in esterno.

Quando lavoro con un numero di scorte, di solito ho una cornice intitolata "aperto alto, basso, vicino, ecc." Con colonna come ticker. Se vuoi una struttura dati, userei i pannelli per questo.

per i dati di Yahoo, è possibile utilizzare i panda:

import pandas.io.data as data 
spy = data.DataReader("SPY","yahoo","1991/1/1")