优化熊猫代码以提高速度

时间:2017-06-23 19:19:45

标签: python performance pandas optimization data-science

我正在推荐一个推荐系统,我正在尝试开发一个简单的模型,但是我很难快速完成这个过程。现在我正在尝试制作两个大小为(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)

2 个答案:

答案 0 :(得分:0)

您正在以错误的方式使用大熊猫。使用 groupby ,sum,pivot或value_counts等矢量数据操作,Pandas非常快。 请先阅读本节内容: https://pandas.pydata.org/pandas-docs/stable/groupby.html

答案 1 :(得分:0)

我最终搞清楚了。我肯定错误地使用Pandas,所以在一些groupby操作之后,我能够拥有一个具有感兴趣值的数据帧。即使从这里开始我也很难创建我想要的矩阵(耗时1.5小时),所以我决定使用scipy的csr矩阵,这非常有帮助,将时间缩短到30秒。