2013-04-04 44 views
26

Ho una lista di 4 frame di dati di panda contenenti un giorno di dati di tick che voglio unire in un singolo frame di dati. Non riesco a capire il comportamento di concat sui miei timestamp. Vedi dettagli di seguito:Pandas DataFrame concat vs append

data 

[<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 35228 entries, 2013-03-28 00:00:07.089000+02:00 to 2013-03-28 18:59:20.357000+02:00 
Data columns: 
Price  4040 non-null values 
Volume  4040 non-null values 
BidQty  35228 non-null values 
BidPrice 35228 non-null values 
AskPrice 35228 non-null values 
AskQty  35228 non-null values 
dtypes: float64(6), 
<class 'pandas.core.frame.DataFrame'> 

DatetimeIndex: 33088 entries, 2013-04-01 00:03:17.047000+02:00 to 2013-04-01 18:59:58.175000+02:00 
Data columns: 
Price  3969 non-null values 
Volume  3969 non-null values 
BidQty  33088 non-null values 
BidPrice 33088 non-null values 
AskPrice 33088 non-null values 
AskQty  33088 non-null values 
dtypes: float64(6), 
<class 'pandas.core.frame.DataFrame'> 

DatetimeIndex: 50740 entries, 2013-04-02 00:03:27.470000+02:00 to 2013-04-02 18:59:58.172000+02:00 
Data columns: 
Price  7326 non-null values 
Volume  7326 non-null values 
BidQty  50740 non-null values 
BidPrice 50740 non-null values 
AskPrice 50740 non-null values 
AskQty  50740 non-null values 
dtypes: float64(6), 
<class 'pandas.core.frame.DataFrame'> 

DatetimeIndex: 60799 entries, 2013-04-03 00:03:06.994000+02:00 to 2013-04-03 18:59:58.180000+02:00 
Data columns: 
Price  8258 non-null values 
Volume  8258 non-null values 
BidQty  60799 non-null values 
BidPrice 60799 non-null values 
AskPrice 60799 non-null values 
AskQty  60799 non-null values 
dtypes: float64(6)] 

Utilizzando append ottengo:

pd.DataFrame().append(data) 

<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 179855 entries, 2013-03-28 00:00:07.089000+02:00 to 2013-04-03 18:59:58.180000+02:00 
Data columns: 
AskPrice 179855 non-null values 
AskQty  179855 non-null values 
BidPrice 179855 non-null values 
BidQty  179855 non-null values 
Price  23593 non-null values 
Volume  23593 non-null values 
dtypes: float64(6) 

Utilizzando concat ottengo:

pd.concat(data) 

<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 179855 entries, 2013-03-27 22:00:07.089000+02:00 to 2013-04-03 16:59:58.180000+02:00 
Data columns: 
Price  23593 non-null values 
Volume  23593 non-null values 
BidQty  179855 non-null values 
BidPrice 179855 non-null values 
AskPrice 179855 non-null values 
AskQty  179855 non-null values 
dtypes: float64(6) 

Notate come l'indice cambia quando si utilizza concat. Perché sta succedendo e come dovrei usare l'concat per riprodurre i risultati ottenuti usando append? (Dal momento che concat sembra così molto più veloce; 24,6 ms per loop vs 3.02 s per loop)

risposta

26

Allora, cosa stai facendo è con accodamento e concat è quasi equivalente. La differenza è il DataFrame vuoto. Per qualche motivo questo causa un grande rallentamento, non so esattamente perché, dovremo guardare ad un certo punto. Di seguito è una ricreazione di fondamentalmente quello che hai fatto.

Quasi sempre utilizzo concat (anche se in questo caso sono equivalenti, ad eccezione del frame vuoto); se non si utilizza la cornice vuota avranno la stessa velocità.

In [17]: df1 = pd.DataFrame(dict(A = range(10000)),index=pd.date_range('20130101',periods=10000,freq='s')) 

In [18]: df1 
Out[18]: 
<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 10000 entries, 2013-01-01 00:00:00 to 2013-01-01 02:46:39 
Freq: S 
Data columns (total 1 columns): 
A 10000 non-null values 
dtypes: int64(1) 

In [19]: df4 = pd.DataFrame() 

The concat 

In [20]: %timeit pd.concat([df1,df2,df3]) 
1000 loops, best of 3: 270 us per loop 

This is equavalent of your append 

In [21]: %timeit pd.concat([df4,df1,df2,df3]) 
10 loops, best of 

3: 56.8 ms per loop 
+0

Grazie per la risposta, questo spiega la differenza nei tempi di calcolo. Qualche indicazione sul perché il mio indice cambia improvvisamente in modo casuale? – JPBelanger

+1

hmm sembra un problema di fuso orario, presenterà un bug report – Jeff

+0

Molto apprezzato! Grazie per l'aiuto. – JPBelanger

3

ho implementato un punto di riferimento molto piccola (si prega di trovare il code on Gist) per valutare i panda concat e append.

Il benchmark è stato eseguito su un sistema Mac OS X 10.13 con Python 3.4 e pandas 0.22.

 
+--------------------+----------+----------+-----------------+ 
|     | append | concat | append/concat | 
+--------------------+----------+----------+-----------------+ 
| small data frames | 0.3661 s | 0,1788 s | 204.75 %  | 
+--------------------+----------+----------+-----------------+ 
| medium data frames | 0.3894 s | 0,1946 s | 200.10 %  | 
+--------------------+----------+----------+-----------------+ 
| large data frames | 0.6872 s | 0,3980 s | 172.66 %  | 
+--------------------+----------+----------+-----------------+ 

tl; dr concat è significativamente più veloce.