前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pyecharts数据可视化实战 分析CSDN周排top100博主

pyecharts数据可视化实战 分析CSDN周排top100博主

作者头像
叶庭云
修改2021-01-23 13:08:12
8050
修改2021-01-23 13:08:12
举报

一、数据获取

URL:https://blog.csdn.net/rank/writing_rank

检查可以发现,简单的构造URL去请求,抓取 json 数据,再从中提取出我们想要的数据保存到Excel。

# -*- coding: UTF-8 -*-
"""
@File    :demo.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""
import requests
import json
import logging
import openpyxl

wb = openpyxl.Workbook()
sheet = wb.active
sheet.append(['博主昵称', '排名', '综合得分', '粉丝数', '获赞数', '博客等级', '是否认证为博客专家'])
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')


headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
}

for i in range(1, 11):
	# username={改成你的username}
    url = f'https://blog.csdn.net/api/WritingRank/weekList?username={改成你的username}&page={i}&size=10'
    rep = requests.get(url, headers=headers)
    data = json.loads(rep.text)
    datas = data['data']['list']
    for item in datas:
        score = item['score']                   # 综合得分
        ranking = item['ranking']               # 排名
        user_nickname = item['user_nickname']   # 博主昵称
        fans_num = item['fans_num']             # 粉丝数
        fav_num = item['fav_num']               # 获赞数
        level = item['profile_level']['level']  # 博客等级
        is_expert = item['is_expert']           # 是否认证为博客专家
        sheet.append([user_nickname, ranking, score, fans_num, fav_num, level, is_expert])
        logging.info([user_nickname, ranking, score, fans_num, fav_num, level, is_expert])


wb.save('rank_datas.xlsx')

二、查看数据

随机抽取8行数据查看

查看数据类型、内存、索引、列名信息

数值列的统计信息

各列的相关系数

三、pyecharts数据可视化

1. pyecharts简介和安装

Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。

  • 简洁的 API 设计,使用如丝滑般流畅,支持链式调用
  • 囊括了 30+ 种常见图表,应有尽有
  • 支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab
  • 可轻松集成至 Flask,Sanic,Django 等主流 Web 框架
  • 高度灵活的配置项,可轻松搭配出精美的图表
  • 详细的文档和示例,帮助开发者更快的上手项目
  • 多达 400+ 地图文件,并且支持原生百度地图,为地理数据可视化提供强有力的支持

pyecharts版本v0.5.x 和 v1 间不兼容,v1 是一个全新的版本,语法也有很大不同。

# 安装pyecharts
pip install pyecharts -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
import pyecharts

print(pyecharts.__version__)         # 查看pyecharts版本

2. 数据可视化

首先,来看一看 Top10 的大佬博主都是那些

# -*- coding: UTF-8 -*-
"""
@File    :漏斗图_top10.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""
import pandas as pd
import pyecharts.options as opts
from pyecharts.charts import Funnel
from pyecharts.globals import CurrentConfig, ThemeType

# 引用本地 js 资源
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'

# 读取数据
df = pd.read_excel('rank_datas.xlsx')
# 取博主昵称  综合得分两列数据
df1 = df[['博主昵称', '综合得分']]
# print(df1)

# 取Top10博主数据
labels = list(df1['博主昵称'][:10])
values = list(df1['综合得分'][:10])

data = [[labels[x], int(values[x])] for x in range(len(labels))]

# 漏斗图可视化
c = (
    Funnel(init_opts=opts.InitOpts(width="1200px", height="600px", theme=ThemeType.LIGHT))
    .add(
        series_name='',    # 系列名称,用于 tooltip 的显示,legend 的图例筛选。
        data_pair=data,    # 系列数据项,格式为 [(key1, value1), (key2, value2)]
        gap=3,   # 数据图形间距
        label_opts=opts.LabelOpts(is_show=True, position="inside"), # 标签配置项,参考 `series_options.LabelOpts`
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="CSDN周排Top10博主一览"),      # 标题
        legend_opts=opts.LegendOpts(type_="scroll", pos_top='50%', pos_left="80%", orient="vertical"),  # 调整图例位置
    )
    .render('funnel_chart.html')
)

运行效果如下:

排在第一的大佬博主是:一个处女座的程序猿,综合指标:894,远高于之后的其他博主,而从漏斗图也容易看出,后面 9 位博主综合指标差距不大。

再来看看周排 Top100 博主里,已认证博客专家的比例

# -*- coding: UTF-8 -*-
"""
@File    :博客专家占比.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.globals import CurrentConfig

# 引用本地 js 资源
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'

# 读取数据   统计认证了博客专家和没有认证的数量
df = pd.read_excel('rank_datas.xlsx')
datas = df['是否认证为博客专家'].value_counts()
print(datas)
labels = ['已认证博客专家', '未认证博客专家']
value = datas.values
data = [[i, int(j)] for i, j in zip(labels, value)]
c = (
    Pie()
    .add(
        series_name="",  # 系列名称,用于 tooltip 的显示,legend 的图例筛选。
        data_pair=data,  # 系列数据项,格式为 [(key1, value1), (key2, value2)]
        radius=["40%", "60%"],  # 饼图的半径,数组的第一项是内半径,第二项是外半径
        # 富文本设置
        label_opts=opts.LabelOpts(
            position="outside",
            formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c}  {per|{d}%}  ",
            background_color="#eee",
            border_color="#aaa",
            border_width=1,
            border_radius=4,
            rich={
                "a": {"color": "#999", "lineHeight": 22, "align": "center"},
                "abg": {
                    "backgroundColor": "#e3e3e3",
                    "width": "100%",
                    "align": "right",
                    "height": 22,
                    "borderRadius": [4, 4, 0, 0],
                },
                "hr": {
                    "borderColor": "#aaa",
                    "width": "100%",
                    "borderWidth": 0.5,
                    "height": 0,
                },
                "b": {"fontSize": 16, "lineHeight": 33},
                "per": {
                    "color": "#eee",
                    "backgroundColor": "#334455",
                    "padding": [2, 4],
                    "borderRadius": 2,
                },
            },
        ),
    )
    .set_colors(['#FF1493', '#BA55D3'])
    .set_global_opts(title_opts=opts.TitleOpts(title="周排Top100中博客专家占比"))
    .render("pie_rich_label.html")
)

运行效果如下:

可以发现,在周排 Top100 的博主里,近 8 成都已认证博客专家。

那这些 Top100 博主的等级分布呢?

# -*- coding: UTF-8 -*-
"""
@File    :博客等级分布.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.globals import CurrentConfig

# 引用本地 js 资源
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'

# 读取数据   统计各博客等级博主的数量
df = pd.read_excel('rank_datas.xlsx')
datas = df['博客等级'].value_counts()
# print(datas)
labels = [f'等级{i}' for i in datas.index]
nums = [int(j) for j in datas]
data = [[i, j] for i, j in zip(labels, nums)]

print(data)

c = (
    # 宽  高  背景颜色
    Pie(init_opts=opts.InitOpts(width="1000px", height="600px", bg_color="#2c343c"))
    .add(
        series_name="博客等级",    # 系列名称
        data_pair=data,             # 系列数据项,格式为 [(key1, value1), (key2, value2)]
        rosetype="radius",        # radius:扇区圆心角展现数据的百分比,半径展现数据的大小
        radius="55%",             # 饼图的半径
        center=["50%", "50%"],    # 饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标
        label_opts=opts.LabelOpts(is_show=False, position="center"),   #  标签配置项
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title="博客等级分布",
            pos_left="center",
            pos_top="20",
            title_textstyle_opts=opts.TextStyleOpts(color="#fff"),
        ),
        legend_opts=opts.LegendOpts(is_show=False),
    )
    .set_series_opts(
        tooltip_opts=opts.TooltipOpts(
            trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"  # 'item': 数据项图形触发,主要在散点图,饼图等无类目轴的图表中使用
         ),
        label_opts=opts.LabelOpts(color="#fff"),
    )
    .render("customized_pie.html")
)

运行效果如下:

发现了一些有意思的事情,周排 Top100 的博主们博客等级大都分布在等级7、等级8,分别占比42%、29%,等级5和等级11的博主都仅有一位,看看他俩是谁?

最后来看看这些博主粉丝数和获赞数对比

# -*- coding: UTF-8 -*-
"""
@File    :粉丝数量对比.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.globals import CurrentConfig, ThemeType

# 引用本地 js 资源
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'

# 读取数据   统计各博客等级博主的数量
df = pd.read_excel('rank_datas.xlsx')
nums = [int(x) for x in df['粉丝数']]
rank = [int(y) for y in df['排名']]

c = (
    Bar(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
    .add_xaxis(xaxis_data=rank)
    .add_yaxis(
		series_name='粉丝数', yaxis_data=nums,
		label_opts=opts.LabelOpts(is_show=False)
			   )
    .set_global_opts(
                    xaxis_opts=opts.AxisOpts(name='排名'),
					yaxis_opts=opts.AxisOpts(
							name='粉丝数', min_=0, max_=320000,     # y轴刻度的最小值 最大值
					),
					title_opts=opts.TitleOpts(
						title="Top100博主的粉丝数对比",
						title_textstyle_opts=opts.TextStyleOpts(
							font_family="KaiTi", font_size=20, color="black"
						)
					)
    )
	.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
					markpoint_opts=opts.MarkPointOpts(
					data=[
						opts.MarkPointItem(type_="min", name="最小值"),
						opts.MarkPointItem(type_="average", name="平均值")]),
					markline_opts=opts.MarkLineOpts(
					data=[
						opts.MarkLineItem(type_="average", name="平均值")]))
    .render('bar_chart.html')
)

运行效果如下:

排名第一的博主粉丝数量超多,有 309147 位粉丝,远高于其他博主,而粉丝数量最少的也有1080

# -*- coding: UTF-8 -*-
"""
@File    :点赞数对比.py
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.globals import CurrentConfig, ThemeType

# 引用本地 js 资源
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'

# 读取数据   统计各博客等级博主的数量
df = pd.read_excel('rank_datas.xlsx')
nums = [int(x) for x in df['获赞数']]
rank = [int(y) for y in df['排名']]

c = (
    Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
    .add_xaxis(xaxis_data=rank)
    .add_yaxis(
		series_name='获赞数', yaxis_data=nums,
		label_opts=opts.LabelOpts(is_show=False)
			   )
    .set_global_opts(
                    xaxis_opts=opts.AxisOpts(name='排名'),
					yaxis_opts=opts.AxisOpts(
							name='获赞数', min_=0, max_=40000,     # y轴刻度的最小值 最大值
					),
					title_opts=opts.TitleOpts(
						title="Top100博主的获赞数对比",
						title_textstyle_opts=opts.TextStyleOpts(
							font_family="KaiTi", font_size=20, color="#fff"
						)
					)
    )
	.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
					markpoint_opts=opts.MarkPointOpts(
					data=[
						opts.MarkPointItem(type_="max", name="最小值"),
						opts.MarkPointItem(type_="min", name="最小值"),
						opts.MarkPointItem(type_="average", name="平均值")]),
					markline_opts=opts.MarkLineOpts(
					data=[
						opts.MarkLineItem(type_="average", name="平均值")]))
    .render('bar_chart1.html')
)

运行效果如下:

意想不到的事情发生了,粉丝数和综合评价都遥遥领先的 Top1 博主,获赞数不再领先,有很多位博主拥有的获赞数都比他多。而获赞数数量最少的仅有250,很是惊讶,写程序查看发现跟之前博客等级为5的是同一个博主,但这位博主粉丝数却不少。

庭云回到主页看着自己的博客数据,陷入了沉思~~

作者:叶庭云 微信公众号:修炼Python CSDN:https://yetingyun.blog.csdn.net/ 本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。 觉得文章对你有帮助、让你有所收获的话,期待你的点赞呀,不足之处,也可以在评论区多多指正。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-11-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、数据获取
  • 二、查看数据
  • 三、pyecharts数据可视化
    • 1. pyecharts简介和安装
      • 2. 数据可视化
      相关产品与服务
      灰盒安全测试
      腾讯知识图谱(Tencent Knowledge Graph,TKG)是一个集成图数据库、图计算引擎和图可视化分析的一站式平台。支持抽取和融合异构数据,支持千亿级节点关系的存储和计算,支持规则匹配、机器学习、图嵌入等图数据挖掘算法,拥有丰富的图数据渲染和展现的可视化方案。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档