首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化pandas代码以提高速度

问优化pandas代码以提高速度
EN

Stack Overflow用户
提问于 2017-06-24 03:19:45
回答 2查看 193关注 0票数 1

我正在开发一个推荐系统,并试图从一开始开发一个简单的模型,但我很难让这个过程变得更快。现在,我正在尝试制作两个数据帧,其维度大约为(130000,40000),与用户(行)订购的产品(列)相对应,其中数据帧中的每个条目都是用户购买了多少产品的整数计数。对于x_df,该计数超过了一定数量的订单,而对于y_df,该计数超过了它们的最后一个订单。

从我通过运行scipy.stats.linregress(计数,次数)可以看出,在获得大约100个数据点之后,运行时间是线性的,r^2值为0.993。对于130,000个用户,这意味着这段代码将需要大约36个小时,并且我仍然需要在数据帧完成后训练估计器!我以前从来没有处理过这么大的数据集,我不确定这是否应该是我所期望的,但我想我正在做的任何事情都可以更有效地完成,因为我缺乏经验。如有任何意见或建议,我们将不胜感激。

我可能应该澄清一下:数据集的设置是这样的: order_products_prior包含训练用户的先前订单集,而order_products_train包含这些用户的最终订单。

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2017-06-24 04:36:39

你用错了方式来使用熊猫。Pandas对于矢量数据操作非常快,如groupby,sum,pivot或value_counts。请先阅读本节:https://pandas.pydata.org/pandas-docs/stable/groupby.html

票数 0
EN

Stack Overflow用户

发布于 2017-07-21 03:09:37

我最终弄明白了。我肯定是错误地使用了Pandas,所以在一些groupby操作之后,我能够拥有一个包含感兴趣的值的单个数据帧。即使在这里,我也发现创建我想要的矩阵有困难(大约花了1.5个小时),所以我决定使用scipy的csr矩阵,它有很大的帮助,将时间减少到大约30秒。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44728568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档