2013-04-04 2 views
26

Tôi có một danh sách 4 khung dữ liệu gấu trúc có chứa dữ liệu đánh dấu ngày mà tôi muốn hợp nhất vào một khung dữ liệu duy nhất. Tôi không thể hiểu được hành vi của concat trên dấu thời gian của tôi. Xem chi tiết dưới đây:Pandas DataFrame concat vs chắp thêm

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

Sử dụng append tôi nhận được:

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) 

Sử dụng concat tôi nhận được:

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) 

Thông báo như thế nào chỉ số thay đổi khi sử dụng concat. Tại sao điều đó xảy ra và tôi sẽ sử dụng concat để tái tạo các kết quả thu được bằng cách sử dụng append như thế nào? (Vì số concat có vẻ nhanh hơn rất nhiều, 24,6 ms mỗi vòng lặp so với 3,02 giây trên mỗi vòng lặp)

Trả lời

26

Vì vậy, bạn đang làm gì với phụ thêm và concat là tương đương tương đương. Sự khác biệt là DataFrame trống. Đối với một số lý do này gây ra một sự suy giảm lớn, không chắc chắn chính xác lý do tại sao, sẽ phải xem xét một số điểm. Dưới đây là một giải trí về cơ bản những gì bạn đã làm.

Tôi hầu như luôn sử dụng concat (mặc dù trong trường hợp này chúng tương đương nhau, ngoại trừ khung trống); nếu bạn không sử dụng khung trống, chúng sẽ có cùng tốc độ.

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

Cảm ơn bạn đã trả lời, giải thích sự khác biệt về thời gian tính toán. Bất kỳ con trỏ nào là tại sao chỉ số của tôi đột nhiên thay đổi một cách ngẫu nhiên? – JPBelanger

+1

hmm trông giống như vấn đề múi giờ, sẽ gửi báo cáo lỗi – Jeff

+0

Được đánh giá cao! Cảm ơn sự giúp đỡ của bạn. – JPBelanger

3

tôi đã thực hiện một chuẩn mực rất nhỏ (xin vui lòng tìm code on Gist) để đánh giá gấu trúc concatappend.

Điểm chuẩn chạy trên hệ điều hành Mac OS X 10.13 với Python 3.4 và gấu trúc 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 là nhanh hơn đáng kể.