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