文章目录
一、数据介绍
链接: https://pan.baidu.com/s/1GVQ5rv3ElNDLOkaDzuD6Jw 密码:5h6g
本文数据爬取了淘宝全网手机销售数据,其中包括:
- cellphone.csv
该数据集包括淘宝网在售的手机商品信息,包括爬取信息、商品信息、评分收藏信息等;
Index | Column | Non-Null Count | Dtype |
---|---|---|---|
0 | 爬取时间(__time) | 1691 non-null | object |
1 | 爬取链接(__url) | 1691 non-null | object |
2 | 商品ID(product_id) | 1691 non-null | int64 |
3 | 商品名称(name) | 1691 non-null | object |
4 | 商品描述(description) | 1587 non-null | object |
5 | 商品参数(params) | 1691 non-null | object |
6 | 商品现价(current_price) | 1691 non-null | object |
7 | 商品原价(original_price) | 1691 non-null | object |
8 | 月销量(month_sales_count) | 1684 non-null | float64 |
9 | 库存(stock) | 1675 non-null | float64 |
10 | 发货地址(shipping_address) | 1691 non-null | object |
11 | 商品发布时间(product_publish_time) | 1691 non-null | int64 |
12 | 店铺ID(shop_id) | 1691 non-null | int64 |
13 | 店铺名称(shop_name) | 1691 non-null | object |
14 | 商品链接URL(url) | 1691 non-null | object |
15 | 评分(总分5.0分)(score) | 1680 non-null | float64 |
16 | 收藏数(stores_count) | 1691 non-null | int64 |
17 | 累计评价数(comments_count) | 1679 non-null | float64 |
18 | 商品评价印象标签(impresses) | 1691 non-null | object |
19 | Unnamed: 19 | 0 non-null | float64 |
- count_add_comments.csv
该数据集包含上述手机商品的评价信息,包含图片的评价条数、追评条数等;
Index | Column | Non-Null Count | Dtype |
---|---|---|---|
0 | 图片(picNum) | 1232 non-null | float64 |
1 | 追评(used) | 1176 non-null | float64 |
2 | ID(id) | 1691 non-null | int64 |
3 | Unnamed: 3 | 0 non-null | float64 |
- comments.csv
该数据集包含上数据手机商品的具体评价,包括评价时间、评价内容等;
Index | Column | Non-Null Count | Dtype |
---|---|---|---|
0 | 商品ID(id) | 376760 non-null | int64 |
1 | 评价时间(time) | 376760 non-null | object |
2 | 评价内容(content) | 376759 non-null | object |
3 | 爬取链接(spurl) | 376760 non-null | object |
4 | 爬取时间(sptime) | 376760 non-null | object |
5 | Unnamed: 5 | 0 non-null | float64 |
二、数据清洗
导入数据
- 发现商品描述、月销量、库存、评分、累计评价数存在缺失
import pandas as pd
import numpy as np
phone=pd.read_csv('cellphone.csv')
add_comments=pd.read_csv('count_add_comments.csv')
缺失值处理+合并
- 先对phone 进行处理
#删除空白列
phone=phone.drop(columns=['Unnamed: 19'])
#先获取列名,在此基础上进行更改
phone.columns
phone.columns=['爬取时间', '爬取链接', '商品ID', '商品名称',
'商品描述', '商品参数', '商品现价',
'商品原价', '月销量', '库存',
'发货地址', '商品发布时间',
'店铺ID', '店铺名称', '商品链接URL', '评分',
'收藏数' ,'累计评价数', '商品评价印象标签']
#商品描述、月销量、库存、评分、累计评价数存在缺失
#查看月销量为0的商品信息
phone[phone['月销量'].isnull()].info()
#对销量为零的数据进行 0 填充
phone['月销量']=phone['月销量'].fillna(0)
#处理库存(0 填充)、评分(删除空白数据)、累计评价数(0填充)
phone['库存']=phone['库存'].fillna(0)
phone['累计评价数']=phone['累计评价数'].fillna(0)
phone=phone.dropna(subset=['评分'])
#重新梳理 index
phone.index=np.arange(len(phone))
- 再对add_comments和 phone 进行数据合并
df=pd.merge(phone,add_comments,left_on='商品ID',right_on='ID(id)')
- 最后对合并后的df进行列名梳理,删去重复的商品 ID
df.columns=['爬取时间', '爬取链接', '商品ID', '商品名称',
'商品描述', '商品参数', '商品现价',
'商品原价', '月销量', '库存',
'发货地址', '商品发布时间',
'店铺ID', '店铺名称', '商品链接URL', '评分',
'收藏数' ,'累计评价数', '商品评价印象标签','图片', '追评', 'ID(id)', 'Unnamed: 3']
df=df.drop(columns=['Unnamed: 3'])
df=df.drop(columns=['ID(id)'])
清洗时间参数
-
time.localtime():能将 int 格式的时间数据转化
如:time.localtime(1548475512)
输出结果:time.struct_time(tm_year=2019, tm_mon=1, tm_mday=26, tm_hour=12, tm_min=5, tm_sec=12, tm_wday=5, tm_yday=26, tm_isdst=0) -
time.strftime(’%Y-%m-%d’,time.localtime(1548475512)):输出既定格式的时间信息;
输出结果:‘2019-01-26’
关于时间有关格式化信息
%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)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
import time
df['商品发布时间']=df['商品发布时间'].apply(lambda op:time.strftime('%Y-%m-%d',time.localtime(op)))
清洗价格数据
目前得到的‘商品现价’、‘商品原价’两列均为价格区间的表示格式,我们无法获取完整的价格,在此取其均值;
def get_price(s):
price=s.split('-')
l=[float(i) for i in price]
return np.mean(l)
df['商品现价']=df['商品现价'].apply(get_price)
df['商品原价']=df['商品原价'].apply(get_price)
清洗发货城市数据
目前发货城市数据为省+城市名的表示方式,我们要将省份+城市数据提取出来;
#获得中国全部的省级单位名称,找到全部的省级单位
#将每一个地址的省份提取出来,剩下的就是城市
pro_list=['北京',
'天津',
'上海',
'重庆',
'河北',
'山西',
'辽宁',
'吉林',
'黑龙江',
'江苏',
'浙江',
'安徽',
'福建',
'江西',
'山东',
'河南',
'湖北',
'湖南',
'广东',
'海南',
'四川',
'贵州',
'云南',
'陕西',
'甘肃',
'青海',
'台湾',
'内蒙古',
'广西',
'西藏',
'宁夏',
'新疆',
'香港',
'澳门']
def get_city(address):
for i in pro_list:
if i in address:
city=address.replace(i,