数据分析:当当网书籍数据可视化分析

在这里插入图片描述

当当网书籍数据可视化分析

作者:i阿极

作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页

😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍

📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪


专栏案例:《数据可视化分析》
数据分析:某电商优惠卷数据分析
数据分析:旅游景点销售门票和消费情况分析
数据分析:消费者数据分析
数据分析:餐厅订单数据分析
数据分析:基于随机森林(RFC)对酒店预订分析预测
数据分析:基于K-近邻(KNN)对Pima人糖尿病预测分析
数据分析:麦当劳食品营养数据探索并可视化

文章目录

  • 当当网书籍数据可视化分析
  • 1、前言
  • 2、导入模块
  • 3、导入数据
  • 4、数据预处理
    • 4.1、数据处理
    • 4.2、提取评论数
    • 4.3、原价、售价、电子书价格 数值化
    • 4.4、选择需要用到的列
    • 4.5、缺失值
    • 4.6、电子书价格列额外处理
    • 4.7、重复值
  • 5、数据可视化
    • 5.1、书籍总体价格区间
    • 5.2、各个出版社书籍数量柱状图
    • 5.3、电子书版本占比
    • 5.4、书籍评论数最高Top20
  • 总结


1、前言

随着互联网的快速发展,电子商务行业在中国经历了爆炸式的增长。作为国内知名的在线购物平台,当当网在其中发挥了举足轻重的作用。为了更好地满足消费者的需求,优化用户体验,提高运营效率,数据分析成为了当当网运营过程中不可或缺的一环。

数据分析在电子商务中扮演着至关重要的角色。通过对大量数据的挖掘和分析,企业可以洞察市场趋势,了解用户行为,优化产品布局,制定营销策略等。当当网的数据分析流程旨在从海量数据中提取有价值的信息,为公司的决策提供数据支持。

2、导入模块

import pandas as pd
from pyecharts.charts import *
from pyecharts.globals import ThemeType
from pyecharts.commons.utils import JsCode
import pyecharts.options as opts

import pandas as pd: 导入pandas库,并给它一个简短的别名pd。pandas是一个用于数据处理和分析的强大库。
from pyecharts.charts import *: 从pyecharts库的charts模块导入所有内容。pyecharts是一个用于生成Echarts图表的Python库。
from pyecharts.globals import ThemeType: 从pyecharts库的globals模块导入ThemeType。这可能用于设置图表的默认主题。
from pyecharts.commons.utils import JsCode: 从pyecharts库的commons.utils模块导入JsCode。这可能是一个用于与JavaScript代码交互的工具。
import pyecharts.options as opts: 从pyecharts库导入其选项模块,并给它一个简短的别名opts。这可能用于配置图表的选项和参数。
这段代码主要用于数据分析和可视化的目的,特别是使用Echarts图表库来生成和配置图表。

3、导入数据

df = pd.read_csv('.\书籍信息.csv')
df.head()

在这里插入图片描述

4、数据预处理

4.1、数据处理

从DataFrame的’标题’列中提取书名(不包括括号及其内容),并将结果存储在新列’书名’中,然后显示这个处理过的DataFrame的前五行。

df['书名'] = df['标题'].apply(lambda x:x.split('(')[0])
df.head()

在这里插入图片描述

从DataFrame的’标题’列中提取书籍简介(括号及其内容),并将结果存储在新列’书籍简介’中,然后将缺失的值替换为’无’,最后显示这个处理过的DataFrame的第一行。

df['书籍简介'] = df['标题'].str.extract('.*?((.*?))')
df['书籍简介'].fillna('无', inplace=True)
df.head(1)

在这里插入图片描述

4.2、提取评论数

从DataFrame的’评价’列中提取评论数(去掉’条评论’),并将结果存储在新列’评论数’中,然后显示这个处理过的DataFrame的第一行。

df['评论数'] = df['评价'].str.replace('条评论','').astype('int64')
df.head(1)

在这里插入图片描述

4.3、原价、售价、电子书价格 数值化

从DataFrame的’原价’、'售价’和’电子书价格’列中删除所有的’¥’字符,然后显示这个处理过的DataFrame的第一行。

df['原价'] = df['原价'].str.replace('¥', '')
df['售价'] = df['售价'].str.replace('¥', '')
df['电子书价格'] = df['电子书价格'].str.replace('¥', '')
df.head(1)

在这里插入图片描述

df.info()

在这里插入图片描述

从DataFrame的’原价’和’售价’列中删除所有的’,'字符,并将这两列从字符串转换为浮点数

df['原价'] = df['原价'].str.replace(',', '').astype('float64')
df['售价'] = df['售价'].str.replace(',', '').astype('float64')

4.4、选择需要用到的列

df = df[['书名','书籍简介','评论数','作者','出版日期','出版社','原价','售价','电子书价格']]
df.head(1)

在这里插入图片描述

4.5、缺失值

df.isnull().sum()

在这里插入图片描述

df['作者'].fillna('未知', inplace=True)
df['出版社'].fillna('未知', inplace=True)
df.isnull().sum()

在这里插入图片描述

4.6、电子书价格列额外处理

df['电子书价格'] = df['电子书价格'].str.replace(',', '').astype('float64')
df['电子书价格'].fillna('无电子书版本', inplace=True)

4.7、重复值

计算DataFrame df中的重复行数。

df.duplicated().sum()

输出:

0
df.info()

在这里插入图片描述

生成描述性统计信息

df.describe()

在这里插入图片描述

5、数据可视化

5.1、书籍总体价格区间

这个函数tranform_price根据输入的价格值,返回一个描述价格范围的字符串。如果价格小于或等于50元,返回’050元’;如果价格在50到100元之间,返回’51100元’;以此类推,如果价格大于1000元,返回’1000以上’。

def tranform_price(x):
    if x <= 50.0:
        return '0~50元'
    elif x <= 100.0:
        return '51~100元'
    elif x <= 500.0:
        return '101~500元'
    elif x <= 1000.0:
        return '501~1000元'
    else:
        return '1000以上'

将DataFrame df中的’原价’列转换为’价格分级’列,并统计每个价格分级的出现次数。

df['价格分级'] = df['原价'].apply(lambda x:tranform_price(x))
price_1 = df['价格分级'].value_counts()
datas_pair_1 = [(i, int(j)) for i, j in zip(price_1.index, price_1.values)]

这段代码将DataFrame df中的’售价’列转换为’售价价格分级’列,并统计每个售价价格分级的出现次数。结果存储在price_2和datas_pair_2中。

df['售价价格分级'] = df['售价'].apply(lambda x:tranform_price(x))
price_2 = df['售价价格分级'].value_counts()
datas_pair_2 = [(i, int(j)) for i, j in zip(price_2.index, price_2.values)]
pie1 = (
    Pie(init_opts=opts.InitOpts(theme='dark',width='1000px',height='600px'))
    
    .add('', datas_pair_1, radius=['35%', '60%'])
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title="当当网书籍\n\n原价价格区间", 
            pos_left='center', 
            pos_top='center',
            title_textstyle_opts=opts.TextStyleOpts(
                color='#F0F8FF', 
                font_size=20, 
                font_weight='bold'
            ),
        )
    )
    .set_colors(['#EF9050', '#3B7BA9', '#6FB27C', '#FFAF34', '#D8BFD8', '#00BFFF', '#7FFFAA'])
)
pie1.render_notebook() 

在这里插入图片描述

5.2、各个出版社书籍数量柱状图

找出拥有最多书籍的20家出版社

counts = df.groupby('出版社')['书名'].count().sort_values(ascending=False).head(20)
bar=(
    Bar(init_opts=opts.InitOpts(height='500px',width='1000px',theme='dark'))
    .add_xaxis(counts.index.tolist())
    .add_yaxis(
        '出版社书籍数量',
        counts.values.tolist(),
        label_opts=opts.LabelOpts(is_show=True,position='top'),
        itemstyle_opts=opts.ItemStyleOpts(
            color=JsCode("""new echarts.graphic.LinearGradient(
            0, 0, 0, 1,[{offset: 0,color: 'rgb(255,99,71)'}, {offset: 1,color: 'rgb(32,178,170)'}])
            """
            )
        )
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title='各个出版社书籍数量柱状图'),
            xaxis_opts=opts.AxisOpts(name='书籍名称',
            type_='category',                                           
            axislabel_opts=opts.LabelOpts(rotate=90),
        ),
        yaxis_opts=opts.AxisOpts(
            name='数量',
            min_=0,
            max_=29.0,
            splitline_opts=opts.SplitLineOpts(is_show=True,linestyle_opts=opts.LineStyleOpts(type_='dash'))
        ),
        tooltip_opts=opts.TooltipOpts(trigger='axis',axis_pointer_type='cross')
    )

    .set_series_opts(
        markline_opts=opts.MarkLineOpts(
            data=[
                opts.MarkLineItem(type_='average',name='均值'),
                opts.MarkLineItem(type_='max',name='最大值'),
                opts.MarkLineItem(type_='min',name='最小值'),
            ]
        )
    )
)
bar.render_notebook()

在这里插入图片描述

5.3、电子书版本占比

计算在DataFrame df中没有电子书版本的书所占的百分比,并将这个百分比值赋给变量per。

per = df['电子书价格'].value_counts()['无电子书版本']/len(df)
c = (
    Liquid()
    .add("lq", [1-per], is_outline_show=False)
    .set_global_opts(title_opts=opts.TitleOpts(title="电子书版本占比"))
)
c.render_notebook()

在这里插入图片描述

5.4、书籍评论数最高Top20

price_top = df.groupby('书名')['原价'].sum().sort_values(ascending=False).head(20)
price_top

在这里插入图片描述

bar=(
    Bar(init_opts=opts.InitOpts(height='500px',width='1000px',theme='dark'))
    .add_xaxis(price_top.index.tolist())
    .add_yaxis(
        '书籍单价',
        price_top.values.tolist(),
        label_opts=opts.LabelOpts(is_show=True,position='top'),
        itemstyle_opts=opts.ItemStyleOpts(
            color=JsCode("""new echarts.graphic.LinearGradient(
            0, 0, 0, 1,[{offset: 0,color: 'rgb(255,99,71)'}, {offset: 1,color: 'rgb(32,178,170)'}])
            """
            )
        )
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title='单价最高的书籍详细柱状图'),
            xaxis_opts=opts.AxisOpts(name='书籍名称',
            type_='category',                                           
            axislabel_opts=opts.LabelOpts(rotate=90),
        ),
        yaxis_opts=opts.AxisOpts(
            name='单价/元',
            min_=0,
            max_=1080.0,
            splitline_opts=opts.SplitLineOpts(is_show=True,linestyle_opts=opts.LineStyleOpts(type_='dash'))
        ),
        tooltip_opts=opts.TooltipOpts(trigger='axis',axis_pointer_type='cross')
    )

    .set_series_opts(
        markline_opts=opts.MarkLineOpts(
            data=[
                opts.MarkLineItem(type_='average',name='均值'),
                opts.MarkLineItem(type_='max',name='最大值'),
                opts.MarkLineItem(type_='min',name='最小值'),
            ]
        )
    )
)
bar.render_notebook()

在这里插入图片描述


总结

本次数据分析为当当网提供了有价值的洞察和建议。通过深入挖掘和分析销售数据,我们可以更好地了解用户需求和市场趋势,优化库存管理、营销策略和推荐系统。同时,这些发现也为企业决策提供了依据,有助于促进图书市场的可持续发展。

📢文章下方有交流学习区!一起学习进步!💪💪💪
📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/370476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

便宜寄快递,就选闪侠惠递,帮您省钱!

随着电子商务的发展&#xff0c;物流也越来越发达&#xff0c;人们的生活中有很多地方都与物流快递打交道。网购或者给远方的亲戚朋友寄礼物等等都需要快递。有时候就止步于昂贵的快递的&#xff0c;其实选对方法&#xff0c;寄快递并不贵... 编辑 现在一般寄快递都是选择去菜鸟…

第三百零七回

文章目录 1. 概念介绍2. 使用方法3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何在输入框中提示错误"相关的内容&#xff0c;本章回中将介绍如何在输入框中处理光标.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在使用TextField组件作为…

OpenCV 配置选项参考

介绍 注意 我们假设您已经阅读了 OpenCV 安装概述教程或具有使用 CMake 的经验。 可以通过几种不同的方式设置配置选项&#xff1a; 命令行&#xff1a;cmake -Doptionvalue ...初始缓存文件&#xff1a;cmake -C my_options.txt ...通过 GUI 进行交互 在本参考中&#xff…

InstantID:一张照片,无需训练,秒级个人写真生成

1. 引言 InstantID是一种基于扩散模型的强大解决方案。设计的即插即用模块仅使用单个面部图像就能熟练地处理各种风格的图像个性化&#xff0c;同时确保高保真度。它的核心是设计了一个新颖的 IdentityNet&#xff0c;通过强加语义和弱空间条件&#xff0c;将面部和地标图像与…

jmeter-04创建请求

文章目录 一、发送请求-查看响应流程二、新建请求三、选择请求方式&#xff0c;填写url1.发送get请求当只有请求方式不一样的时候&#xff0c;参数都填写在参数栏里面&#xff0c;GET请求与POST请求的区别&#xff1f; 2.发送post请求2.1 application/x-www-form-urlencoded2.2…

ele-h5项目使用vue3+vite+vant4开发:第四节、业务组件-SearchView组件开发

需求分析 展示切换动画搜索框输入文字&#xff0c;自动发送请求搜索结果展示搜索状态维护历史搜索展示&#xff0c;点击历史搜索后发送请求历史搜索更多切换动画效果 <script setup lang"ts"> import OpSearch from /components/OpSearch.vue import { ref } f…

Jenkins(本地Windows上搭建)上传 Pipeline构建前端项目并将生成dist文件夹上传至指定服务器

下载安装jdk https://www.oracle.com/cn/java/technologies/downloads/#jdk21-windows 下载jenkins window版 双击安装 https://www.jenkins.io/download/thank-you-downloading-windows-installer-stable/ 网页输入 http://localhost:8088/ 输入密码、设置账号、安装推…

Ainx框架实现 一

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于Ainx系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列…

Mysql+MybatisPlus+Vue实现基础增删改查CRUD

数据库 设计数据库 设计几个字段&#xff0c;主键id自动增长且不可为空 create table if not exists user (id bigint(20) primary key auto_increment comment 主键id,username varchar(255) not null comment 用户名,sex char(1) not null comment 性…

C++弹球游戏:Jump Ball Game

一、下载压缩包 请查看网站C弹球游戏&#xff1a;Jump Ball Game并且下载&#xff0c;可以看到如下界面&#xff1a; 二、匹配图标 把压缩包解压了&#xff1a; 右键点击Jump Ball Game.lnk&#xff0c;点击“属性”它将会是我们要运行的文件。 点击“更改图标”&#xff0c;选…

【HarmonyOS 4.0 应用开发实战】ArkTS 快速入门

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

344. Reverse String(反转字符串)

题目描述 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 问题分析 以中间字符为轴&#xff0c;将两边的字符对换…

Python 轻量级定时任务调度:APScheduler

简述 APscheduler (Advanced Python Scheduler)&#xff0c;作用为按指定的时间规则执行指定的作业。提供了基于日期date、固定时间间隔interval 、以及类似于Linux上的定时任务crontab类型的定时任务。该框架不仅可以添加、删除定时任务&#xff0c;还可以将任务存储到数据库…

浅谈Zookeeper及windows下详细安装步骤

1. Zookeeper介绍 1.1 分布式系统面临的问题 分布式系统是一个硬件或软件组件分布在不同的网络计算机上&#xff0c;彼此之间仅仅通过消息传递进行通信和协调的系统。 面临的问题&#xff1a;系统每个节点之间信息同步及共享 以一个小团队为例,面临的问题 通过网络进行信息…

蓝桥杯---生日蜡烛

某君从某年开始每年都举办一次生日party&#xff0c;并且每次都要吹熄与年龄相同根数的蜡烛&#xff0c;现在算起来&#xff0c;他一共吹熄了236根蜡烛。请问,他从多少岁开始过生日party的? 请填写他开始过生日 party的年龄数。 注意:你提交的应该是一个整数&#xff0c;不要…

二分查找第二弹

目录 力扣852.山脉数组的峰顶索引 力扣162.寻找峰值 力扣153.寻找旋转排序数组中的最小值 力扣剑指Offer53.0-n-1缺失的数字 力扣852.山脉数组的峰顶索引 峰顶之前的全部比他小&#xff0c;峰顶之后的也比他小&#xff0c;把小于等于和大于分成两段 class Solution {publi…

TQ15EG开发板教程:使用vivado2023.1建立hello world工程

1:打开软件建立工程 2:使用vivado创建设计模块并生成bit文件 3:导出硬件平台&#xff0c;使用vitis建立工程 4:使用vitis创建应用程序项目 5:硬件设置与调试 1:打开软件建立工程 打开VIVADO2023.1 创建一个新的工程 输入项目名称和地址&#xff0c;下面那个选项为是否…

深入了解关联查询和子查询

推荐阅读 给软件行业带来了春天——揭秘Spring究竟是何方神圣&#xff08;一&#xff09; 给软件行业带来了春天——揭秘Spring究竟是何方神圣&#xff08;二&#xff09; 文章目录 推荐阅读关联查询子查询 关联查询 关联查询 从多张表中查询对应记录的信息&#xff0c;关联查…

网络原理-TCP/IP(5)

TCP协议 延迟应答 它也是基于滑动窗口,提高效率的一种机制,结合滑动窗口以及流量控制,能够以延迟应答ACK的方式,把反馈的窗口,搞大.核心在于允许范围内,让窗口尽可能大. 如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小. 1.假设接收端缓冲区为1M.一次收到了5…

Java特别篇--关于线程创建的三种方式的总结对比

文章目录 一、常见3种创建线程的方式&#xff08;1&#xff09;方式1&#xff1a;继承Thread类的方式&#xff08;2&#xff09;方式2&#xff1a;实现Runnable接口的方式&#xff08;3&#xff09;方式3&#xff1a;通过Callable和Future接口创建线程 二、对比三种方式&#x…