2013-04-04 12 views
26

1つのデータフレームにマージする1日のチックデータを含む4つのパンダデータフレームのリストがあります。タイムスタンプ上のコンカットの動作を理解できません。私が手appendを使用し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)] 

:詳細は下記を参照してください

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) 

concatを使用して私が手:

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) 

お知らせをconcatを使用した場合、インデックスがどのように変化しますか。なぜそれが起こっているのですか?appendを使って得られた結果を再現するためにconcatを使用するにはどうすればよいですか? (concatは非常に速いので、1ループあたり24.6ms、ループあたり3.02s)

答えて

26

あなたは何をしているのですか?はほぼに相当します。違いは空のDataFrameです。なんらかの理由で、これは大きな減速を引き起こし、正確にはなぜか、ある点を見る必要があります。以下は基本的にあなたがしたことのレクリエーションです。

私はほとんど常にコンカットを使用します(ただし、この場合は空のフレームを除いて同等です)。 空のフレームを使用しない場合、同じ速度になります。

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

返信いただきありがとうございます。これは、計算時間の違いを説明しています。なぜ私のインデックスが突然ランダムに変化するのかについてのあらゆる指針? – JPBelanger

+1

hmmはタイムゾーンの問題のようで、バグレポートを提出します – Jeff

+0

非常に感謝しています!ご協力ありがとうございました。 – JPBelanger

3

私はパンダconcatappendを評価する(code on Gistを見つけてください)非常に小さなベンチマークを実施しています。

ベンチマークは、Python 3.4およびpandas 0.22のMac OS X 10.13システムで実行されました。

 
+--------------------+----------+----------+-----------------+ 
|     | 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は大幅に高速です。