熟练一下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数据集练习(数据处理)相关推荐

  1. kaggle上面的score以及ROC_AUC数值咋回事

    TP:真的传染病患者被检测为传染病患者 FP:假的传染病患者被检测为传染病患者 假如现在10000人 其中9900正常,100人禽流感. 如果你的分类器全部设定为正常,那么精度就是9900,但是这个我 ...

  2. kaggle上面的E-Commerce Data数据集练习(可视化与部分特征工程)

    接上篇: https://editor.csdn.net/md/?articleId=103394900 集体换个列名 data = data.rename(index=str, columns={' ...

  3. 如何下载kaggle上的数据集

    如何下载kaggle上的数据集 1 直接下载 2 通过kaggle提供的API下载数据集 2.1 Cifar10 数据集地址 2.2 kaggle如何通过kaggle提供的API下载数据集 3 错误 ...

  4. python可视化多个机器学习模型在独立测试集(test data set)上面的AUC值、可视化模型效能

    python可视化多个机器学习模型在独立测试集(test data set)上面的AUC值.可视化模型效能 # x_lables为模型名称列表,包括,逻辑回归.朴素贝叶斯.支持向量机.随机森林.xgb ...

  5. c罗python可视化分析_关于C罗“冲刺速度”这种隐私问题,我们在Kaggle上找到了数据集,然后。。。...

    原标题:关于C罗"冲刺速度"这种隐私问题,我们在Kaggle上找到了数据集,然后... 今日份知识你摄入了么? 你知道 FIFA 么?在线踢足球那种,贼老多人玩儿这个游戏,本仙女作 ...

  6. Kaggle上的犬种识别(ImageNet Dogs)

    Kaggle上的犬种识别(ImageNet Dogs) Dog Breed Identification (ImageNet Dogs) on Kaggle 在本节中,将解决在Kaggle竞赛中的犬种 ...

  7. Kaggle上的狗品种识别(ImageNet Dogs)

    Kaggle上的狗品种识别(ImageNet Dogs) 在本节中,我们将解决Kaggle竞赛中的犬种识别挑战,比赛的网址是https://www.kaggle.com/c/dog-breed-ide ...

  8. Kaggle教程 机器学习中级7 Data Leakage

    <Kaggle教程 机器学习中级>系列课程目录 Kaggle教程 机器学习中级6 XGBoost Kaggle教程 机器学习中级7 Data Leakage 在本教程中,您将了解什么是数据 ...

  9. Kaggle上分技巧——单模K折交叉验证训练+多模型融合

    一.K折交叉验证训练单个模型 1.1 k 折交叉验证(K-Fold Cross Validation)原理 通过对 k 个不同分组训练的结果进行平均来减少方差,因此模型的性能对数据的划分就不那么敏感, ...

最新文章

  1. Pycharm安装pip pip安装第三方模块
  2. C 双向链表的简单排序实现
  3. 企业流程管理平台V2.0介绍
  4. 网络数据采集技术—Java网络爬虫入门与实战 书稿纠错
  5. 学习有五个层次和境界
  6. get和post方式传递参数
  7. 多阶段决策求最优解----动态规划(Dynamic Programming)
  8. android表情面板_Android Q:应用内设置面板
  9. 如何整理写作思路?MindManager在文章写作方面的应用
  10. android 调出键盘表情_Android--如何优雅的切换表情和键盘(原理)
  11. 前端多人开发统一代码格式化工具
  12. 中国有哪些python比赛_有哪些大学生值得参与的竞赛?
  13. 外盘持仓盈亏何时推送---ITapTradeAPINotify::OnRtnPositionProfit
  14. cs224w(图机器学习)2021冬季课程学习笔记15 Frequent Subgraph Mining with GNNs
  15. 三台Centos7虚拟机之间实现ssh,rsh互连,虚拟机和本机基于ssh进行文件传输
  16. 群晖web文件服务器docker,群晖docker搭建数据库服务器
  17. uniapp 图片上传 删除
  18. SASE:基于数字身份标识的网络与安全访问云服务
  19. 【苹果推iMessage】软件安装通过ApplseScript节制iMessage客户端
  20. 面试官常问的10个Linux问题

热门文章

  1. 京东阿里都已入局 顺丰在即时配送的胜算有多大?
  2. 架构设计实践思路:什么是架构,怎么画架构图?
  3. 盘点那些改变过世界的代码
  4. 信息安全密码学实验三:密码学数学基础实验
  5. 我们距离构建一个逼真的虚拟世界还有多远
  6. mysql异常Incorrect string value: ‘\xE6\xB5\x8B\xE8\xAF\x95‘ for column ‘region_name‘
  7. SyntaxError: Non-UTF-8 code starting with ‘\xb5‘ in file问题如何解决???求助求助!!!
  8. 一张自拍即可实现变老变年轻,带你感受时光流逝之美
  9. Eclipse搭建第一个Spring boot项目
  10. compass项目配置文件config.rb