个性化聚类推荐Kmeans实战
数据预处理
1. 去除不需要的数据
目标是:一个用户,后面全是用户的特征
- 列数据中 Null 数据 > 80% 所有数据 isnull().sum()
- 列数据中一样的数据 > 80%所有数据 value_counts()
- 表示同一个意思的字段,只需要保留一个:如用户名、用户账号、支付账号、收货人姓名
- 根据场景分析不需要的字段:如买家应付货款、应付邮费等
2. 只获取指定的列数据
python
1 | df_order.ix[:, '订单编号', '买家会员名', '买家实际支付金额', '收货地址', '种类', '数量', '退款金额'] |
或者
python
1 | df_order[['订单编号', '买家会员名', '买家实际支付金额', '收货地址', '种类', '数量', '退款金额']] |
3. 对数据进行格式化
python
1 | df_order['收货地址'] = df_order['收货地址'].apply(lambda x:x.split()[0]) |
4. 按照某列数据给整行数据打tag
python
1 | def add_tag(info): |
5. 数据合并
python
1 | pd.merge(items, attrs, on='标题', how='inner') |
6. 对每个用户进行分组汇总
python
1 | order_tag['购买次数'] = 1 |
7. 对重复的数据取平均值
python
1 | res1 = res1.groupby(['会员', '地址']).mean() |
8. 将字符串转为数值的方法有两种:
- 用数值表示具体值,如:好、一般、差就用相关数值表示
- unstack将它转为column,或者get_dummies方法将非数值型转为column
python
1 | pd.get_dummies? |
最后得到的数据:
python
1 | 买家实际支付金额 宝贝种类 宝贝总数量 退款金额 收货地址_上海 收货地址_云南省 收货地址_内蒙古自治区 收货地址_北京 \ |
基于用户聚类
目标:对用户进行标记分类
1. 数据标准化
python
1 | from sklearn.preprocessing import MinMaxScaler |
2. 聚类
python
1 | - 手肘法 |
3. 将类别添加到分析数据中
python
1 | result2['类别'] = km.labels_ #对原始用户进行类别标记 |
基于用户聚类进行推荐
目标:向用户推荐产品
同一类群中,大多数人喜欢的商品,用户也喜欢
python
1 | order_df['商品购买次数'] = 1 |
推荐给用户同一个类别,而没有购买过的商品,按照购买次数排序推荐。
基础知识
pandas.DataFrame基本方法
python
1 | df.info() #查看数据信息 |
df合并
python
1 | merged_df = left_df.merge(right_df, how="left", left_on=u'主机配置', right_on=u'主机说明') |
根据某条数据的属性添加新的数据列
python
1 | df['b'] = 0 |
读取文件时,默认是utf8格式,也可以指定编码
常见的编码方式有:ascii/utf8/unicode/utf-16/gb2312/gbk/gb18030
python
1 | pd.read_csv('file_path.csv', encoding='gb2312') |
将一列数据转为多列数据
python
1 | df = pd.DataFrame([{"a": 1, "name":"1|2|4"}, {"a": 2, "name":"1|5|9"}]) |
将DataFrame中的tuple分割成数据框的多列
python
1 | df = pd.DataFrame({'a':[1,2], 'b':[(1,2), (3,4)]}) |
stack与unstack使用说明:python pandas stack和unstack函数
利用当前数据的多列数据得到新的数据列
python
1 | df['new_column'] = df.apply(lambda row: row['column1'] * row['column2'], axis=1) |
得到类型
中有关系数据库
的数据
plaintext
1 | df[df[u'类型'].str.contains(u'关系数据库')] |
apply函数返回多列数据
python
1 | def parse(item): |
过滤逻辑类型
np.logical_and
python
1 | data = df[np.logical_and(df['col1'].notnull(), df['col1'].str.contains('item'))] |
更改列名
python
1 | data = df.rename(columns={'col1': u'列1', 'col2': u'列2'}) |
将数据转化为常用类型
plaintext
1 | col1_data = df['col1'].tolist() |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Michael Blog!
评论
来做第一个留言的人吧!