python大数据挖掘系列之淘宝商城数据预处理实战

数据清洗:

所谓的数据清洗,就是把一些异常的、缺失的数据处理掉,处理掉不一定是说删除,而是说通过某些方法将这个值补充上去,数据清洗目的在于为了让我们数据的可靠,因为脏数据会对数据分析产生影响。
拿到数据后,我们进行数据清洗分为两方面:

  1. 缺失值发现:可以查找
  2. 异常值发现:画图分析
  • 缺失值:在下载数据、搜集数据的时候刚好就缺失。可以通过查找的方法去发现。
  • 异常值:不一定就是异常,可能就是客观存在,但是这个值对于总的数据来说是一个就比较特殊点。可以通过画散点图发现。

这两方面的处理方法如下:

  1. 缺失值处理:均值/中位数插补、固定值、临近插补、回归分析、插值法(拉格朗日插值,牛顿插值)
  2. 异常值处理:视为缺失,平均值修正,不处理。

方法解释:

  • 均值/中位数插补:在缺失位置插入一个总数据的均值或者中位数。
  • 固定值::在缺失位置插入一个固定值
  • 临近插补:看这个缺失位置附近的值是什么,就把附近的某一个值插到缺失位置,这类应用场景应用于物以类聚的场景
  • 回归分析:等日后用上的时候在研究。
  • 插值法:此算法复杂,暂未研究,等日后用上的时候在研究。
  • 视为缺失:可以看成缺失值,然后通过缺失值来处理。
  • 平均值修正:通过平均值来替代这个值
  • 不处理:不处理这个值

开始分析:

表结构介绍:

淘宝商品表结构如下:

  • title:商品名称
  • link:商品URL
  • price:商品价钱
  • comment:商品评论数量
mysql> desc taob;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| title   | varchar(50) | YES  |     | NULL    |       |
| link    | varchar(60) | NO   | PRI | NULL    |       |
| price   | int(30)     | YES  |     | NULL    |       |
| comment | int(30)     | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

对于上面四个字段,比较好处理的就是价钱和评论数,比如价钱是0(没有采集到的数据),可以通过刚才平均值或者中位数来填充,对于异常值,比如某个评论10W+,那么也可以采用平均值修正。

Python环境介绍:

依赖于pymysql,numpy,pandas,matplotlib,请自己先安装。可以参考我上篇博文:http://www.cnblogs.com/liaojiafa/p/6239262.html

拿代码说话:
  1. 获取数据
conn = pymysql.connect(host=‘192.168.56.4‘,user=‘root‘,passwd=‘123456‘,db=‘csdn‘,charset=‘utf8‘)
sql=‘select * from taob‘
data = pandas.read_sql(sql,conn)
print(data.head(1))
#数据样例如下,和mysql字段相匹配的:
0  买2袋减2元 印尼进口菲那菲娜虾味木薯片油炸大龙虾片零食品400g   

                                              link  price  comment
0  https://item.taobao.com/item.htm?id=44350560220     50     2577  

可以看看数据的中位数和均值:

print(data.describe())
            price        comment
count  9616.00000    9616.000000
mean     64.49324     562.239601   # 均值
std     176.10901    6078.909643
min       0.00000       0.000000
25%      20.00000      16.000000
50%      36.00000      58.000000   # 中位数
75%      66.00000     205.000000
max    7940.00000  454037.000000
  1. 对price列的数据清洗
  • 缺失值的处理:

我们先了解下这样的判断方法:

a={1:‘a‘,2:‘b‘}
print([a[1]==‘a‘])

上述代码打印结果必然是True,小括号([])相当于if判断了,返回的值为布尔值。

下面对price为0的值(也就是缺失值)进行处理。

data[‘price‘][(data[‘price‘]==0)]=None   # 对price的缺失值统统赋值为None,方便下面处理
data[‘price‘][(data[‘price‘]==0)]=64   # 也可以这样写,直接把price的缺失值设置为price的平均数64.那么下面的for循环设置price的缺失值就不需要写。

对上面这段代码拆分来看:

  • (data[‘price‘]==0) 判断data[‘price‘]列中哪行price的值等于0,等于的返回True,不等于返回False
  • data[‘price‘][(data[‘price‘]==0)] 这语句就是一下子把所有price=0的给取出来了 ,然后哪行的price等于0就 赋值为None
for i in data.columns:   # 遍历data的每列
    for j in range(len(data)):   # 遍历data的每一行了。
        if data[i].isnull()[j]: # i在这是一维(列),data[i]等于把这一列的值取出来了,j在这里是二维(行),i相当于XY轴的X轴,j相当于XY轴的Y轴,data[i].isnull是判断整列的某一个值是nan那么就返回True,data[i].isnull[j]是逐行逐行的判断是否为nan了,是的话返回True从而进行下面代码块的处理。
            data[i][j]=64   # 缺失值设置为均值
  • 异常值处理:

1.找到异常值:通过画散点图(横轴:价格,纵轴:评论数)
我们这里的话要选取评论数,价钱。通常的方法就是说通过遍历每一行的数据,取每一行中的price值,但是呢这个方法效率低下。
对此我们可以采用转置方法,把price列转置为一行,这样就能够快速取到这价钱的数据,还有评论数。
下面请看代码:

dataT=data.T # 转置下数据
prices = dataT.values[2]     # 取第3行数据
comments = dataT.values[3]   # 取第4行数据
pylab.plot(prices,comments,‘o‘)    # 画散点图
pylab.xlabel(‘prices‘)
pylab.ylabel(‘comments‘)
pylab.title(" The Good‘s price and comments")
pylab.show()

处理异常数据,我这里定义的异常数据就是评论数超过20W,价格大于2000,请看代码:

line = len(data.values)   # 取行数
col = len(data.values[0])   # 取列数
davalues = data.values    #取data的所有值
for i in range(0,line):    # 遍历行数
    for j in range(0,col):   #遍历列数
        if davalues[i][3]>200000:    #判断评论数
            #print(‘comments==i,j‘,i,j,davalues[i][j])
            davalues[i][j] = 562   # 评论数取平均值

        if davalues[i][2]>2000:
            davalues[i][j] =  64   # 价钱取平均值

prices2=davalues.T[2]
comments2=davalues.T[3]
pylab.plot(prices2,comments2,‘or‘)
pylab.xlabel(‘prices‘)
pylab.ylabel(‘comments‘)
pylab.title(" The Good‘s price and comments")
pylab.show()

此时,我们看图:

显然我们已经对评论数超过20W,价格大于2000的数据处理了,但是呢上图显示的还是不够漂亮,因为异常点与正常点的差距太大了,导致正常点与正常点之间的间隔非常小,小到黏在一块了,所以我们还需要在处理下,把评论数超过2000,价格大于300的处理掉,这样的话,正常点就能够很好的展现在图上,代码如下:

line = len(data.values)   # 取行数
col = len(data.values[0])   # 取列数
davalues = data.values    #取data的所有值
for i in range(0,line):    # 遍历行数
    for j in range(0,col):   #遍历列数
        if davalues[i][3]>2000:    #判断评论数,===主要修改这行
            #print(‘comments==i,j‘,i,j,davalues[i][j])
            davalues[i][j] = 562   # 评论数取平均值

        if davalues[i][2]>300:    # ====主要修改这行
            davalues[i][j] =  64   # 价钱取平均值
prices2=davalues.T[2]
comments2=davalues.T[3]
pylab.plot(prices2,comments2,‘or‘)
pylab.xlabel(‘prices‘)
pylab.ylabel(‘comments‘)
pylab.title(" The Good‘s price and comments")
pylab.show()

full example:

import pymysql
import numpy
import pandas
from  matplotlib import  pylab

#缺失值处理
#======
data[‘price‘][(data[‘price‘]==0)]=64  # 对price的缺失值统统赋值为平均数

# 异常值处理:
# 1.找到异常值:通过画散点图(横轴:价格,纵轴:评论数)
# 我们这里的话要选取评论数,价钱。通常的方法就是说通过遍历每一行的数据,取每一行中的price值,但是呢这个方法效率低下,
# 对此我们可以采用转置方法,把price列转置为一行,这样就能够快速取到这价钱的数据,还有评论数
# 处理异常数据,我这里定义的异常数据就是评论数超过20W,价格大于2000
conn = pymysql.connect(host=‘192.168.56.4‘,user=‘root‘,passwd=‘123456‘,db=‘csdn‘,charset=‘utf8‘)
sql=‘select * from taob‘
data = pandas.read_sql(sql,conn)

line = len(data.values)   # 取行数
col = len(data.values[0])   # 取列数
davalues = data.values    #取data的所有值
for i in range(0,line):    # 遍历行数
    for j in range(0,col):   #遍历列数
        if davalues[i][3]>2000:    #判断评论数
            #print(‘comments==i,j‘,i,j,davalues[i][j])
            davalues[i][j] = 562   # 评论数取平均值

        if davalues[i][2]>300:
            davalues[i][j] =  64   # 价钱取平均值

prices2=davalues.T[2]
comments2=davalues.T[3]
pylab.plot(prices2,comments2,‘or‘)
pylab.xlabel(‘prices‘)
pylab.ylabel(‘comments‘)
pylab.title(" The Good‘s price and comments")
pylab.show()

生成的图如下:

这张图就很直观的看出,价钱和评论数的关系了,价钱在100以内的,评论数也比较多,价钱越高,评论数相对来说越少。

数据集成与数据离散化

  1. 数据集成:不同来源的数据集合在一起,需要注意格式保持一致。
    for example:
    我这里有2个表数据,淘宝与京东的,淘宝的表就如上面所述的一样,标题,url,价钱,评论,那么京东的下标为2的列也必须是价钱,只有数据格式保持一致,才能分析。
  2. 数据离散化:处理连续数据较好的方法。离散化就是指数据不集中,分散了。
    for example:
    一个班的考试成绩就是从0-100分之间,这个数据是在100以内连续的,那么我们对这个数据分析的时候就可以这么做,把连续的数据或者近似连续的数据整合在一个点附近,比如0-60分为及格,60-80为良好.....

商品数据分布分析实战

我们在这里要分析商品数据的分布,看评论数与价钱的在哪个数量段的分布最多。
首先我们需要计算出价钱和评论的最值,其次在计算最值之间的极差,最后计算组距(极差/组数,组数自己根据情况定义)。下面请看代码:

# 数据分布:
# 1 求最值
# 2 计算极差
# 3 组距: 极差/组数
da2=davalues.T
# print(‘=======‘)
# print(data[‘price‘])
pricemax = da2[2].max()
pricemin = da2[2].min()

commentmax = da2[3].max()
commentmin = da2[3].min()
# 极差
pricerg =  pricemax - pricemin
commentrg = commentmax -commentmin
# 组距
pricedst = pricerg/10
commentdst = pricerg/10

# 绘制直方图
# numpy.arrange(最小值,最大值,组距)
# 价钱直方图
pricesty = numpy.arange(pricemin,pricemax,pricedst)
pylab.hist(da2[2],pricesty)
pylab.show()

# 评论直方图
commentty = numpy.arange(commentmin,commentmax,commentdst)
pylab.hist(da2[3],pricesty)
pylab.show()

评论直方图如下:

结论:

从上图中我们可以看出,评论数最多的集中在100元以内的商品,评论数也间接的说明了购买数,因为购买后才能够评论。
所以可以根据这个来直方图来给商品定价。
价钱直方图如下:

结论:

从上图中我们可以看出,商品价钱最多的集中在50元以内的商品

code full example:

#!/usr/bin/env python
# __author__:Leo
import pymysql
import numpy
import pandas
from  matplotlib import  pylab

conn = pymysql.connect(host=‘192.168.56.4‘,user=‘root‘,passwd=‘123456‘,db=‘csdn‘,charset=‘utf8‘)
sql=‘select * from taob‘
data = pandas.read_sql(sql,conn)

# 缺失值处理
data[‘price‘][(data[‘price‘]==0)]=64  # 对price的缺失值统统赋值为price的平均数

# 异常值处理:
# 1.找到异常值:通过画散点图(横轴:价格,纵轴:评论数)
# 我们这里的话要选取评论数,价钱。通常的方法就是说通过遍历每一行的数据,取每一行中的price值,但是呢这个方法效率低下,
# 对此我们可以采用转置方法,把price列转置为一行,这样就能够快速取到这价钱的数据,还有评论数

line = len(data.values)   # 取行数
col = len(data.values[0])   # 取列数
davalues = data.values    #取data的所有值
for i in range(0,line):    # 遍历行数
    for j in range(0,col):   #遍历列数
        if davalues[i][3]>2000:    #判断评论数
            #print(‘comments==i,j‘,i,j,davalues[i][j])
            davalues[i][j] = 562   # 评论数取平均值

        if davalues[i][2]>300:
            davalues[i][j] =  64   # 价钱取平均值

prices2=davalues.T[2]
comments2=davalues.T[3]
pylab.plot(prices2,comments2,‘or‘)
pylab.xlabel(‘prices‘)
pylab.ylabel(‘comments‘)
pylab.title(" The Good‘s price and comments")
pylab.show()

# 数据分布:
# 1 求最值
# 2 计算极差
# 3 组距: 极差/组数
da2=davalues.T
# print(‘=======‘)
# print(data[‘price‘])
pricemax = da2[2].max()
pricemin = da2[2].min()

commentmax = da2[3].max()
commentmin = da2[3].min()
# 极差
pricerg =  pricemax - pricemin
commentrg = commentmax -commentmin
# 组距
pricedst = pricerg/10
commentdst = pricerg/10

# 绘制直方图
# numpy.arrange(最小值,最大值,组距)
# 价钱直方图
pricesty = numpy.arange(pricemin,pricemax,pricedst)
pylab.hist(da2[2],pricesty)
pylab.show()

# 评论直方图
commentty = numpy.arange(commentmin,commentmax,commentdst)
pylab.hist(da2[3],pricesty)
pylab.show()

原文地址:https://www.cnblogs.com/kkdn/p/8946050.html

时间: 2024-10-11 23:21:53

python大数据挖掘系列之淘宝商城数据预处理实战的相关文章

Python实例之抓取淘宝商品数据(json型数据)并保存为TXT

本实例实现了抓取淘宝网中以'python'为关键字的搜索结果,经详细查看数据存储于html文档中的js脚本中,数据类型为JSON 通过浏览器相关工具发现捧腹网笑话页面的数据存储在HTML页面而非json数据中,因此可以直接使用soup.select()方法来抓取数据,具体实现代码如下: import requests import re import json from urllib.parse import urlencode from bs4 import BeautifulSoup fin

深圳龙岗淘宝商城托管 | 淘宝商城外包

当今社会经济发展飞速,对于任何一个企业来说,如何跟得上时代的脚步,如何有效节约成本提高效率,是企业发展需要解决的重点问题.面对同行业的竞激烈,一个企业如果不能获得最新市场信息,那就是落伍,落伍的后果就是客户资源越来越少.所以,如果自己没有专业的团队,那就选择淘宝商城外包,让给专业的团队去做吧. 第一,企业只有选择淘宝商城外包,才能抢占市场先机.一个企业要想在一个行业长久立住脚,就需要找一个可靠的方式,市场竞争如此激烈,我们没有太多的时间去摸索和研究,,借助别人的经验,选择淘宝外包,企业就可以在同

卖家围攻手段变种 韩都衣舍淘宝商城店关闭

10月15日消息,淘宝商城10.11卖家围攻事件升级. 韩都衣舍淘宝商城旗舰店由于受到部分卖家的恶意攻击,已经宣布在淘宝商城暂停营业.据悉,新一轮的攻击已由恶意拍货,转变成通过聚众攻击卖家的客服系统. 今日下午,淘宝商城卖家首页挂出停业公告"由于本店遭受持续恶意大规模攻击,为保证服务质量,维护消费者利益,韩都衣舍暂停营业.已付款订单暂停营业." 据了解,韩都衣舍淘宝商城旗舰店在淘宝商城女装类目中每月销售排名前三,正常情况下每天发货5000--6000件.此前几天,由于受此次"

淘宝商城外包 | 天猫商城运营

2011年,淘宝商城似乎一夜之间得到了万千宠爱,事实上,淘宝商城模式作为b2c最成功的运营模式之一,已经不被人们所陌生,它造就了麦包包.欧莎.御泥坊等等耳熟能详的网货品牌.但是离开了传统企业参与的电子商务是不完整的,传统中小企业正在成为网络商城的新生力量.  经历了多种电子商务试水模式的中小企业品牌商如今更加的理性,“淘宝商城的外包是最捷径的一条路”,十年网商经验的头狼电子商务ceo朱加宝毫不掩饰对淘宝商城的肯定,比起自建b2c商城,c2c,以及别的电子商务模式,淘宝商城切入最直接,效益最明显.

Python爬虫,抓取淘宝商品评论内容

作为一个资深吃货,网购各种零食是很频繁的,但是能否在浩瀚的商品库中找到合适的东西,就只能参考评论了!今天给大家分享用python做个抓取淘宝商品评论的小爬虫! 思路 我们就拿"德州扒鸡"做为参考目标吧~!如果想抓其他商品的话,自行更换目标即可!打开淘宝,搜索目标,随便点击一个商品进入,在点击累计评论,打开F12开发者工具--网络,先清除现有的所有内容,然后点击下一页评论,在弹出的内容中查找文件中开头为list_detail_rate.htm的html类型,如下图所示 这个html中就含

python大数据挖掘和分析的套路

数据分析流程 一般可以按“数据获取-数据存储与提取-数据预处理-数据建模与分析-数据可视化”这样的步骤来实施一个数据分析项目.按照这个流程,每个部分需要掌握的细分知识点如下: 数据获取:公开数据.Python爬虫 外部数据的获取方式主要有以下两种. 第一种是获取外部的公开数据集,一些科研机构.企业.政府会开放一些数据,你需要到特定的网站去下载这些数据.这些数据集通常比较完善.质量相对较高. 另一种获取外部数据的方式就是爬虫. 比如你可以通过爬虫获取招聘网站某一职位的招聘信息,爬取租房网站上某城市

表哥用Python爬取数千条淘宝商品数据后,发现淘宝这些潜规则!

本文记录了笔者用 Python 爬取淘宝某商品的全过程,并对商品数据进行了挖掘与分析,最终得出结论. 项目内容 本案例选择商品类目:沙发. 数量:共 100 页 4400 个商品. 筛选条件:天猫.销量从高到低.价格 500 元以上. 项目目的 对商品标题进行文本分析,词云可视化 不同关键词 word 对应的 sales 的统计分析 商品的价格分布情况分析 商品的销量分布情况分析 不同价格区间的商品的平均销量分布 商品价格对销量的影响分析 商品价格对销售额的影响分析 不同省份或城市的商品数量分布

jQuery制作淘宝商城商品列表多条件查询功能

一.介绍 这几天做网站的时候,突然用到这个功能,找了好久也没有找到.看到"希伟素材网"有这么一个JS,效果很不错,也正是我一直以来想要的结果.附图如下: 二:使用教程      1.HTML代码: <ul class="select"> <li class="select-list"> <dl id="select1"> <dt>上装:</dt> <dd cla

scrapy+selenium 爬取淘宝商城商品数据存入到mongo中

1.配置信息 # 设置mongo参数 MONGO_URI = 'localhost' MONGO_DB = 'taobao' # 设置搜索关键字 KEYWORDS=['小米手机','华为手机'] # 最大爬取页数 MAX_PAGE = 2 # 相应超时设置 SELENIUM_TIMEOUT = 20 ROBOTSTXT_OBEY = False #忽略 # 中间件 DOWNLOADER_MIDDLEWARES = { 'taobaoSpider.middlewares.SeleniumMiddl