import pandas as pd
import numpy as np
from typing import Any
from mapping import *
dataset = pd.ExcelFile('Project Dataset.xlsx')
# 获取表单名
print(dataset.sheet_names)
['Data Dict', 'E Comm']
# 遍历所有工作表并读取前五行数据
sheets_dict = {}
for sheet_name in dataset.sheet_names:
tmp_sheet = dataset.parse(sheet_name = sheet_name)
print(f'======{sheet_name}=======')
print('====head======')
print(tmp_sheet.head())
sheets_dict[sheet_name] = tmp_sheet
======Data Dict=======
====head======
Unnamed: 0 Unnamed: 1 Unnamed: 2 \\
0 NaN Data Variable
1 NaN E Comm CustomerID
2 NaN E Comm Churn
3 NaN E Comm Tenure
4 NaN E Comm PreferredLoginDevice
Unnamed: 3
0 Discerption
1 Unique customer ID
2 Churn Flag
3 Tenure for using the platform (months)
4 Preferred login device of customer
======E Comm=======
====head======
CustomerID Churn Tenure PreferredLoginDevice CityTier WarehouseToHome \\
0 50001 1 4.0 Mobile Phone 3 6.0
1 50002 1 NaN Phone 1 8.0
2 50003 1 NaN Phone 1 30.0
3 50004 1 3.0 Phone 3 15.0
4 50005 1 3.0 Phone 1 12.0
MaritalStatus AgeGroup Gender HourSpendOnApp OrderCount \\
0 Single 3 Female 3.0 1.0
1 Single 4 Male 3.0 1.0
2 Single 4 Male 2.0 1.0
3 Single 4 Male 2.0 1.0
4 Single 3 Male NaN 1.0
OrderAmountHikeFromlastYear DaySinceLastOrder PreferedOrderCat \\
0 11.0 5.0 Laptop & Accessory
1 15.0 0.0 Household
2 14.0 3.0 Household
3 23.0 3.0 Laptop & Accessory
4 11.0 3.0 Household
NumberOfStreamerFollowed SatisfactionScore Complain CouponUsed \\
0 9 2 1 1.0
1 7 3 1 0.0
2 6 3 1 0.0
3 8 5 0 0.0
4 3 5 0 1.0
DiscountAmount
0 159.93
1 120.90
2 120.28
3 134.07
4 129.60
# 查看数据类型
for key,value in sheets_dict.items():
print(key)
print(type(value))
Data Dict
<class 'pandas.core.frame.DataFrame'>
E Comm
<class 'pandas.core.frame.DataFrame'>
# 保存E Comm表单, csv格式
tmp = sheets_dict['E Comm']
tmp.to_csv('data.csv',index=False,sep=",",header=True) # 不保存索引, 分割符:, 保留列名
data = pd.read_csv('data.csv')
print(data.head())
CustomerID Churn Tenure PreferredLoginDevice CityTier WarehouseToHome \\
0 50001 1 4.0 Mobile Phone 3 6.0
1 50002 1 NaN Phone 1 8.0
2 50003 1 NaN Phone 1 30.0
3 50004 1 3.0 Phone 3 15.0
4 50005 1 3.0 Phone 1 12.0
MaritalStatus AgeGroup Gender HourSpendOnApp OrderCount \\
0 Single 3 Female 3.0 1.0
1 Single 4 Male 3.0 1.0
2 Single 4 Male 2.0 1.0
3 Single 4 Male 2.0 1.0
4 Single 3 Male NaN 1.0
OrderAmountHikeFromlastYear DaySinceLastOrder PreferedOrderCat \\
0 11.0 5.0 Laptop & Accessory
1 15.0 0.0 Household
2 14.0 3.0 Household
3 23.0 3.0 Laptop & Accessory
4 11.0 3.0 Household
NumberOfStreamerFollowed SatisfactionScore Complain CouponUsed \\
0 9 2 1 1.0
1 7 3 1 0.0
2 6 3 1 0.0
3 8 5 0 0.0
4 3 5 0 1.0
DiscountAmount
0 159.93
1 120.90
2 120.28
3 134.07
4 129.60
col = data.columns
print(type(col))
<class 'pandas.core.indexes.base.Index'>
print(col) # 打印列名
Index(['CustomerID', 'Churn', 'Tenure', 'PreferredLoginDevice', 'CityTier',
'WarehouseToHome', 'MaritalStatus', 'AgeGroup', 'Gender',
'HourSpendOnApp', 'OrderCount', 'OrderAmountHikeFromlastYear',
'DaySinceLastOrder', 'PreferedOrderCat', 'NumberOfStreamerFollowed',
'SatisfactionScore', 'Complain', 'CouponUsed', 'DiscountAmount'],
dtype='object')
col_list = col.tolist() # 改变类型
print(type(col_list))
print(col_list)
<class 'list'>
['CustomerID', 'Churn', 'Tenure', 'PreferredLoginDevice', 'CityTier', 'WarehouseToHome', 'MaritalStatus', 'AgeGroup', 'Gender', 'HourSpendOnApp', 'OrderCount', 'OrderAmountHikeFromlastYear', 'DaySinceLastOrder', 'PreferedOrderCat', 'NumberOfStreamerFollowed', 'SatisfactionScore', 'Complain', 'CouponUsed', 'DiscountAmount']
from mapping import COL_MAPPING
data.rename(columns=COL_MAPPING,inplace=True) # 重命名列名,替换
print(data.columns)
Index(['客户编号', '客户流失标识', '客户在网时长(月)', '首选登录设备', '城市等级', '仓库到住宅距离(公里)', '婚姻状况',
'年龄分组', '性别', 'APP使用时长(小时/天)', '下单次数', '订单金额较去年涨幅(%)', '距上次下单天数',
'偏好订单品类', '关注主播数量', '满意度评分', '投诉标识', '优惠券使用次数', '优惠金额(元)'],
dtype='object')
print(data['客户编号'].head(n=10))
0 50001
1 50002
2 50003
3 50004
4 50005
5 50006
6 50007
7 50008
8 50009
9 50010
Name: 客户编号, dtype: int64
print(data.shape)
(5630, 19)
print(data.info)
<bound method DataFrame.info of 客户编号 客户流失标识 客户在网时长(月) 首选登录设备 城市等级 仓库到住宅距离(公里) 婚姻状况 \\
0 50001 1 4.0 Mobile Phone 3 6.0 Single
1 50002 1 NaN Phone 1 8.0 Single
2 50003 1 NaN Phone 1 30.0 Single
3 50004 1 3.0 Phone 3 15.0 Single
4 50005 1 3.0 Phone 1 12.0 Single
… … … … … … … …
5625 55626 0 13.0 Pad 1 30.0 Married
5626 55627 0 13.0 Mobile Phone 1 13.0 Married
5627 55628 0 1.0 Mobile Phone 1 11.0 Married
5628 55629 0 23.0 Pad 3 9.0 Married
5629 55630 0 8.0 Mobile Phone 1 15.0 Married
年龄分组 性别 APP使用时长(小时/天) 下单次数 订单金额较去年涨幅(%) 距上次下单天数 \\
0 3 Female 3.0 1.0 11.0 5.0
1 4 Male 3.0 1.0 15.0 0.0
2 4 Male 2.0 1.0 14.0 3.0
3 4 Male 2.0 1.0 23.0 3.0
4 3 Male NaN 1.0 11.0 3.0
… … … … … … …
5625 2 Male 3.0 2.0 18.0 4.0
5626 5 Male 3.0 2.0 16.0 NaN
5627 2 Male 3.0 2.0 21.0 4.0
5628 5 Male 4.0 2.0 15.0 9.0
5629 2 Male 3.0 2.0 13.0 3.0
偏好订单品类 关注主播数量 满意度评分 投诉标识 优惠券使用次数 优惠金额(元)
0 Laptop & Accessory 9 2 1 1.0 159.93
1 Household 7 3 1 0.0 120.90
2 Household 6 3 1 0.0 120.28
3 Laptop & Accessory 8 5 0 0.0 134.07
4 Household 3 5 0 1.0 129.60
… … … … … … …
5625 Laptop & Accessory 6 1 0 1.0 150.71
5626 Fashion 6 5 0 1.0 224.91
5627 Laptop & Accessory 3 4 1 1.0 186.42
5628 Laptop & Accessory 4 4 0 2.0 178.90
5629 Laptop & Accessory 4 3 0 2.0 169.04
[5630 rows x 19 columns]>
loc 根据标签查询行数据
print(type(data.loc(1)))
<class 'pandas.core.indexing._LocIndexer'>
print(data.loc[1]) # 查看第一行(根据索引)
客户编号 50002
客户流失标识 1
客户在网时长(月) NaN
首选登录设备 Phone
城市等级 1
仓库到住宅距离(公里) 8.0
婚姻状况 Single
年龄分组 4
性别 Male
APP使用时长(小时/天) 3.0
下单次数 1.0
订单金额较去年涨幅(%) 15.0
距上次下单天数 0.0
偏好订单品类 Household
关注主播数量 7
满意度评分 3
投诉标识 1
优惠券使用次数 0.0
优惠金额(元) 120.9
Name: 1, dtype: object
print(data.loc[0:2])
客户编号 客户流失标识 客户在网时长(月) 首选登录设备 城市等级 仓库到住宅距离(公里) 婚姻状况 年龄分组 \\
0 50001 1 4.0 Mobile Phone 3 6.0 Single 3
1 50002 1 NaN Phone 1 8.0 Single 4
2 50003 1 NaN Phone 1 30.0 Single 4
性别 APP使用时长(小时/天) 下单次数 订单金额较去年涨幅(%) 距上次下单天数 偏好订单品类 \\
0 Female 3.0 1.0 11.0 5.0 Laptop & Accessory
1 Male 3.0 1.0 15.0 0.0 Household
2 Male 2.0 1.0 14.0 3.0 Household
关注主播数量 满意度评分 投诉标识 优惠券使用次数 优惠金额(元)
0 9 2 1 1.0 159.93
1 7 3 1 0.0 120.90
2 6 3 1 0.0 120.28
print(data.loc[data['APP使用时长(小时/天)']>3]) # 先查看对应列,再看条件
客户编号 客户流失标识 客户在网时长(月) 首选登录设备 城市等级 仓库到住宅距离(公里) 婚姻状况 \\
1408 51409 0 33.0 Mobile Phone 3 31.0 Single
1433 51434 0 3.0 Phone 1 8.0 Married
1536 51537 0 NaN Phone 1 15.0 Single
2815 52816 1 5.0 Mobile Phone 3 7.0 Single
2816 52817 1 1.0 Phone 1 9.0 Single
… … … … … … … …
5617 55618 0 14.0 Phone 1 9.0 Married
5618 55619 0 9.0 Mobile Phone 1 8.0 Married
5620 55621 0 3.0 Mobile Phone 1 35.0 Single
5623 55624 0 5.0 Pad 1 12.0 Single
5628 55629 0 23.0 Pad 3 9.0 Married
年龄分组 性别 APP使用时长(小时/天) 下单次数 订单金额较去年涨幅(%) 距上次下单天数 \\
1408 3 Female 4.0 7.0 11.0 9.0
1433 4 Male 4.0 10.0 19.0 8.0
1536 3 Female 4.0 1.0 16.0 3.0
2815 4 Female 4.0 2.0 12.0 6.0
2816 5 Male 4.0 2.0 16.0 1.0
… … … … … … …
5617 4 Female 4.0 2.0 15.0 3.0
5618 6 Female 4.0 2.0 13.0 2.0
5620 5 Female 4.0 2.0 15.0 5.0
5623 4 Male 4.0 2.0 20.0 NaN
5628 5 Male 4.0 2.0 15.0 9.0
偏好订单品类 关注主播数量 满意度评分 投诉标识 优惠券使用次数 优惠金额(元)
1408 Fashion 8 5 0 6.0 176.37
1433 Laptop & Accessory 2 1 0 3.0 141.52
1536 Household 2 4 0 0.0 122.79
2815 Laptop & Accessory 10 2 1 2.0 184.93
2816 Mobile Phone 8 3 1 1.0 145.90
… … … … … … …
5617 Mobile Phone 4 3 0 1.0 145.01
5618 Mobile Phone 3 1 0 2.0 154.77
5620 Mobile Phone 3 5 0 1.0 162.85
5623 Laptop & Accessory 2 5 0 2.0 224.36
5628 Laptop & Accessory 4 4 0 2.0 178.90
[1179 rows x 19 columns]
iloc 根据物理位置查询
print(type(data.iloc[1]))
print(data.iloc[1])
<class 'pandas.core.series.Series'>
客户编号 50002
客户流失标识 1
客户在网时长(月) NaN
首选登录设备 Phone
城市等级 1
仓库到住宅距离(公里) 8.0
婚姻状况 Single
年龄分组 4
性别 Male
APP使用时长(小时/天) 3.0
下单次数 1.0
订单金额较去年涨幅(%) 15.0
距上次下单天数 0.0
偏好订单品类 Household
关注主播数量 7
满意度评分 3
投诉标识 1
优惠券使用次数 0.0
优惠金额(元) 120.9
Name: 1, dtype: object
print(data.iloc[0:2])
客户编号 客户流失标识 客户在网时长(月) 首选登录设备 城市等级 仓库到住宅距离(公里) 婚姻状况 年龄分组 \\
0 50001 1 4.0 Mobile Phone 3 6.0 Single 3
1 50002 1 NaN Phone 1 8.0 Single 4
性别 APP使用时长(小时/天) 下单次数 订单金额较去年涨幅(%) 距上次下单天数 偏好订单品类 \\
0 Female 3.0 1.0 11.0 5.0 Laptop & Accessory
1 Male 3.0 1.0 15.0 0.0 Household
关注主播数量 满意度评分 投诉标识 优惠券使用次数 优惠金额(元)
0 9 2 1 1.0 159.93
1 7 3 1 0.0 120.90
print(data.iloc[:3])
客户编号 客户流失标识 客户在网时长(月) 首选登录设备 城市等级 仓库到住宅距离(公里) 婚姻状况 年龄分组 \\
0 50001 1 4.0 Mobile Phone 3 6.0 Single 3
1 50002 1 NaN Phone 1 8.0 Single 4
2 50003 1 NaN Phone 1 30.0 Single 4
性别 APP使用时长(小时/天) 下单次数 订单金额较去年涨幅(%) 距上次下单天数 偏好订单品类 \\
0 Female 3.0 1.0 11.0 5.0 Laptop & Accessory
1 Male 3.0 1.0 15.0 0.0 Household
2 Male 2.0 1.0 14.0 3.0 Household
关注主播数量 满意度评分 投诉标识 优惠券使用次数 优惠金额(元)
0 9 2 1 1.0 159.93
1 7 3 1 0.0 120.90
2 6 3 1 0.0 120.28
iloc[i,j] 坐标
loc[ ,‘’] 标签(索引,列名)
print(data.iloc[1,2])
# print(data.loc[1,2])# 报错
print(data.loc[1,'城市等级'])
nan
1
# 查看“APP使用时长(小时/天)”大于3的布尔索引的类型
print(type((data["APP使用时长(小时/天)"] > 3).values))
# 打印布尔索引数组
print((data["APP使用时长(小时/天)"] > 3).values)
# 使用布尔索引过滤出APP使用时长大于3的行
print(data.iloc[(data["APP使用时长(小时/天)"] > 3).values])
<class 'numpy.ndarray'>
[False False False … False True False]
客户编号 客户流失标识 客户在网时长(月) 首选登录设备 城市等级 仓库到住宅距离(公里) 婚姻状况 \\
1408 51409 0 33.0 Mobile Phone 3 31.0 Single
1433 51434 0 3.0 Phone 1 8.0 Married
1536 51537 0 NaN Phone 1 15.0 Single
2815 52816 1 5.0 Mobile Phone 3 7.0 Single
2816 52817 1 1.0 Phone 1 9.0 Single
… … … … … … … …
5617 55618 0 14.0 Phone 1 9.0 Married
5618 55619 0 9.0 Mobile Phone 1 8.0 Married
5620 55621 0 3.0 Mobile Phone 1 35.0 Single
5623 55624 0 5.0 Pad 1 12.0 Single
5628 55629 0 23.0 Pad 3 9.0 Married
年龄分组 性别 APP使用时长(小时/天) 下单次数 订单金额较去年涨幅(%) 距上次下单天数 \\
1408 3 Female 4.0 7.0 11.0 9.0
1433 4 Male 4.0 10.0 19.0 8.0
1536 3 Female 4.0 1.0 16.0 3.0
2815 4 Female 4.0 2.0 12.0 6.0
2816 5 Male 4.0 2.0 16.0 1.0
… … … … … … …
5617 4 Female 4.0 2.0 15.0 3.0
5618 6 Female 4.0 2.0 13.0 2.0
5620 5 Female 4.0 2.0 15.0 5.0
5623 4 Male 4.0 2.0 20.0 NaN
5628 5 Male 4.0 2.0 15.0 9.0
偏好订单品类 关注主播数量 满意度评分 投诉标识 优惠券使用次数 优惠金额(元)
1408 Fashion 8 5 0 6.0 176.37
1433 Laptop & Accessory 2 1 0 3.0 141.52
1536 Household 2 4 0 0.0 122.79
2815 Laptop & Accessory 10 2 1 2.0 184.93
2816 Mobile Phone 8 3 1 1.0 145.90
… … … … … … …
5617 Mobile Phone 4 3 0 1.0 145.01
5618 Mobile Phone 3 1 0 2.0 154.77
5620 Mobile Phone 3 5 0 1.0 162.85
5623 Laptop & Accessory 2 5 0 2.0 224.36
5628 Laptop & Accessory 4 4 0 2.0 178.90
[1179 rows x 19 columns]
print(data['客户流失标识'])
0 1
1 1
2 1
3 1
4 1
..
5625 0
5626 0
5627 0
5628 0
5629 0
Name: 客户流失标识, Length: 5630, dtype: int64
from mapping import CHURN_MAPPING
data['客户流失标识'] = data['客户流失标识'].map(CHURN_MAPPING) # 根据字典,替换数据
print(data['客户流失标识'])
0 流失
1 流失
2 流失
3 流失
4 流失
…
5625 未流失
5626 未流失
5627 未流失
5628 未流失
5629 未流失
Name: 客户流失标识, Length: 5630, dtype: object
from mapping import DEVICE_MAPPING, MARITAL_STATUS_MAPPING, CITYTIER_MAPPING, AGEGROUP_MAPPING, GENDER_MAPPING, PREFEREDORDERCAT_MAPPING, COMPLAIN_MAPPING
data['首选登录设备'] = data['首选登录设备'].map(DEVICE_MAPPING)
data['婚姻状况'] = data['婚姻状况'].map(MARITAL_STATUS_MAPPING)
data['年龄分组'] = data['年龄分组'].map(AGEGROUP_MAPPING)
data['性别'] = data['性别'].map(GENDER_MAPPING)
data['投诉标识'] = data['投诉标识'].map(COMPLAIN_MAPPING)
data['城市等级'] = data['城市等级'].map(CITYTIER_MAPPING)
data['偏好订单品类'] = data['偏好订单品类'].map(PREFEREDORDERCAT_MAPPING)
print(data['首选登录设备'])
0 手机
1 电话
2 电话
3 电话
4 电话
…
5625 平板电脑
5626 手机
5627 手机
5628 平板电脑
5629 手机
Name: 首选登录设备, Length: 5630, dtype: object
for c in data.columns:
print(f'=== {c} ===')
print(data[c].unique()) # 查看一列的所有取值
if data[c].isna().any(): # 是否存在空值
print(f'=== {c} === 存在空值')
print(f'空值数量:=== {data[c].isna().sum()} ===') # 空值数量
=== 客户编号 ===
[50001 50002 50003 … 55628 55629 55630]
=== 客户流失标识 ===
['流失' '未流失']
=== 客户在网时长(月) ===
[ 4. nan 3. 13. 11. 9. 19. 23. 14. 8. 18. 5. 2. 33. 1. 29. 6. 26.
28. 7. 24. 25. 15. 22. 27. 16. 12. 21. 17. 53. 63. 31. 51. 61.]
=== 客户在网时长(月) === 存在空值
空值数量:=== 264 ===
=== 首选登录设备 ===
['手机' '电话' '平板电脑']
=== 城市等级 ===
['三线城市' '一线城市' '二线城市']
=== 仓库到住宅距离(公里) ===
[ 6. 8. 30. 15. 12. 22. 11. 9. 31. 18. 13. 20. 29. 28.
26. 14. nan 10. 27. 17. 23. 33. 19. 35. 24. 16. 25. 32.
34. 5. 21. 126. 7. 36. 127.]
=== 仓库到住宅距离(公里) === 存在空值
空值数量:=== 251 ===
=== 婚姻状况 ===
['单身' '离异' '已婚']
=== 年龄分组 ===
['30-39' '40-49' '50-59' '18-29' '未成年' '60及以上']
=== 性别 ===
['女性' '男性']
=== APP使用时长(小时/天) ===
[ 3. 2. nan 1. 0. 4. 5.]
=== APP使用时长(小时/天) === 存在空值
空值数量:=== 255 ===
=== 下单次数 ===
[ 1. 6. 2. 15. 4. 7. 3. 9. nan 11. 5. 12. 10. 8. 13. 14. 16.]
=== 下单次数 === 存在空值
空值数量:=== 258 ===
=== 订单金额较去年涨幅(%) ===
[11. 15. 14. 23. 22. 16. 12. nan 13. 17. 18. 24. 19. 20. 21. 25. 26.]
=== 订单金额较去年涨幅(%) === 存在空值
空值数量:=== 265 ===
=== 距上次下单天数 ===
[ 5. 0. 3. 7. 2. 1. 8. 6. 4. 15. 9. 11. 10. nan 13. 12. 17. 16.
14. 30. 46. 18. 31.]
=== 距上次下单天数 === 存在空值
空值数量:=== 307 ===
=== 偏好订单品类 ===
['笔记本电脑及配件' '家居用品' '手机' '其他品类' '服饰类' '食品杂货']
=== 关注主播数量 ===
[ 9 7 6 8 3 2 4 10 1 5 19 21 11 20 22]
=== 满意度评分 ===
[2 3 5 4 1]
=== 投诉标识 ===
['投诉' '未投诉']
=== 优惠券使用次数 ===
[ 1. 0. 4. 2. 9. 6. 11. nan 7. 12. 10. 5. 3. 13. 15. 8. 14. 16.]
=== 优惠券使用次数 === 存在空值
空值数量:=== 256 ===
=== 优惠金额(元) ===
[159.93 120.9 120.28 … 173.77 287.91 173.78]
data['首选登录设备'].isna().any()
np.False_
t = 'Complain'.upper()
print(t)
COMPLAIN
data['城市等级'].unique()
array(['三线城市', '一线城市', '二线城市'], dtype=object)
data.to_csv('电商行为数据.csv',index=False)


