2017-06-14 72 views
0

我有一個產品有產品通過的步驟。
即數據結構爲: 產品ID,訂單ID,新值,舊值,編輯日期。大熊貓時間系列差異,時間單位與申請和groupby

我希望通過我們的系統進行產品轉換的時間差和累計時間(以天計)。即總循環時間和間歇循環時間。

我寫了下面的代碼,它運行良好,但仍然很慢。我希望有人可能提供更快的解決方案,因爲目前需要花費數小時來處理具有4億個處理步驟的YTD數據集。

def f(df): 
    df['diff'] = (df['Edit Date'].diff())/ np.timedelta64(1, 'D') 
    df['sum'] = df['diff'].cumsum() 
    print len(df) 
    return df 

if __name__ == '__main__': 
    df = pd.read_csv('May 2017.csv') 
    df['Edit Date'] = pd.to_datetime(df['Edit Date'], format='%m/%d/%Y') 
    df.sort_values(by=['Order ID','Edit Date',] ,kind = 'mergesort', ascending=[1,1], inplace=True) 
    df= df.groupby(['Order ID']) 
    timediffference = df.apply(f) 

這給我我想要的,但它在大型數據集,這通常超過一個緩慢的每月20萬行緩慢。想知道是否有辦法針對每個訂單步驟組的整個日期列更快地完成此操作,而不是嘗試使用應用。我嘗試使用多核心,但發現一個死衚衕。

回答

0

使用apply時,Groupby相當慢。您應該使用與GROUPBY對象即實現的功能:

df['diff'] = df.groupby('Order ID')['Edit Date'].diff()/np.timedelta64(1, 'D') 
df['sum'] = df.groupby('Order ID')['diff'].cumsum() 

編輯: 如果這還不夠,你也可以適用於整個數據集的差異,而不是採取每個組的第一行。這應該也比以前的方法更快。

idx_wo_first = df.index.difference(df.groupby('Order ID').head(1).index) 
df.loc[idx_wo_first, 'diff'] = df['Edit Date'].diff().loc[idx_wo_first]/np.timedelta64(1, 'D') 
df['sum'] = df.groupby('Order ID')['diff'].cumsum() 
+0

我需要它每個產品,所以每個組的第一行。你的第一個建議是黃金。謝謝,這太快了。它一直在我面前主演着我。 – upliftedLemur

+0

對不起,我還不夠清楚。我的兩個代碼都產生相同的輸出(儘管第二個代碼應該更快)。在第二個代碼中,由於我在整個數據集上使用了diff,因此每組的最後一行是組的第一行和最後一組的最後一行之間的差異,所以我需要將它們過濾掉。 也請考慮接受我的答案,因爲這是你在找什麼。 – Milouga