2015-04-24 42 views
2

我有一個巨大的面板數據,超過10 GB。數據如下所示:在限制和大數據的熊貓運行總和

ID Start_time Factor End_time 
1001  1611  0.12 1861 
1001  1612  -0.01 1862 
... 
1001  1861  0.57 2111 
1001  1862  0.06 2112 
... 
1002  1200  0.01 1450 
1002  1201  0.52 1451 
... 
1002  1450  -0.21 1700 
1002  1451  0.30 1701 
... 

的數據由IDSTART_TIME值排序。我想計算因子的總和,即對於每個ID開始時間到相應的結束時間

輸出的一個例子:

ID Start_time Factor End_time Cumulative_factor 
1001  1611  0.12 1861  0.12+(-0.01)+...+0.57 
1001  1612  -0.01 1862  -0.01+...+0.57+0.06 
... 
1001  1861  0.57 2111  0.57+0.06+... 
1001  1862  0.06 2112  0.06+... 
... 
1002  1200  0.01 1450  0.01+0.52+...+(-0.21) 
1002  1201  0.52 1451  0.52+...+(-0.21)+0.30 
... 
1002  1450  -0.21 1700  -0.21+0.30+... 
1002  1451  0.30 1701  0.30+... 
... 

因爲我有超過1000萬的觀察,有沒有計算它一個有效的方法?

+0

你能顯示你想要的輸出嗎? –

+0

下面的文章演示瞭如何計算一個太大而不適合內存的熊貓'DataFrame': https://plot.ly/ipython-notebooks/big-data-analytics-with-pandas-and-sqlite/ – aensm

+0

由於數據已排序並且看起來像'End_time-Start_time == 250',您可以嘗試滾動窗口總和? – Zero

回答

0

注意:這部分是反轉的cumsum,遺憾的是cumsum(和朋友)沒有kwarg的說法,我認爲這可以做出很好的提升。

您可以ILOC反向數據幀相當便宜,但:

df.iloc[::-1].cumsum().iloc[::-1] 

這是與當前打開/關閉的門票非常相似一個問題。而不是逐行執行此操作,訣竅是在組中執行兩次。總結未完成的門票,從已關閉的門票中減去它們(減去會獲得當前未結門票)。現在

In [11]: df 
Out[11]: 
    ID Start_time Factor End_time 
0 1001  1611 0.12  1861 
1 1001  1612 -0.01  1862 
2 1001  1861 0.57  2111 
3 1001  1862 0.06  2112 

,我們能做的就是cumsum向上和向下cumsum,並採取區別:

In [12]: open = df.set_index("Start_time")["Factor"].cumsum() 

In [13]: closed = df.set_index("End_time")["Factor"].cumsum() 

In [14]: open.sub(closed, fill_value=0) 
Out[14]: 
1611 0.12 
1612 0.11 
1861 0.56 
1862 0.63 
2111 -0.68 
2112 -0.74 
Name: Factor, dtype: float64 

這是不太你想要什麼,而應該踢你在正確的方向。

+0

是的,我認爲你的方法解決了部分問題,即如果時間差距相同,那麼我可以使用這種方法。謝謝 – Brad

+0

@Brad我以爲我在上面說過,我不認爲你很清楚你在這裏想要什麼。在我看來,這個例子非常相似。涉及「差距」在哪裏? –

0

對不起,如果我在這裏遇到一個smartass的位。 「大數據」是每個定義數據不適合內存,這是10GB的。這也意味着每個定義的熊貓,熊貓不能處理「大數據」,因爲它在內存中完成所有的事情。

處理大數據問題的正確方法是使用map/reduce。使用map/reduce可以輕鬆解決您遇到的問題。由於您的數據已經按照您說的start_time排序,您可以輕鬆地通過reducer將其流式傳輸到每個start_time的cumsum。

如果這對你來說聽起來像是黑魔法,不要擔心,事實並非如此。

  1. 如果您還沒有將數據保存爲CSV,請使用gzip將其作爲 用zcat進行流傳輸。
  2. 寫一個reducer,只是一個python文件,其中 連續讀取stdin。
  3. 保持在一個變量
  4. 打印變量每次鍵改變
  5. ZCAT該文件中的數據相加,用|只要看看它做了你想要的,並繼續開發它,直到它符合你的目的。

這應該讓你獲得基本的功能,而且這種方法是可以使用的最有效的內存方法,因爲它實際上從來沒有將整個文件保存在內存中,當時只有一條記錄。

如果你對unix流不太滿意,這將會打擊你的思想,你很快就會喜歡它。

TLDR;熊貓是錯誤的工具,閱讀關於地圖/減少

+0

非常感謝,我將開始學習Map/Reduce。 – Brad