淘宝数据:第一列标题,第二列链接,第三列价格,第四列评论
一、数据预处理
数据预处理指的是对数据进行初步处理,把脏数据处理掉,否则很容易影响最终结果。
常见的的预处理包括:
1、缺失值处理
2、异常值处理
3、数据集成
在数据量大的情况下采用删除处理法,是比较优质的一种处理方法。
二、实战分析
步骤:
1、爬取淘宝数据存入数据库(再次不进行演示,后面会在爬虫中更新淘宝商品的爬取)
2、读取数据库中的数据
3、补全缺失数据,例如NaN或者价格为0的一些商品
4、对一些极大值进行异常处理
5、进行数据处理,直方图进行展示
6、对直方图进行分析,分析出较优的方案
下面为源码:
2、读取数据库中的数据
import pymysql
import numpy as npy
import matplotlib.pylab as pyl
import pandas as pda
pyl.rcParams['font.sans-serif'] = ['SimHei']
conn = pymysql.connect(host="localhost", user="root", passwd="123456", db="datatreat") #数据库连接
sql = "select * from taob"
data = pda.read_sql(sql, conn) # 连接数据库并获取数据
print(data.describe())
# print(data.columns) # 所有标题 Index(['title', 'link', 'price', 'comment'], dtype='object')
# print(len(data)) # 数据总长度 2356
data.describe()获得的结果可获得中间值,以及判断价格最小值是否含0
描述 | price | comment |
---|---|---|
count | 2356.000000 | 2356.000000 |
mean | 66.876061 | 1647.473684 |
std | 147.646617 | 12119.206828 |
min | 0.000000 | 0.000000 |
25% | 22.000000 | 23.000000 |
50% | 40.000000 | 162.000000 |
75% | 75.000000 | 757.500000 |
max | 5990.000000 | 454037.000000 |
3、补全缺失数据,例如NaN或者价格为0的一些商品
x = 0
data["price"][(data["price"] == 0)] = None # 如果价格为0,则设置价格为None,后面可以更方便的对数据进行处理
for i in data.columns: # 数据每一列的标题
for j in range(len(data)): # 数据每一行
if data[i].isnull()[j]: # 如果价格为None,那么设置价格为66
data[i][j] = 66
x += 1
# print(x) # 总共有多少个遗失的数据
这样的警告无视即可
D:/PycharmProjects/datam/datatreating.py:17: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
data["price"][(data["price"] == 0)] = None
4、对一些极大值进行异常处理
首先需要找到异常值,那么可以画散点图来寻找,然后再进行处理
data1 = data.T
price = data1.values[2]
comt = data1.values[3]
pyl.xlabel("价格")
pyl.ylabel("评论")
pyl.plot(price, comt, "o")
pyl.show()
可以很明显的看出,评论大于100000,价格大于1000可以都处理了
(1)改值处理法 两种方法二选一
da = data.values
line = len(data.values) # 行数
col = len(data.values[0]) # 列数
for i in range(0, line):
for j in range(0, col):
# 注意这里是已经进行了第二次数据处理,所以得出对价格大于210,评论大于5338的数据进行处理
if(j == 2 and da[i][2]>210): # 修改价格
da[i][j] = 66
elif(j == 3 and da[i][3]>5338): # 修改评论
da[i][j] = 1647
data2 = da.T
price = data2[2]
comt = data2[3]
pyl.xlabel("价格")
pyl.ylabel("评论")
pyl.plot(price, comt, "o") # 绘制散点图
pyl.show()
(2) 删除处理法
x = 0
for i in range(0, line):
for j in range(0, col):
if (da[i][2] > 210): # 删除价格
continue
elif (da[i][3] > 5338): # 删除评论
continue
else:
if(x==0): # 第一个数直接赋值到newda中,后续的通过row_stack插入
newda = da[i]
else:
newda = npy.row_stack((newda, da[i])) # numpy.row_stack(mat, a) a是要加入mat中的序列
x += 1
data2 = newda.T
price = data2[2]
comt = data2[3]
pyl.xlabel("价格")
pyl.ylabel("评论")
pyl.plot(price, comt, "o") # 绘制散点图
pyl.show()
处理后数据散点图分布,可以很明显看出点分布均匀很多
5、分布分析
# 求最值
# 计算极差
# 组距:极差/组数
# 绘制直方图
pricemax = data2[2].max()
pricemin = data2[2].min()
commentmax = data2[3].max()
commentmin = data2[3].min()
# 极差
pricerg = pricemax - pricemin
commentrg = commentmax - commentmin
# 组距
pricedst=pricerg/13
commentdst=commentrg/13
# 绘制价格直方图
# npy.arange(最大,最小,组距)
# 价格直方图
peicesty = npy.arange(pricemin, pricemax, pricedst)
pyl.hist(data2[2], peicesty)
pyl.show()
# 评论直方图
commentsty = npy.arange(commentmin, commentmax, commentdst)
pyl.hist(data2[3], commentsty)
pyl.show()
价格直方图:
评论直方图:
6、分析与结论:
可以看出价格区间在18元到38元中零食定价最多
可以看出评论在0到400个评论的比较多
如有问题可以在下留言