使用Python构建Feature Matrix:基于两份Excel购物数据的需求
构建基于购物记录的特征矩阵(Python实现)
没问题,我帮你搞定这个需求。咱们可以用pandas来处理这两个Excel文件,根据你的数据特点,有两种常见的特征矩阵构建方式,我都会给你演示清楚。
先明确数据情况
你的食品购买数据里,存在同一个人同一天购买多种食品的情况(比如Bob在2015年3月14日买了苹果和梨),而饮品数据里每个(姓名+日期)组合只有一条记录。我们可以基于这个情况选择不同的构建方式。
方式1:每条食品购买记录作为特征矩阵的一行
这种方式下,每一行对应一次食品购买行为,同时关联当天购买的饮品,适合需要分析单类食品购买关联的场景。
步骤1:读取Excel文件
import pandas as pd # 读取食品和饮品数据 food_df = pd.read_excel('food_shopping.xlsx') drink_df = pd.read_excel('drink_shopping.xlsx')
步骤2:合并数据集
基于Name和Day of Shopping做内连接,把每条食品记录和当天的饮品记录关联起来:
merged_df = pd.merge(food_df, drink_df, on=['Name', 'Day of Shopping'], how='inner')
合并后的结果示例:
| Name | Day of Shopping | Food bought | Drink bought |
|---|---|---|---|
| Bob | 2015年3月14日 | 苹果 | 水 |
| Bob | 2015年3月14日 | 梨 | 水 |
| Bob | 2017年6月28日 | 石榴 | 苏打水 |
| Joe | 2013年4月15日 | 苹果 | 果汁 |
| Joe | 2016年12月6日 | 香蕉 | 苏打水 |
| Jake | 2008年1月4日 | 橙子 | 水 |
| Jake | 2010年4月9日 | 桃子 | 茶 |
步骤3:生成one-hot特征矩阵
把食品和饮品转换成数值型的one-hot特征,方便后续建模使用:
feature_matrix = pd.get_dummies(merged_df, columns=['Food bought', 'Drink bought'])
最终特征矩阵示例(部分列):
| Name | Day of Shopping | Food bought_苹果 | Food bought_梨 | Drink bought_水 |
|---|---|---|---|---|
| Bob | 2015年3月14日 | 1 | 0 | 1 |
| Bob | 2015年3月14日 | 0 | 1 | 1 |
| Bob | 2017年6月28日 | 0 | 0 | 0 |
方式2:每个(姓名+日期)组合作为特征矩阵的一行
这种方式下,每一行对应一个人一天的完整购物记录,把当天购买的所有食品和饮品都作为特征(比如当天买了苹果和梨,对应的两个特征列都为1),适合分析用户单日购物行为的场景。
步骤1:预处理食品数据,合并同一天的购买记录
# 分组聚合,把同一个人同一天买的食品合并成列表 food_grouped = food_df.groupby(['Name', 'Day of Shopping'])['Food bought'].apply(list).reset_index() # 合并饮品数据 merged_df = pd.merge(food_grouped, drink_df, on=['Name', 'Day of Shopping'], how='inner')
合并后的中间结果:
| Name | Day of Shopping | Food bought | Drink bought |
|---|---|---|---|
| Bob | 2015年3月14日 | ['苹果', '梨'] | 水 |
| Bob | 2017年6月28日 | ['石榴'] | 苏打水 |
步骤2:生成合并后的特征矩阵
把食品列表展开做one-hot编码,再按(姓名+日期)分组取最大值(表示当天是否购买了该食品):
# 展开食品列表并做one-hot编码,再分组聚合 feature_matrix = ( merged_df.explode('Food bought') .pipe(pd.get_dummies, columns=['Food bought', 'Drink bought']) .groupby(['Name', 'Day of Shopping']) .max() .reset_index() )
最终特征矩阵示例(部分列):
| Name | Day of Shopping | Food bought_苹果 | Food bought_梨 | Drink bought_水 |
|---|---|---|---|---|
| Bob | 2015年3月14日 | 1 | 1 | 1 |
| Bob | 2017年6月28日 | 0 | 0 | 0 |
额外优化:日期特征处理
如果需要把日期转换成可建模的数值特征,可以解析日期并提取年、月、日:
# 解析中文日期为datetime类型 merged_df['Day of Shopping'] = pd.to_datetime(merged_df['Day of Shopping'], format='%Y年%m月%d日') # 提取日期特征 feature_matrix['Year'] = merged_df['Day of Shopping'].dt.year feature_matrix['Month'] = merged_df['Day of Shopping'].dt.month feature_matrix['Day'] = merged_df['Day of Shopping'].dt.day
这样处理后,特征矩阵就包含了更丰富的数值特征,方便后续的机器学习建模或数据分析使用。
内容的提问来源于stack exchange,提问作者A.Code.1
相关产品推荐
相关产品推荐

