数据描述: 取三级品类采购数据的top的 品类
品类 被采购次数
办公文具 36677
纸类 21236
纸品/湿巾 20646
文件管理 15909
本册便签 13781
充电器/数据线 10240
打印复印耗材 9803
食用油 8368
米面杂粮 8143
以这些品类为基础
筛选了采购过这10个品类里面3个以上的用户采购品类数据()
数据格式:
uid 采购品类
22|130600|K001 纸巾|办公文具|纸品/湿巾
22|240300|S010 办公文具|纸品/湿巾|本册便签|文件管理|一次性用品
代码如下
similarity.py
import numpy as np def compete_similar(array1,array2): if(array1==array2): return 1 #计算相似度 vec_1=array1 vec_2=array2 one_dot_two=np.dot(vec_1,vec_2) L1=np.sqrt(np.dot(vec_1,vec_1)) L2 = np.sqrt(np.dot(vec_2, vec_2)) #余弦值越接近1,就表明家教越接近0度,也就是两个向量越相似 cos_angle=one_dot_two/(L1*L2) angle_pi=np.arccos(cos_angle) angle=(angle_pi*360/2/np.pi)/100 return angle
similar_analysis.py
import pandas as pd from util import similarity as similar def getPL_code(arrLike): arrString=arrLike['array_to_string'] pl_code_list=["办公文具","纸类","纸品/湿巾","文件管理","本册便签","充电器/数据线","打印复印耗材","一次性用品","食用油","米面杂粮"] pl_list=[] for cur_pl_code in pl_code_list: if cur_pl_code in arrString:#对品类二值化处理 pl_list.append(1) else: pl_list.append(0) return pl_list def ResultDFToSave(rules): returnRules=[] for i in rules: temList=[] temList.append(i[0]) temList.append(i[1]) temList.append(i[2]) returnRules.append(temList) return pd.DataFrame(returnRules,columns=('user1','user2','余弦相似度'),index=None) if __name__ == '__main__': fileName = "E:/data/user_category.csv" df=pd.read_csv(fileName) df=df.head(100) df['pl_code']=df.apply(getPL_code,axis=1) result_list=[] result = [] for i in range(df.iloc[:,0].size): user1=df.iloc[i]['uid'] pl_code_array1=df.iloc[i]['pl_code'] for j in range(df.iloc[:, 0].size): user2 = df.iloc[j]['uid'] pl_code_array2 = df.iloc[j]['pl_code'] similar_num=similar.compete_similar(pl_code_array1,pl_code_array2) result.append(user1) result.append(user2) result.append(similar_num) result_list.append(result.copy()) result.clear() print(result_list) #将结果保存成excel格式的文件 dfToSave=ResultDFToSave(result_list) saveFileName="用户余弦相似性"+".xlsx" dfToSave.to_excel(saveFileName) print("生成文件完毕")
由此可以得到用户之间的相似度
但是遗漏了一个重要问题 就是品类的采购次数
一个品类采购1次和采购100次 是完全不同的
这个待后续再探索吧