实战内容是通过pandas和sklearn对数据进行处理,已找出用户对物品类别的喜好(就是找到user_id 和 aisles之间的关系)
在kaggle上可以在下载关于instacart的数据集,在我之前的文章中可以找到如何使用kaggle下载数据集
本数据集分为7个部分(本例子用到其中4个部分)
1.order_products_prior
字段:older_id, product_id, add_to_cart_order, reordered
order_id:订单ID
product_id:产品ID
add_to_cart_order :加入购物车的顺序
reordered:复购,0为首次购买,1为复购
2.products.csv
字段:product_id, product_name, aisle_id, department_id
product_id:产品ID
product_name:产品名称
aisle_id:货架ID
deparmrnt_id:部门ID
3.orders.csv
字段:order_id, user_id, eval_set, order_number
order_id:订单ID
user_id:用户ID
eval_set:订单划分去向
order_number:订单序号
order_dow:订单在周几产生的
order_hour_of_day:订单在何时产生的
days_since_prior_order:此次购买距离上次购买过了多长时间
4.aisle.csv
字段:aisle_id, aisle
aisles_id: 货架ID
aisle: 货架名称
对于数据集处理的思想:
找到相关的两者,对于将两者放在同一张大表里,在使用交叉表将数据进行合并。将表放在大表里的过程使用pandas的merge函数。将user_id作为index
该列表的形成为:每一次购物都会被作为一个order,假如一个人同时买了两个相同的物品,但是在数据集中的显示为,这个人有一个订单。但该定单显示对应着两个物品,这也就是为什么最后可以转化为每一个user所购买的每一个物品的数目。
import pandas as pd
from sklearn.decomposition import PCA
# 将数据合并,并找出两者之间的关系
order_products = pd.read_csv('DS/instacart/order_products__prior.csv')
products = pd.read_csv('DS/instacart/products.csv')
orders = pd.read_csv('DS/instacart/orders.csv')
aisle = pd.read_csv('DS/instacart/aisles.csv')
data0 = pd.merge(aisle, products, on=["aisle_id", "aisle_id"])
data1 = pd.merge(data0, order_products, on=["product_id", "product_id"])
data2 = pd.merge(data1, orders, on=["order_id", "order_id"])
table = pd.crosstab(data2["user_id"], data2["aisle"])
trans = PCA(n_components=0.95)
new_tale = trans.fit_transform(table)
print(table)
print(new_tale.shape)
结果为
aisle air fresheners candles asian foods baby accessories baby bath body care baby food formula ... trash bags liners vitamins supplements water seltzer sparkling water white wines yogurt
user_id ...
1 0 0 0 0 0 ... 0 0 0 0 1
2 0 3 0 0 0 ... 0 0 2 0 42
3 0 0 0 0 0 ... 0 0 2 0 0
4 0 0 0 0 0 ... 0 0 1 0 0
5 0 2 0 0 0 ... 0 0 0 0 3
... ... ... ... ... ... ... ... ... ... ... ...
206205 0 0 1 0 0 ... 0 0 0 0 5
206206 0 4 0 0 0 ... 1 0 1 0 0
206207 0 0 0 0 1 ... 0 0 11 0 15
206208 0 3 0 0 3 ... 0 0 0 0 33
206209 0 1 0 0 0 ... 1 0 0 0 3
[206209 rows x 134 columns]
(206209, 44)
可以看出,数据完成了降维,从134个特征值转化为了44个特征值,完成了数据的降维。