电商数据预处理
今天对电商数据进行了预处理,主要处理了
1. 提取2019年的订单数据
2. 处理业务流程不符的数据(支付时间早于下单时间、支付时长超过30分钟、订单金额小于0、支付金额小于0)
3. 处理渠道为空的数据(补充众数)
4. 处理平台类型字段(去掉多余的空格,保持数据一致)
5. 添加折扣字段,处理折扣大于1的字段(将支付金额修改为“订单金额*平均折扣”)
数据在这里,有兴趣跟我一起做。(百度网盘)
链接:https://pan.baidu.com/s/1yprZr0sxzLLPPBy-ICCocg
提取码:dmmo
各字段说明:
1.‘id’ 打酱油的索引
2.‘orderID’ 订单id
3. ‘userID’ 用户id
4. ‘goodsID’ 商品id
5. ‘orderAmount’ 订单价格
6. ‘payment’ 实付价格
7. ‘chanelID’ 渠道
8. ‘platfromType’ 平台类型
9. 'orderTime’下单时间
10. 'payTime’支付时间
11. ‘chargeback’ 是否退款
废话不多说,直接上代码
# 导入数据分析三大神器库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
1.导入数据
# 1.导入数据
ds_df = pd.read_excel('data/某电商网站订单数据.xlsx')
#请你将路径换为自己放数据的路径
1.1查看数据前五行
ds_df.head() # 查看数据前五行
1.2属性等信息
ds_df.info()
2.数据预处理
2.1. 提取2019年的订单数据
# 进行布尔索引
df_19 = ds_df[ds_df.orderTime.dt.year==2019]
len(df_19)
这里可知数据已经变少了,接下来我们就用这个新的df_19进行进一步处理
2.2 处理业务流程不符的数据(支付时间早于下单时间、支付时长超过30分钟、订单金额小于0、支付金额小于0)
# 过滤掉支付时间早于下单时间的订单
df_19 = df_19[~(df_19.payTime<df_19.orderTime)]
# 过滤掉支付时长超过30分钟的订单
df_19 = df_19[(df_19.payTime-df_19.orderTime)<pd.to_timedelta('0 days 00:30:00')]
# 过滤掉订单金额小于0、支付金额小于0的订单
df_19 = df_19[(df_19.orderAmount>0) & (df_19.payment > 0)]
len(df_19)
2.3. 处理渠道为空的数据(补充众数)
df_19.chanelID.isnull().any() # 判断是否有空值
# 拿到chanelID的众数,这里得到的众数是一个对象,不能用于在直接填充
chanel_mode = df_19.chanelID.mode()
# 填充空值(将上面的对象转换成字符串再填充)
df_19.fillna(value={'chanelID':str(chanel_mode)},inplace=True)
2.4. 处理平台类型字段(去掉多余的空格,保持数据一致)
# 将所有字符转成小写
df_19.platfromType = df_19.platfromType.str.lower()
# 去掉多余的空格,保持数据一致
df_19.platfromType = df_19.platfromType.str.replace(' ','')
2.5. 添加折扣字段,处理折扣大于1的字段(将支付金额修改为“订单金额*平均折扣”)
# 获取折扣正常订单
temp = df_19[~((df_19.payment / df_19.orderAmount)>1)]
# 计算正常订单的平均折扣
mean_discount=(temp.payment / temp.orderAmount).mean()
# 拿出异常折扣订单
temp1 = df_19[(df_19.payment / df_19.orderAmount)>1]
# 将异常的支付价格改正
temp1['payment'] = np.round(temp1.orderAmount*mean_discount,2)
temp1.set_index('id')
temp1.index
over_discount_index = temp1.index
# 将df_19中的异常行用temp1的行来替换
df_19.loc[over_discount_index] = temp1.loc[over_discount_index]
到这里就完成了预处理,但是你发现索引并不好看,于是我将索引重置
df_19.reset_index(drop=True,inplace=True)
完成后效果是这样的。
想了解更多知识,欢迎移步到微信公众号
扫码或搜索数据分析者
好了,创作不易,有帮助留下你的赞或小额打赏哦!