Python制作动态词频条形图的全过程

目录
  • 前言
  • 前期准备
  • 数据的选择与获取
  • 分词
  • 筛选与可视化
  • 总结

前言

”数据可视化“这个话题,相信大家并不陌生,在一些平台,经常可以看到一些动态条形图的视频,大多都是某国家 GDP 的变化或者不同国家疫情中感染人数的变化等等。

这篇文章,我们将使用 Python 绘制动态词频条形图,顾名思义,就是以词频作为数量指标的动态条形图。

前期准备

输入以下命令,安装必须的库:

pip install JiashuResearchTools
pip install jieba
pip install pandas
pip install bar_chart_race

数据的选择与获取

我们这次使用的数据是简书文章收益排行榜,日期范围为 2020 年 6 月 20 日至 2021 年 9 月 18 日。

从网页中解析数据的过程较为复杂,我们使用简书数据科学库 JianshuResearchTools 完成。

为方便调试,我们使用 Jupyter Notebook 进行交互式开发。

导入 JianshuResearchTools,并为其设置别名:

import JianshuResearchTools as jrt

调用接口,获取 2021 年 9 月 17 日的数据:

jrt.rank.GetArticleFPRankData("20210917")

返回的数据如下:

[{'ranking': 0,
  'aslug': 'a03adf9d5dd5',
  'title': '幸得君心似我心',
  'author_name': '雁阵惊寒',
  'author_avatar_url': 'https://upload.jianshu.io/users/upload_avatars/26225608/682b892e-6661-4f98-9aab-20b4038a433b.jpg',
  'fp_to_author': 3123.148,
  'fp_to_voter': 3123.148,
  'total_fp': 6246.297},
 {'ranking': 1,
  'aslug': '56f7fe236842',
  'title': '伤痕',
  'author_name': '李文丁',
  'author_avatar_url': 'https://upload.jianshu.io/users/upload_avatars/26726969/058e18c4-908f-4710-8df7-1d34d05d61e3.jpg',
  'fp_to_author': 1562.198,
  'fp_to_voter': 1562.198,
  'total_fp': 3124.397},
 (以下省略)

可以看出,返回的数据中包含文章的排名、标题、作者名、作者头像链接和关于简书资产的一些信息。

我们只需要文章的标题进行统计,所以我们将上面获取到的数据赋值给变量 raw_data,然后:

[item["title"] for item in raw_data]

使用列表推导式,我们得到了文章标题组成的列表。

为方便处理,我们将这些数据连接起来,中间用空格分隔:

" ".join([item["title"] for item in raw_data])

但是我们遇到了报错:

TypeError: sequence item 56: expected str instance, NoneType found

从报错信息中可以看出,我们获取到的文章标题列表中有空值,导致字符串的连接失败了。

(空值是因为作者删除了文章)

所以我们还需要加入去除空值的逻辑,代码编程这样:

" ".join(filter(None, [item["title"] for item in raw_data]))

filter 函数在第一个参数为 None 时,默认过滤掉列表中的空值。

现在我们获取到的数据如下:

'幸得君心似我心 伤痕 短篇|阿生 “我最喜爱的友友”大评选|理事会 · 中秋嘉年华,等你来! 是缘是劫无须问,石火穷年一蝶迷 职业日记|从蜜月到陌路:我和美国外教的一点事 红楼||浅谈《红楼梦》开篇一顽石 城市印象|走笔八卦城 花豹与狗的爱情终结在人与动物的战争里(以下省略)

接下来,我们需要获取时间范围内的所有数据。

查询 JRT 的函数文档可知,我们需要一个字符串类型,格式为”YYYYMMDD“的参数表示目标数据的日期。

所以我们需要写一段程序,用于实现这些日期字符串的生成,代码如下:

from datetime import date, timedelta
def DateStrGenerator():
    start_date = date(2020, 6, 20)
    after = 0
    result = None
    while result != "20210917":
        current_date = start_date + timedelta(days=after)
        result = current_date.strftime(r"%Y%m%d")
        yield result
        after += 1

接下来,我们编写一段代码,实现对这些数据的获取:

result = []
for current_date in tqdm(DateStrGenerator(), total=455):
    raw_data = jrt.rank.GetArticleFPRankData(current_date)
    processed_data = " ".join(filter(None, [item["title"] for item in raw_data]))
    result.append({"date": current_date,
                   "data": processed_data})

这里使用 tqdm 库显示了一个进度条,非必须。

使用 Pandas 库,将我们采集到的数据转换成 DataFrame:

df = pandas.DataFrame(result)

分词

我们使用 jieba 库实现分词,先尝试对第一条数据进行处理:

jieba.lcut(df["data"][0])

使用 Python 标准库 collections 中的 Counter 进行词频统计:

Counter(jieba.lcut(df["data"][0]))

简单画个条形图:

可以看到,空格和一些标点符号,包括”的“、”我“之类无意义词汇出现频率很高,我们需要将它们剔除出去。

我们构建一个存放停用词的 txt 文档,之后使用如下代码将其读取,并转换成一个列表:

stopwords_list = [item.replace("\n", "") for item in open("stopwords.txt", "r", encoding="utf-8").readlines()]

接下来,编写一个函数,实现停用词的剔除,为了方便后续的数据处理,我们也一并剔除单字和只出现一次的词语:

def process_words_count(count_dict):
    result = {}
    for key, value in count_dict.items():
        if value < 2:
            continue
        if len(key) >= 2 and key not in stopwords_list:
            result[key] = value
    return result

另外,我们使用 jieba 库的 add_word 函数将一些简书中的组织名和专有名词添加到词库中,从而提高分词的准确性,代码如下:

keywords_list = [item.replace("\n", "") for item in open("keywords.txt", "r", encoding="utf-8").readlines()]
for item in keywords_list:
    jieba.add_word(item)

经过一番处理,现在分词效果有了明显的改善:

最后,用这段代码对所有数据进行分词,并将结果保存到另一个 DataFrame 中:

data_list = []
date_list = []
for _, item in df.iterrows():
    date_list.append(datetime(int(item["date"][0:4]), int(item["date"][4:6]), int(item["date"][6:8])))
    data_list.append(process_words_count(Counter(jieba.lcut(item["data"]))))
processed_df = pandas.DataFrame(data_list, index=date_list)

我最终得到的结果是一个 455 行,2087 列的 DataFrame。

筛选与可视化

这样多的数据,其中很大一部分都不能代表整体情况,所以我们需要进行数据筛选。

使用以下代码,统计所有列数值的总和,即每个关键词在全部数据中出现的次数,存储到名为 sum 的行中:

try:
    result = []
    for i in range(3000):
        result.append(processed_df.iloc[:, i].sum())
except IndexError:
    processed_df.loc["sum"] = result

运行以下代码,只保留在数据集中出现 300 次以上的关键词:

maller_df = processed_df.T[processed_df.T["sum"] >= 300].T
smaller_df = smaller_df.drop(labels="sum")
smaller_df.columns

现在,数据集中的列数减少到了 24 个,可以进行可视化了。

不要忘记先导入模块:

import bar_chart_race as bcr

使用此模块需要先安装 ffmpeg,这方面教程可以自行查找。

另外,为了支持中文显示,我们需要打开这个模块下的 _make_chart.py 文件,在 import 之后增加以下两行代码:

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

这两行代码将会把 matplotlib 的默认字体替换成支持中文显示的字体。

最后,使用一行代码完成可视化:

bcr.bar_chart_race(smaller_df, steps_per_period=30, period_length=1500, title="简书文章收益排行榜可视化", bar_size=0.8, fixed_max=10, n_bars=10)

在这行代码中,我们使用 smaller_df 作为数据集,输出文件为 output.mp4,帧率设置为 30,每行数据显示 2 秒。

由于数据较多,这一步时间较长,而且会占用较多内存。运行结束后,即可在目录中找到输出的文件。

总结

到此这篇关于Python制作动态词频条形图的文章就介绍到这了,更多相关Python制作动态词频条形图内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python数据可视化之绘制柱状图和条形图

    一.实验目的: 1.掌握Python中柱状图.条形图绘图函数的使用 2.利用上述绘图函数实现数据可视化 二.实验内容: 1.练习python中柱状图.条形图绘图函数的用法,掌握相关参数的概念 2.根据步骤一绘图函数要求,处理实验数据 3.根据步骤二得到的实验数据,绘制柱状图.条形图 4.练习如何通过调整参数使图片呈现不同效果,例如颜色.图例位置.背景网格.坐标轴刻度和标记等 三.实验过程(附结果截图): 1. 练习python中柱状图.条形图绘图函数的用法,掌握相关参数的概念 (1)练习绘制条形

  • Python制作动态词频条形图的全过程

    目录 前言 前期准备 数据的选择与获取 分词 筛选与可视化 总结 前言 "数据可视化"这个话题,相信大家并不陌生,在一些平台,经常可以看到一些动态条形图的视频,大多都是某国家 GDP 的变化或者不同国家疫情中感染人数的变化等等. 这篇文章,我们将使用 Python 绘制动态词频条形图,顾名思义,就是以词频作为数量指标的动态条形图. 前期准备 输入以下命令,安装必须的库: pip install JiashuResearchTools pip install jieba pip inst

  • Python Matplotlib绘制条形图的全过程

    目录 条形图 单组条形图 水平条形图 多组条形图 堆积条形图 对称条形图 总结 条形图 条形图具有丰富的表现形式,常见的类型包括单组条形图,多组条形图,堆积条形图和对称条形图等. 单组条形图 条形图的每种表现形式都可以绘制成垂直条形图或水平条形图,以单组条形图的两种绘制方式为例. 垂直条形图 import matplotlib.pyplot as plt data = [10., 20., 5., 15.] plt.bar(range(len(data)), data) plt.show() T

  • Python利用matplotlib实现制作动态条形图

    目录 制作思路 animation 大家好,本文将分享如何使用matplotlib制作动态条形图,制作的图很美,这个是我在之前发布的一篇中使用的图片, 效果如下 制作思路 为了方便大家学习,我将不直接进行讲解,而是以我是如何一步步制作的思路来介绍整个过程. 说到用 Python 制作动态图,首先想到的肯定是一些直接拿来就用的库,虽然我没做过,但是我相信一定有且不止一个,搜了一圈后发现有个bar chart race库看起来不错 毕竟有现成的轮子,只需要填充数据即可,但是研究了一番,正如我之前所说

  • 利用python制作拼图小游戏的全过程

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 关注公众号:Python学习指南,回复"拼图"即可获取源码 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理介绍 游戏简介: 将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状.游戏目标为通过移动非空白块将随机摆放获得的图像恢复成原图像的模样,且规定移动操作仅存在于非空白块移动到空白块. 例如下图所示:

  • 利用Python制作动态排名图的实现代码

    大家好,今天我们要讲的是如何使用 Pyecharts 制作动态排名变化图:point_down: 制作这样的一个动态图使用到的是 Pyecharts中的TimeLine(时间线轮播图) ,代码实现起来其实稍有难度,但我希望能 通过讲解这样一张动态图的制作过程,来让各位读者可以使用Pyecharts将任何一种图动起来 ,我们开始吧! 首先我们需要思考一下这样一种 动态图的生成逻辑 ,不就是把每天的数据制作成一张条形图然后轮动吗,OK那我们的 数据要整理成啥样 呢? 一个dataframe,每列是一

  • 利用Python制作PPT的完整步骤

    目录 前言 步骤1: 步骤2:安装PIP3 步骤3:安装python-pptx 4.写代码测试: 总结 前言 怎么,你还没学Python吗? 此一时彼以时,什么C,JAVA,现在在求职市场都是渣渣,铺天盖地的Python学习广告,一遍又一遍地提醒着着我,你已经老了: 老板说:你很努力,但我还是想提拔会Python的人. 员工说:自从学了Python,腰不疼了,腿不酸了,颈椎不痛了,连工资都涨了... 码农说:我要偷偷学Python,惊呆所有人! ...... 所以,为了不被时代滚滚洪流淘汰,争取

  • Python 制作子弹图

    目录 1.什么是子弹图 2.构建图表 3.最终代码 1.什么是子弹图 一个子弹图约定俗成的定义: 子弹图使用长度/高度.位置和颜色对数据进行编码,以显示与目标和性能带相比的实际情况 我们先来看下子弹图大概长什么样子: 子弹图具有单一的主要度量(例如,当前年初至今的收入),将该度量与一个或多个其他度量进行比较以丰富其含义(例如,与目标相比),并将其显示在性能的定性范围的背景,例如差.满意和好.定性范围显示为单一色调的不同强度,使色盲者可以辨别它们,并将仪表板上的颜色使用限制在最低限度 好了,差不多

  • 详解在Python中创建条形图追赶动画

    目录 前言 方法一:使用pause()函数 方法二:使用FuncAnimation()函数 线性图动画 Python中的条形图追赶动画 Python中的散点图动画: 条形图追赶的水平移动 前言 动画是使可视化更具吸引力和用户吸引力的好方法.它帮助我们以有意义的方式展示数据可视化.Python 帮助我们使用现有的强大 Python 库创建动画可视化.Matplotlib是一个非常流行的数据可视化库,通常用于数据的图形表示以及使用内置函数的动画. 使用 Matplotlib 创建动画有两种方法: 使

  • linux平台使用Python制作BT种子并获取BT种子信息的方法

    本文实例讲述了linux平台使用Python制作BT种子并获取BT种子信息的方法.分享给大家供大家参考,具体如下: 最近研究了一下linux BT服务器环境的搭建,需要在linux下制作BT种子并获取BT种子信息,整理了一下这个过程: 制作BT种子软件本站下载地址. 安装: [root@localhost src]# tar zxf mktorrent-1.0.tar.gz [root@localhost src]# cd mktorrent-1.0 [root@localhost mktorr

  • 使用Python制作简单的小程序IP查看器功能

    前言 说实话,查看电脑的IP,也挺无聊的,但是够简单,所以就从这里开始吧.IP地址在操作系统里就可以直接查看.但是除了IP地址,我们也想通过IP获取地理地址和网络运营商情况.IP地址和地理地址并没有固定的关系,所以我们需要借助网络上的数据库,或者说借助第三方的服务来查询.这里,我们选用IP.CN提供的IP地址查询服务. 基本环境配置 版本:Python3 系统:Windows 相关模块:PyQt5 实现效果图 完整代码 运行以上程序,点击按钮,大约卡顿半秒后,文本标签处就会显示我们电脑的IP地址

随机推荐