我自定义了一个函数,函数有俩参数,分别是df的行列索引;现在我需要把这个自定义函数应用到df的每一个元素上,由于数据量较大(大约8500*14000)的矩阵,for循环的性能不太好,现寻求其他解决方法~
1.我的自定义函数如下
def ubcf(userid,orderid):
ubcf_value = (((pre_order_prefer.loc[neigh_set[userid][1:],orderid] - pre_order_prefer.loc[userid,orderid])* compre_sim.loc[userid,neigh_set[userid][1:]]).sum())/(compre_sim.loc[userid,neigh_set[userid][1:]]).sum()
return ubcf_value
其中pre_order_prefer是行索引为userid、列索引为orderid的df,compre_sim是行列索引都是userid的df(表示所有userid的相似度矩阵)。
2.新建一个df,行索引为userid,列索引为orderid,我需要将每一个元素df.loc[userid,orderid]修改为ubcf(userid,orderid)。因数据量大不想用for循环,自己想尝试apply函数,但是没成功。
按照最笨的办法循环应该是这样的:
for index in a.index:
for columns in a.columns:
a.loc[index,columns] = ubcf(index,columns)
但奈何数据量太大,有没有时间快些的达到同样效果的方法嘞?感谢!
df=pre_order_prefer.applymap(ubcf(userid,orderid))
其实我完全看不懂你的需求,大概这个函数可行吧
列表推导式可以吗,或者打包函数zip
使用numpy的矩阵试试,矩阵对解决大型数据的性能提高相当明显
applymap函数可以去看看
我觉得你可以仿照map函数的构造方法,数据量大能用列表推导用推导,能用生成器用生成器,
在 没有题目,优化算法 的情况下,
尝试优化ubcf(arg1, arg2)方法,查找重复计算部分且尝试动态规划或缓存的可能性。