2013-06-08 15 views
5

Ho più frame di dati con i prezzi delle azioni che voglio allineare in un singolo frame di dati che contiene solo i prezzi di chiusura per tutti gli stock.Unione di più frame di dati non allineati in frame di dati singoli panda

Mi aspetterei che tutte le date da tutti i frame di dati siano presenti nella colonna della data (indice) e "NA" nel caso in cui non vi fosse alcun prezzo di chiusura per uno stock in quella data.

Esempio con due telegrammi di dati (DF1 e DF2):

In [5]: df1 
Out[5]: 
      Open High Low Close 
Date1 
2012-01-05 22.00 22.66 23.11 24.04 
2012-01-04 24.04 23.80 23.08 22.16 
2012-01-03 22.16 21.27 20.42 21.24 
2012-01-01 21.24 22.30 22.52 22.30 

In [7]: df2 
Out[7]: 
      Open High Low Close 
Date1 
2012-01-07 23.00 21.66 25.11 21.04 
2012-01-06 22.00 22.66 23.11 24.04 
2012-01-04 24.04 23.80 23.08 22.16 
2012-01-02 22.16 21.27 20.42 21.24 
2012-01-01 21.24 22.30 22.52 22.30 

Ora posso fare

In [8]: frame=pd.DataFrame({"df1.Close":df1["Close"], "df2.Close":df2["Close"]}) 

e il risultato è come previsto:

In [9]: frame 
Out[9]: 
      df1.Close df2.Close 
Date1 
2012-01-01  22.30  22.30 
2012-01-02  NaN  21.24 
2012-01-03  21.24  NaN 
2012-01-04  22.16  22.16 
2012-01-05  24.04  NaN 
2012-01-06  NaN  24.04 
2012-01-07  NaN  21.04 

Come sarebbe Devo cambiare il mio codice per fare lo stesso per un numero dinamico di frame di dati? In questo momento, ho 8 frame di dati che ho bisogno di allineare in questo modo. C'è un modo per eseguire il ciclo attraverso un elenco di frame di dati e allinearli come sopra - invece di legare manualmente i nomi dei frame di dati (qualcosa come df [0] a df [7] in senso figurato)?

Grazie in anticipo e cordiali saluti! Dirk

risposta

4

Se si dispone dei dati-frame in un elenco (l'attuale oggetti di data-struttura, voglio dire, non i loro nomi) che sembra qualcosa di simile:

dflist = [df1, df2, df3, df4, df5, df6, df7, df8] 

quindi il seguente codice dovrebbe fare ciò che sembra che stai cercando:

frame = {} 
for idx, df in enumerate(dflist): 
    n = idx+1 # Since lists are 0-indexed 
    name = "df{0:d}.Close".format(n) 
    close = df["Close"] 
    frame[name] = close 

si potrebbe fare questo in modo più compatto con una comprensione dict, ma nel codice di esempio preferisco di precisare le cose in modo più esplicito per facilità di comprensione. Per riferimento, la dict comprensione sarebbe simile a questa:

{"df{0:d}.Close".format(idx+1): df["Close"] for idx, df in enumerate(dflist)} 
+0

Molto bello, grazie mille! Con quell'esempio, sono a metà strada lì. Ora, come faccio a rendere questa dinamica "dflista"? Non saprò in anticipo quanti fotogrammi di cui ho bisogno, quindi suppongo di cercare un modo per creare dinamicamente un certo numero di frame di dati e quindi utilizzare il codice. Grazie mille per il vostro aiuto! – user1653205

+0

Usa semplicemente i metodi di manipolazione delle liste standard come 'append()' - così, ad esempio, quando ottieni un nuovo frame di dati, fai qualcosa come 'dflist.append (new_df)'. – rmunn

+0

Penso che mi sto avvicinando. Ora ho caricato i dataframes in un dict in cui la chiave è il ticker del titolo e il valore è il dataframe con le quotazioni OHLC per lo stock. Ora ho un dict con 8 coppie chiave/valore. La domanda rimanente è: Come faccio a unire i dataframes in uno iterando attraverso il mio dict? – user1653205

Problemi correlati