前言

临近中秋,月饼的销量持续增长,然而不仅仅是中秋节,非旺季也有很多月饼爱好者在电商平台购买月饼。本文利用淘宝上的公开数据,应用 python 对月饼非旺季的销售状况进行分析,并对统计结果进行数据可视化的展示。

数据来源

本次研究的数据来源于淘宝网关于月饼的公开数据,整个数据集包括 4033条数据,其中将为空值的数据直接从数据集中删除。

数据处理

01

数据预处理

对于较粗糙的数据:

1.添加列名

2.去除重复数据(翻页爬取过程中会有重复)

3.购买人数为空的记录,替换成0人付款

4.将购买人数转换为销量(注意部分单位为万)

5.删除无发货地址的商品,并提取其中的省份

02

描述型统计分析

1

价格分布

可以观察到22元以下占比最多,达到了百分之七十,说明大部分人在月饼的消费上还是比较保守的,更看中的是吃的属性,而非作为馈赠的礼物。

2

销量前十店铺

天猫超市作为综合性商城,包含多个工厂的品牌种类,因此成为月饼购买者的首选。

3

销量前十产品

从单个销量前十的图中可以看到,非旺季时间排名第一的竟是月饼模具。出乎意料,排名第二的是鲜花月饼。

4

全国销量图(非旺季)

因为非旺季,月销量到2.5w的很少。只有上海地区的月销量有3.6w,而包邮省份江浙地区的销量仅有3w和5w,而四川和重庆地区的月销量只有5k和2k。

python代码

数据爬取:

代码块

# -*- coding: utf-8 -*-
from selenium import webdriver
import time
import csv
import re
# 搜索商品,获取商品页码
def search_product(key_word):# 定位输入框    browser.find_element_by_id("q").send_keys(key_word)# 定义点击按钮,并点击browser.find_element_by_class_name('btn-search').click()# 最大化窗口:为了方便我们扫码browser.maximize_window()# 等待15秒,给足时间我们扫码time.sleep(15)# 定位这个“页码”,获取“共100页这个文本”page_info = browser.find_element_by_xpath('//div[@class="total"]').text# 需要注意的是:findall()返回的是一个列表,虽然此时只有一个元素它也是一个列表。page = re.findall("(\d+)",page_info)[0]return page
# 获取数据
def get_data():# 通过页面分析发现:所有的信息都在items节点下items = browser.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq  "]')for item in items:# 参数信息pro_desc = item.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text# 价格pro_price = item.find_element_by_xpath('.//strong').text# 付款人数buy_num = item.find_element_by_xpath('.//div[@class="deal-cnt"]').text# 旗舰店shop = item.find_element_by_xpath('.//div[@class="shop"]/a').text# 发货地address = item.find_element_by_xpath('.//div[@class="location"]').text#print(pro_desc, pro_price, buy_num, shop, address)with open('{}.csv'.format(key_word), mode='a', newline='', encoding='utf-8-sig') as f:csv_writer = csv.writer(f, delimiter=',')csv_writer.writerow([pro_desc, pro_price, buy_num, shop, address])
def main():browser.get('https://www.taobao.com/')page = search_product(key_word)print(page)get_data()page_num = 1while int(page) != page_num:print("*" * 100)print("正在爬取第{}页".format(page_num + 1))browser.get('https://s.taobao.com/search?q={}&s={}'.format(key_word, page_num*44))browser.implicitly_wait(15)get_data()page_num += 1print("数据爬取完毕!")
if __name__ == '__main__':key_word = "月饼"browser = webdriver.Chrome()main()

数据处理和可视化:

代码块

# 导包
import pandas as pd
import numpy as np
import re
# 导入爬取得到的数据
df = pd.read_csv("月饼.csv", engine='python', encoding='utf-8-sig', header=None)
df.columns = ["商品名", "价格", "付款人数", "店铺", "发货地址"]
df.head(10)
# 去除重复值
df.drop_duplicates(inplace=True)
# 处理购买人数为空的记录
df['付款人数']=df['付款人数'].replace(np.nan,'0人付款')
# 提取数值
df['num'] = [re.findall(r'(\d+\.{0,1}\d*)', i)[0] for i in df['付款人数']]  # 提取数值
df['num'] = df['num'].astype('float')  # 转化数值型
# 提取单位(万)
df['unit'] = [''.join(re.findall(r'(万)', i)) for i in df['付款人数']]  # 提取单位(万)
df['unit'] = df['unit'].apply(lambda x:10000 if x=='万' else 1)
# 计算销量
df['销量'] = df['num'] * df['unit']
# 删除无发货地址的商品,并提取省份
df = df[df['发货地址'].notna()]
df['省份'] = df['发货地址'].str.split(' ').apply(lambda x:x[0])
# 删除多余的列
df.drop(['付款人数', '发货地址', 'num', 'unit'], axis=1, inplace=True)
# 重置索引
df = df.reset_index(drop=True)
df.head(10)
#df.to_csv('清洗完成数据.csv')
df1 = df.sort_values(by="价格", axis=0, ascending=False)
df1.iloc[:5,:]
import jieba
import jieba.analyse
txt = df['商品名'].str.cat(sep='。')
# 添加关键词
jieba.add_word('粽子', 999, '五芳斋')
# 读入停用词表
stop_words = []
with open('stop_words.txt', 'r', encoding='utf-8') as f:lines = f.readlines()for line in lines:stop_words.append(line.strip())
# 添加停用词
stop_words.extend(['logo', '10', '100', '200g', '100g', '140g', '130g'])
# 评论字段分词处理
word_num = jieba.analyse.extract_tags(txt,topK=100,withWeight=True,allowPOS=())
# 去停用词
word_num_selected = []for i in word_num:if i[0] not in stop_words:word_num_selected.append(i)key_words = pd.DataFrame(word_num_selected, columns=['words','num'])
import pyechartsprint(pyecharts.__version__)
# 导入包
from pyecharts.charts import Bar
from pyecharts import options as opts
# 计算top10店铺
shop_top10 = df.groupby('商品名')['销量'].sum().sort_values(ascending=False).head(10)
# 绘制柱形图
bar0 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))
bar0.add_xaxis(shop_top10.index.tolist())
bar0.add_yaxis('sales_num', shop_top10.values.tolist())
bar0.set_global_opts(title_opts=opts.TitleOpts(title='月饼商品销量Top10'),xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),visualmap_opts=opts.VisualMapOpts(max_=shop_top10.values.max()))
bar0.render("月饼商品销量Top10.html")
from pyecharts.charts import Map
# 计算销量
province_num = df.groupby('省份')['销量'].sum().sort_values(ascending=False)
# 绘制地图
map1 = Map(init_opts=opts.InitOpts(width='1350px', height='750px'))
map1.add("", [list(z) for z in zip(province_num.index.tolist(), province_num.values.tolist())],maptype='china')
map1.set_global_opts(title_opts=opts.TitleOpts(title='各省份月饼销量分布'),visualmap_opts=opts.VisualMapOpts(max_=300000),toolbox_opts=opts.ToolboxOpts())
map1.render("各省份月饼销量分布.html")
from pyecharts.charts import Piedef price_range(x): #按照淘宝推荐划分价格区间if x <= 22:return '22元以下'elif x <= 115:return '22-115元'elif x <= 633:return '115-633元'else:return '633元以上'df['price_range'] = df['价格'].apply(lambda x: price_range(x))
price_cut_num = df.groupby('price_range')['销量'].sum()
data_pair = [list(z) for z in zip(price_cut_num.index, price_cut_num.values)]
print(data_pair)
# 饼图
pie1 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px'))
# 内置富文本
pie1.add( series_name="销量",radius=["35%", "55%"],data_pair=data_pair,label_opts=opts.LabelOpts(formatter='{{b}—占比{d}%}'),
)pie1.set_global_opts(legend_opts=opts.LegendOpts(pos_left="left", pos_top='30%', orient="vertical"), toolbox_opts=opts.ToolboxOpts(),title_opts=opts.TitleOpts(title='不同价格区间的月饼销量占比'))pie1.render("不同价格区间的月饼销量占比.html")
from pyecharts.charts import WordCloud
from pyecharts.globals import SymbolType
# 词云图
word1 = WordCloud(init_opts=opts.InitOpts(width='1350px', height='750px'))
word1.add("", [*zip(key_words.words, key_words.num)],word_size_range=[20, 200],shape=SymbolType.DIAMOND)
word1.set_global_opts(title_opts=opts.TitleOpts('月饼商品名称词云图'),toolbox_opts=opts.ToolboxOpts())
word1.render("月饼商品名称词云图.html")

推荐阅读(点击标题可跳转阅读)论文绘图神器来了:一行代码绘制不同期刊格式图表,哈佛博士后开源
Jupyter 插件太好用了
图解 SQL转了吗                                                              赞了吗在看吗

Python之数据爬取数据可视化相关推荐

  1. 如何用python可视化疫情风险区?地图标记位置信息:数据爬取+地址解析+可视化

    *本文仅就相关技术细节进行学术交流,请勿用作他途* 如何获取网页中发布的位置信息,在地图上进行标记可视化? Step 1: 数据获取 Step2: 地址解析 Step3: 地图可视化 地址编码后的数据 ...

  2. 【爬虫+数据可视化毕业设计:英雄联盟数据爬取及可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩】

    [爬虫+数据可视化毕业设计:英雄联盟数据爬取及可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩] https://b23.tv/TIoy6hj

  3. 基于python大数据爬取房价数据可视化

    基于python大数据爬取房价数据可视化

  4. python爬去百度文库_利用Python语言轻松爬取数据[精品文档]

    利用 Python 语言轻松爬取数据 对于小白来说,爬虫可能是一件非常复杂. 技术门槛很高的事情. 比如有人认为学爬虫必须精通 Python ,然后哼哧哼哧系统学习 Python 的每个知识点,很久之 ...

  5. python爬取百度文库_利用Python语言轻松爬取数据

    利用 Python 语言轻松爬取数据 对于小白来说,爬虫可能是一件非常复杂. 技术门槛很高的事情. 比如有人认为学爬虫必须精通 Python ,然后哼哧哼哧系统学习 Python 的每个知识点,很久之 ...

  6. 疫情数据爬取,可视化及其预测

    疫情数据爬取及可视化 数据爬取及保存(provinceDataGet.py) import requests import json import pandas as pd# 地区 areas = [ ...

  7. 基于python的自媒体和官媒数据爬取、可视化分析及云词图制作

    创作不易,如果以下内容对你有帮助,别忘了点一个赞,让更多的小伙伴能看到吧~~ 1. 问题描述 为了研究自媒体和官媒的传播新闻<武汉快递小哥汪勇的先进事迹>的及时性和传播力度,对比两种传播途 ...

  8. 数据爬取到可视化分析

    文章目录 一.数据爬取 1.python简介 2.什么是网路爬虫 3.网页解析 4.数据爬取流程 二.数据清洗 1.数据格式统一处理 2.信息标题特殊字符处理 三.数据分析以及可视化 1.什么是pan ...

  9. python爬虫-豆瓣爬取数据保存为html文件

    接<python爬虫-豆瓣数据爬取-正则匹配>中的案例五,将爬取的豆瓣租房信息网址和标题保存为html文件. 脚本修改如下: # -*-coding:utf-8 -*- import re ...

最新文章

  1. 编译器设计-RunTime运行时环境
  2. ubuntu 编译caffe makefile.config
  3. 天然富硒科技成果转化-李喜贵:成立联合体谋定农业大健康
  4. boost::set_intersection相关的测试程序
  5. tcpdump抓包实例
  6. 密度聚类dbscan_DBSCAN —基于密度的聚类方法的演练
  7. 100c之23:两个平方数
  8. 树叶节点_茶,一片树叶的旅程
  9. jquery.autocomplete自动补齐和自定义格式
  10. MATLAB2015a中Simulink使用S函数的方法全过程
  11. 测试LOL帧数的软件,lol手游画质帧率修改器
  12. looking for domain authoritative name server and domain name location
  13. 星界边境文本自动翻译机(高级版)使用说明
  14. php 路径解析,ThinkPHP 5 结构与路径解析
  15. 国学大师林语堂献宝:英文学习八要诀
  16. 16个经典面试问题回答思路
  17. 那些不能在一起吃的水果搭配
  18. 【AI Studio平台基本操作】算力卡的使用获取及有关内容
  19. Linux系统磁盘高级应用适合初学者
  20. Android笔记-GridView实现九宫格布局

热门文章

  1. 中维带你揭秘倾斜摄影三维实景
  2. python数据分析师书籍_做数据分析不得不看的书有哪些?
  3. dart sass自学笔记
  4. UIview 添加触摸.手势
  5. 拍摄独特人像的技巧(下)
  6. 互联网快讯:腾讯新闻上线数字藏品馆;极米多款产品受消费者青睐;微信更新IOS系统朋友圈可发20张图片
  7. 抖竹官网下载代理加盟有哪些盈利点?摆烂后短视频引流拓客软件
  8. linux添加开机启动项
  9. 快速上手IntelliJ IDEA常用快捷键
  10. lisp 梯形展开图_斜截圆柱件钣金展开图的AutoCAD二次开发