2017-06-23 96 views
1

我正在研究一個推薦系統,並試圖開發一個簡單的模型,但我很難使此過程更快。現在,我正在嘗試製作兩個數據框,其大小爲(130000,40000),與用戶(行)排序的產品(列)相對應,其中數據框中的每個條目都是用戶產品數量的整數買了。對於x_df,計數超過了許多次序,而對於y_df,計數超過了它們的最後次序。優化熊貓代碼的速度

從我可以通過運行scipy.stats.linregress(計數,次數)得知,在獲得100個左右的數據點後,運行時間與r^2值爲0.993呈線性關係。如果有130,000個用戶,這意味着這段代碼需要大約36個小時,並且在製作後我仍然需要在數據框上訓練一個估計器!我之前沒有使用過這麼大的數據集,我不確定這是否應該是預期的,但我想我無論做什麼都可以因缺乏經驗而更有效率地完成。任何意見或建議,將不勝感激。

我應該澄清:數據集已設置好,以便order_products_prior包含訓練用戶的先前訂單集合,而order_products_train包含這些用戶的最終訂單。

def add_to_df(series, prod_list): 
    count = 0 
    for prod in prod_list: 
     if prod in series.index: 
      series[series.index==prod] += 1 
      count += 1 
     else: 
      series = series.set_value(prod, 1) 
      count -=1 
    return series 

import time 
start_time = time.time() 
count = 0 
times = [] 
counts = [] 
for user in users_train: 
    usr_series_x = pd.Series() 
    usr_series_y = pd.Series() 
    prod_list_x = [] 
    prod_list_y = [] 
    usr_orders = orders[orders['user_id']==user] 
    for ord_id in usr_orders['order_id']: 
     usr_order_products_prior = order_products_prior[order_products_prior['order_id']==ord_id]['product_id'] 
     for product in usr_order_products_prior: 
      prod_list_x.append(product) 
     usr_order_products_train = order_products_train[order_products_train['order_id']==ord_id]['product_id'] 
     for product in usr_order_products_train: 
      prod_list_y.append(product) 
    add_to_df(usr_series_x, prod_list_x) 
    add_to_df(usr_series_y, prod_list_y) 
    x_df.loc[user] = usr_series_x 
    y_df.loc[user] = usr_series_y 
    count += 1 
    if count%5==0: 
     print("Pectent Complete: {0}".format(float(count/len(users_list)*100)) 
     print("--- %s seconds ---" % (time.time() - start_time)) 
     counts.append(count) 
     times.append(time.time() - start_time) 

import scipy as sci 
plt.plot(counts, times) 
sci.stats.linregress(counts, times) 
+1

您需要並行化。 http://dask.pydata.org/en/latest/ –

+0

即使有這樣大小的數據集?我認爲這是比這更大的數據集。所有數據都包含在幾個csv文件中,佔用的內容少於GB。我想我需要知道的是,如果可能的話,如果沒有並行化,那麼生成上述維度的特徵和標籤矩陣將會是一種有效的方法。 – Ulminator

回答

0

我終於搞清楚了。我肯定是不正確地使用熊貓,所以相反,在一些groupby操作後,我能夠獲得一個具有感興趣值的單個數據框。即使從這裏我發現麻煩創建我想要的矩陣(花了1.5小時),所以我決定使用scipy的csr矩陣,幫助巨大,使時間大約30秒。