kaggle上面的E-Commerce Data数据集练习(数据处理)
熟练一下pandas和数据处理
项目地址
参考:Python数据清洗指南
Customer Segmentation with XGBoost (97.92%)
项目描述:
这是一个跨国数据集,包含2010年12月1日至2011年12月9日期间英国注册的非商店在线零售的所有交易。该公司主要销售独特的万能礼品。公司的许多客户都是批发商。
Part 1 分析数据,探索数据,清洗数据
导入数据
data = pd.read_csv("C:\\Users\\Nihil\\Documents\\pythonlearn\\data\\kaggle\\E-Commerce Data.csv",encoding='ISO-8859-1',dtype=str)
## encoding = "ISO-8859-1" -- 用什么解码,一般会默认系统的编码,如果是中文就用 "utf-8"
1. 分析数据
1.1查看数据类型
print(data.info())
Out:
Data columns (total 8 columns):
InvoiceNo 541909 non-null object
StockCode 541909 non-null object
Description 540455 non-null object
Quantity 541909 non-null object
InvoiceDate 541909 non-null object
UnitPrice 541909 non-null object
CustomerID 406829 non-null object
Country 541909 non-null object
dtypes: object(8)
1.2数据具体
print(data.head())
图中可获取的信息:
- InvoiceDate的时间出现具体时分,可以删去(时序数据的处理)
- Description大概率是人工填写的数据,一般都会有比较多格式问题。比如第一行就出现了‘-’。
1.3数据描述
print(data.describe())
Quantity UnitPrice
count 536641.000000 536641.000000
mean 9.620029 4.632656
std 219.130156 97.233118
min -80995.000000 -11062.060000
25% 1.000000 1.250000
50% 3.000000 2.080000
75% 10.000000 4.130000
max 80995.000000 38970.000000
Quantity出现了负值。显然不正常
1.4 转换数据类型
data['CustomerID'] = data['CustomerID'].astype('int64')
print(data.dtypes)
2.检查空值
2.1第一种方法
out = data.isnull().sum().sort_values(ascending=False)
Out:
CustomerID 135080
Description 1454
Country 0
UnitPrice 0
InvoiceDate 0
Quantity 0
StockCode 0
InvoiceNo 0
dtype: int64
2.2用图表示
plt.figure(figsize=(5,5))
data.isnull().mean(axis=0).plot.barh()
plt.title("Ratio of missing values per columns")
plt.show()
2.3 查看缺失数据的比例
missing_percentage = data.isnull().sum()/data.shape[0]*100
print(missing_percentage)
InvoiceNo 0.000000
StockCode 0.000000
Description 0.268311
Quantity 0.000000
InvoiceDate 0.000000
UnitPrice 0.000000
CustomerID 24.926694
Country 0.000000
dtype: float64
2.4 缺失值描述
2.4.1 深入了解缺失数据,看到哪些行缺失
nan_rows = data[data.isnull().T.any().T]
print(nan_rows.head(5))
Out:
InvoiceNo StockCode ... CustomerID Country
622 536414 22139 ... NaN United Kingdom
1443 536544 21773 ... NaN United Kingdom
1444 536544 21774 ... NaN United Kingdom
1445 536544 21786 ... NaN United Kingdom
1446 536544 21787 ... NaN United Kingdom
- any(iterable): 查看iterable (元组或列表)是否有空值,如果有空值,返回True
Python any() 函数
data[data.isnull().T.any().T]的目的:
可以返回哪一行出现了空值。
一个详细讲解:How to return rows with missing values in Pandas DataFrame
2.4.2 挑出缺失的某一行,查看其信息
print(data[data.InvoiceNo == '536414'])
print(data[data.InvoiceNo == '536544'][:5])
缺失值主要存在于CustomerID,这个特征好像无法用其他方式处理。所以去掉。
去掉缺失值的列方法
data = data.drop(['CustomerID'],axis=1)#简单粗暴去掉这一列了
print(data.columns.values)
['InvoiceNo' 'StockCode' 'Description' 'Quantity' 'InvoiceDate''UnitPrice' 'Country']
再检查一遍
plt.figure(figsize=(5,5))
data.isnull().mean(axis=0).plot.barh()
plt.title("Ratio of missing values per columns")
plt.show()
已经没有空值了
去掉缺失值
data = data.dropna(subset=["CustomerID"])
3.检查重复值
print('Dupplicate entries: {}'.format(data.duplicated().sum()))
去掉:
data.drop_duplicates()
4. 对于标点标点符号掺杂/大小写不一致等问题
查看商品名称的去重项。
np.set_printoptions(threshold=np.inf)
print(data['Description'].unique())
# 设置输出全部的内容
# threshold就是设置超过了多少条,就会呈现省略
#(比如threshold=10的意思是超过10条就会省略)
np.set_printoptions(threshold=np.inf)
有一些空格问题。
根据第一步数据预处理后,整理一下该数据集有下列问题需要处理:
1)调整数据类型:由于一开始用到了str来导入,打算后期再更换格式,需要调整数据类型。
2)修改列名:该数据的名称不易于理解,需要改列名
3)选择部分子集:因为有部分列在数据分析中不需要用到
4)可能存在逻辑问题需要筛选:比如Unit Price为负
5)格式一致化:Description可能会存在有标点符号掺杂/大小写不一致/空格重复出现等问题
6)消灭空值:CustomerID、Description、Country和UnitPrice都出现了NaN值,需要去掉
特征具体的分析
数据特征有
Description 对商品的描述 类别
Country 购买国家 类别
UnitPrice 单价 离散值
InvoiceDate 购买日期 时间序列
Quantity 序列特征
StockCode 货号 数值型
InvoiceNo 发票号 数值型
再对数据进行处理
print(data.describe().round(2))
Quantity UnitPrice CustomerID
count 401604.00 401604.00 401604.00
mean 12.18 3.47 15281.16
std 250.28 69.76 1714.01
min -80995.00 0.00 12346.00
25% 2.00 1.25 13939.00
50% 5.00 1.95 15145.00
75% 12.00 3.75 16784.00
max 80995.00 38970.00 18287.00
检查类别特征Countries。
data.Country.nunique()
nuinque() 这个函数分别统计每一列属性各自有多少个不同值。
- Countries与序列特征CustomerID
customer_country=data[['Country','CustomerID']].drop_duplicates()
customer_country = customer_country.groupby(['Country'])['CustomerID'].aggregate('count').reset_index().sort_values('CustomerID', ascending=False)
print(customer_country)
Out:
Country CustomerID
35 United Kingdom 3950
14 Germany 95
13 France 87
30 Spain 31
3 Belgium 25
32 Switzerland 21
26 Portugal 19
18 Italy 15
12 Finland 12
1 Austria 11
24 Norway 10
23 Netherlands 9
0 Australia 9
9 Denmark 9
6 Channel Islands 9
7 Cyprus 8
31 Sweden 8
19 Japan 8
25 Poland 6
33 USA 4
5 Canada 4
36 Unspecified 4
17 Israel 4
15 Greece 4
10 EIRE 3
22 Malta 2
34 United Arab Emirates 2
2 Bahrain 2
8 Czech Republic 1
21 Lithuania 1
20 Lebanon 1
27 RSA 1
28 Saudi Arabia 1
29 Singapore 1
16 Iceland 1
4 Brazil 1
11 European Community 1
超过90%的数据来自英国。
aggregate用法的解析
reset_index() :reset_index() #将会将原来的索引index作为新的一列
用之前统计的方法
out = data[['Country','CustomerID']].groupby('Country').count().sort_values('CustomerID', ascending=False)
print(out)
Out:
CustomerID
Country
United Kingdom 356728
Germany 9480
France 8475
EIRE 7475
Spain 2528
Netherlands 2371
Belgium 2069
Switzerland 1877
Portugal 1471
Australia 1258
Norway 1086
Italy 803
Channel Islands 757
Finland 695
Cyprus 611
Sweden 461
Austria 401
Denmark 389
Japan 358
Poland 341
USA 291
Israel 247
Unspecified 241
Singapore 229
Iceland 182
Canada 151
Greece 146
Malta 127
United Arab Emirates 68
European Community 61
RSA 58
Lebanon 45
Lithuania 35
Brazil 32
Czech Republic 30
Bahrain 17
Saudi Arabia 10
做个图
f,ax = plt.subplots(figsize=(8,5))
data[['Country','CustomerID']].groupby(['Country'])['CustomerID'].aggregate('count').plot.bar()
ax.set_title('Country CustomerID')
plt.show()
检查负值(Quantity)
print(data[(data['Quantity']<0)].head(5))
Out:
InvoiceNo StockCode Description Quantity InvoiceDate UnitPrice CustomerID Country
141 C536379 D Discount -1 12/1/2010 9:41 27.50 14527 United Kingdom
154 C536383 35004C SET OF 3 COLOURED FLYING DUCKS -1 12/1/2010 9:49 4.65 15311 United Kingdom
235 C536391 22556 PLASTERS IN TIN CIRCUS PARADE -12 12/1/2010 10:24 1.65 17548 United Kingdom
236 C536391 21984 PACK OF 12 PINK PAISLEY TISSUES -24 12/1/2010 10:24 0.29 17548 United Kingdom
237 C536391 21983 PACK OF 12 BLUE PAISLEY TISSUES -24 12/1/2010 10:24 0.29 17548 United Kingdom
可获得信息如下:
1.StockCode不仅仅是数字,还有一些特殊的值,比如D,代表折扣。
2.InvoiceNo也不仅仅是数字,其上面有个C,这表明订单可以取消。
去掉负值(Quantity)
data = data[data.Quantity > 0]
print(data.describe().round(2))
Out:
Quantity UnitPrice CustomerID
count 391183.00 391183.00 391183.00
mean 13.18 2.87 15295.08
std 181.91 4.28 1710.36
min 1.00 0.00 12346.00
25% 2.00 1.25 13969.00
50% 6.00 1.95 15158.00
75% 12.00 3.75 16794.00
max 80995.00 649.50 18287.00
1 InvoiceNo - Cancelation Code(那个大C)
看看取消了多少
主要是为了观测客户行为
temp = data.groupby(by=['CustomerID', 'InvoiceNo'],as_index=False)['InvoiceDate'].count()
print(temp)
CustomerID InvoiceNo InvoiceDate
0 12346 541431 1
1 12346 C541433 1
2 12347 537626 31
3 12347 542237 29
4 12347 549222 24
5 12347 556201 18
6 12347 562032 22
7 12347 573511 47
8 12347 581180 11
9 12348 539318 17
10 12348 541998 6
11 12348 548955 5
12 12348 568172 3
13 12349 577609 73
14 12350 543037 17
15 12352 544156 15
16 12352 545323 5
17 12352 545332 3
18 12352 546869 7
19 12352 547390 8
20 12352 567505 18
21 12352 568699 14
22 12352 574275 15
23 12352 C545329 2
24 12352 C545330 1
25 12352 C547388 7
26 12353 553900 4
27 12354 550911 58
28 12355 552449 13
29 12356 541430 36... ... ...
22160 18276 572990 14
22161 18276 C577386 1
22162 18276 C577390 1
22163 18277 570859 8
22164 18277 C542086 1
22165 18278 568492 9
22166 18280 545712 10
22167 18281 556464 7
22168 18282 562525 7
22169 18282 580173 5
22170 18282 C562808 1
22171 18283 540350 57
22172 18283 541854 44
22173 18283 545079 29
22174 18283 550957 55
22175 18283 554157 37
22176 18283 556731 24
22177 18283 557956 76
22178 18283 560025 54
22179 18283 560032 1
22180 18283 565579 47
22181 18283 573093 38
22182 18283 575668 56
22183 18283 575675 1
22184 18283 578262 102
22185 18283 579673 50
22186 18283 580872 50
22187 18287 554065 29
22188 18287 570715 38
22189 18287 573167 3
as_index
重命名InvoiceDate
nb_products_per_basket = temp.rename(columns = {'InvoiceDate':'Number of products'})
print(nb_products_per_basket)
用购买天数统计了某客户买的商品量
CustomerID InvoiceNo Number of products
0 12346 541431 1
1 12346 C541433 1
2 12347 537626 31
3 12347 542237 29
4 12347 549222 24
查找取消的订单并查看其所占比例
nb_products_per_basket.InvoiceNo = nb_products_per_basket.InvoiceNo.astype(str)#把InvoiceNo转换成str类型后,再查找里面包含特殊字母的异常值
nb_products_per_basket['order_canceled'] = nb_products_per_basket['InvoiceNo'].apply(lambda x:int('C' in x))#找到异常值并且把其作为一列
cancel = len(nb_products_per_basket[nb_products_per_basket['order_canceled']==1])/len(nb_products_per_basket)#如何计算异常值的占比
print('{:.2%} of the transactions were canceled'.format(cancel))
Out:
16.47% of the transactions were canceled
再来仔细看看哪些用户取消了订单
print(nb_products_per_basket[nb_products_per_basket['order_canceled']==1][:5])
Out
CustomerID InvoiceNo Number of products order_canceled
1 12346 C541433 1 1
23 12352 C545329 2 1
24 12352 C545330 1 1
25 12352 C547388 7 1
39 12359 C549955 2 1
转换日期
import datetime
import time
data.loc[:,'InvoiceDate'] = pd.to_datetime(data.loc[:,'InvoiceDate'],format='%m/%d/%Y',errors='ignore')
print(data.loc[:,'InvoiceDate'])
Out
0 12/1/2010 8:26
1 12/1/2010 8:26
2 12/1/2010 8:26
3 12/1/2010 8:26
4 12/1/2010 8:26
Name: InvoiceDate, dtype: object
可以看到,值并没有任何变化。因为并没有剔除掉分秒。
空格分割
def splittime(Intime):timeList = []for value in Intime:dateStr = value.split(' ')[0]timeList.append(dateStr)timeSer = pd.Series(timeList)return timeSer
data.loc[:,'InvoiceDate'] = splittime(data.loc[:,'InvoiceDate'])
.split(’ ')[0] 关于[0],运行后,取前面分割前一部分(即日期)
这个地方一定要记得输入空格,不然会报错的。
Out:
0 12/1/2010
1 12/1/2010
2 12/1/2010
3 12/1/2010
4 12/1/2010
5 12/1/2010
6 12/1/2010
7 12/1/2010
8 12/1/2010
.....
541903 NaN
541904 NaN
541905 NaN
541906 NaN
541907 NaN
541908 NaN
检查一下空值
print(data[data['InvoiceDate'].index == 541908])
显然分得不大对
print(data.loc[:,'InvoiceDate'].isnull().sum())
out:
105963
这个问题没有得到解决。为了不浪费时间先不纠结了。 留着分秒。
data['InvoiceDate'] = pd.to_datetime(data.InvoiceDate,format='%m/%d/%Y %H:%M')
print(data.InvoiceDate)
Out:
0 2010-12-01 08:26:00
1 2010-12-01 08:26:00
2 2010-12-01 08:26:00
3 2010-12-01 08:26:00
4 2010-12-01 08:26:00
Name: InvoiceDate, dtype: datetime64[ns]
转换时间成功。
#!!⚠️ format 是你[原始数据]中日期的格式
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00-59)
%S 秒(00-59)
description处理
改为小/大写
data['Description'] = data.Description.str.lower()
print(data.Description.head(10))
Out:
0 white hanging heart t-light holder
1 white metal lantern
2 cream cupid hearts coat hanger
3 knitted union flag hot water bottle
4 red woolly hottie white heart.
5 set 7 babushka nesting boxes
6 glass star frosted t-light holder
7 hand warmer union jack
8 hand warmer red polka dot
9 assorted colour bird ornament
Name: Description, dtype: object
Stockcode
找到Stockcode里的非数值类型:
list_special_codes = data[data['StockCode'].str.contains('^[a-zA-Z]+', regex=True)]['StockCode'].unique()print(list_special_codes)
Out:
['POST' 'D' 'C2' 'M' 'BANK CHARGES' 'PADS' 'DOT' 'CRUK']
去掉这些非数值类型。
data = data[data['StockCode']!= 'POST']
data = data[data['StockCode']!= 'D']
data = data[data['StockCode']!= 'C2']
data = data[data['StockCode']!= 'M']
data = data[data['StockCode']!= 'BANK CHARGES']
data = data[data['StockCode']!= 'PADS']
data = data[data['StockCode']!= 'DOT']
data = data[data['StockCode']!= 'CRUK']
list_special_codes2 = data[data['StockCode'].str.contains('^[a-zA-Z]+', regex=True)]['StockCode'].unique()
print(list_special_codes2)
Out:
[]
kaggle上面的E-Commerce Data数据集练习(数据处理)相关推荐
- kaggle上面的score以及ROC_AUC数值咋回事
TP:真的传染病患者被检测为传染病患者 FP:假的传染病患者被检测为传染病患者 假如现在10000人 其中9900正常,100人禽流感. 如果你的分类器全部设定为正常,那么精度就是9900,但是这个我 ...
- kaggle上面的E-Commerce Data数据集练习(可视化与部分特征工程)
接上篇: https://editor.csdn.net/md/?articleId=103394900 集体换个列名 data = data.rename(index=str, columns={' ...
- 如何下载kaggle上的数据集
如何下载kaggle上的数据集 1 直接下载 2 通过kaggle提供的API下载数据集 2.1 Cifar10 数据集地址 2.2 kaggle如何通过kaggle提供的API下载数据集 3 错误 ...
- python可视化多个机器学习模型在独立测试集(test data set)上面的AUC值、可视化模型效能
python可视化多个机器学习模型在独立测试集(test data set)上面的AUC值.可视化模型效能 # x_lables为模型名称列表,包括,逻辑回归.朴素贝叶斯.支持向量机.随机森林.xgb ...
- c罗python可视化分析_关于C罗“冲刺速度”这种隐私问题,我们在Kaggle上找到了数据集,然后。。。...
原标题:关于C罗"冲刺速度"这种隐私问题,我们在Kaggle上找到了数据集,然后... 今日份知识你摄入了么? 你知道 FIFA 么?在线踢足球那种,贼老多人玩儿这个游戏,本仙女作 ...
- Kaggle上的犬种识别(ImageNet Dogs)
Kaggle上的犬种识别(ImageNet Dogs) Dog Breed Identification (ImageNet Dogs) on Kaggle 在本节中,将解决在Kaggle竞赛中的犬种 ...
- Kaggle上的狗品种识别(ImageNet Dogs)
Kaggle上的狗品种识别(ImageNet Dogs) 在本节中,我们将解决Kaggle竞赛中的犬种识别挑战,比赛的网址是https://www.kaggle.com/c/dog-breed-ide ...
- Kaggle教程 机器学习中级7 Data Leakage
<Kaggle教程 机器学习中级>系列课程目录 Kaggle教程 机器学习中级6 XGBoost Kaggle教程 机器学习中级7 Data Leakage 在本教程中,您将了解什么是数据 ...
- Kaggle上分技巧——单模K折交叉验证训练+多模型融合
一.K折交叉验证训练单个模型 1.1 k 折交叉验证(K-Fold Cross Validation)原理 通过对 k 个不同分组训练的结果进行平均来减少方差,因此模型的性能对数据的划分就不那么敏感, ...
最新文章
- Pycharm安装pip pip安装第三方模块
- C 双向链表的简单排序实现
- 企业流程管理平台V2.0介绍
- 网络数据采集技术—Java网络爬虫入门与实战 书稿纠错
- 学习有五个层次和境界
- get和post方式传递参数
- 多阶段决策求最优解----动态规划(Dynamic Programming)
- android表情面板_Android Q:应用内设置面板
- 如何整理写作思路?MindManager在文章写作方面的应用
- android 调出键盘表情_Android--如何优雅的切换表情和键盘(原理)
- 前端多人开发统一代码格式化工具
- 中国有哪些python比赛_有哪些大学生值得参与的竞赛?
- 外盘持仓盈亏何时推送---ITapTradeAPINotify::OnRtnPositionProfit
- cs224w(图机器学习)2021冬季课程学习笔记15 Frequent Subgraph Mining with GNNs
- 三台Centos7虚拟机之间实现ssh,rsh互连,虚拟机和本机基于ssh进行文件传输
- 群晖web文件服务器docker,群晖docker搭建数据库服务器
- uniapp 图片上传 删除
- SASE:基于数字身份标识的网络与安全访问云服务
- 【苹果推iMessage】软件安装通过ApplseScript节制iMessage客户端
- 面试官常问的10个Linux问题
热门文章
- 京东阿里都已入局 顺丰在即时配送的胜算有多大?
- 架构设计实践思路:什么是架构,怎么画架构图?
- 盘点那些改变过世界的代码
- 信息安全密码学实验三:密码学数学基础实验
- 我们距离构建一个逼真的虚拟世界还有多远
- mysql异常Incorrect string value: ‘\xE6\xB5\x8B\xE8\xAF\x95‘ for column ‘region_name‘
- SyntaxError: Non-UTF-8 code starting with ‘\xb5‘ in file问题如何解决???求助求助!!!
- 一张自拍即可实现变老变年轻,带你感受时光流逝之美
- Eclipse搭建第一个Spring boot项目
- compass项目配置文件config.rb