【问题标题】:Optimizing pandas code for speed优化 pandas 代码以提高速度
【发布时间】:2017-06-23 19:19:45
【问题描述】:

我正在开发一个推荐系统,并试图从一开始就开发一个简单的模型,但我很难加快这个过程。现在,我正在尝试制作两个近似尺寸的数据框(130000, 40000),它们对应于用户(行)订购的产品(列),其中数据框中的每个条目都是一个整数计数用户的产品数量买了。对于 x_df,计数超过了多个订单,而对于 y_df,计数超过了最后一个订单。

从我通过运行 scipy.stats.linregress(counts, times) 可以看出,在获得 100 个左右的数据点后,运行时间是线性的,r^2 值为 0.993。有 130,000 个用户,这意味着这个 sn-p 代码将需要大约 36 小时,而且我仍然需要在数据帧生成后训练一个估计器!我以前没有使用过这么大的数据集,我不确定这是否应该是预期的,但我想由于我缺乏经验,我所做的任何事情都可以更有效地完成。任何 cmets 或建议将不胜感激。

我应该澄清一下:数据集的设置使得 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)

【问题讨论】:

  • 你需要并行化。 dask.pydata.org/en/latest
  • 即使有这么大的数据集?我认为这是针对比这更大的数据集。所有数据都包含在几个占用不到 GB 的 csv 文件中。我想我需要知道的是,如果可能的话,在没有并行化的情况下,生成上述维度的特征和标签矩阵的有效方法是什么。

标签: python performance pandas optimization data-science


【解决方案1】:

您以错误的方式使用 pandas。 Pandas 对矢量数据操作(如 groupby、sum、pivot 或 value_counts)非常快。 请先阅读本节: https://pandas.pydata.org/pandas-docs/stable/groupby.html

【讨论】:

    【解决方案2】:

    我最终弄明白了。我肯定错误地使用了 Pandas,所以在一些 groupby 操作之后,我能够拥有一个包含感兴趣值的数据框。即使从这里开始,我也发现创建我想要的矩阵时遇到了麻烦(大约需要 1.5 小时),所以我决定使用 scipy 的 csr 矩阵,这很有帮助,将时间缩短到大约 30 秒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      相关资源
      最近更新 更多