欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python制作動(dòng)態(tài)詞頻條形圖的全過程

 更新時(shí)間:2021年11月11日 15:51:35   作者:初心不變_葉子  
說起動(dòng)態(tài)圖表,最火的莫過于動(dòng)態(tài)條形圖了,下面這篇文章主要給大家介紹了關(guān)于Python制作動(dòng)態(tài)詞頻條形圖的全過程,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

”數(shù)據(jù)可視化“這個(gè)話題,相信大家并不陌生,在一些平臺(tái),經(jīng)常可以看到一些動(dòng)態(tài)條形圖的視頻,大多都是某國家 GDP 的變化或者不同國家疫情中感染人數(shù)的變化等等。

這篇文章,我們將使用 Python 繪制動(dòng)態(tài)詞頻條形圖,顧名思義,就是以詞頻作為數(shù)量指標(biāo)的動(dòng)態(tài)條形圖。

前期準(zhǔn)備

輸入以下命令,安裝必須的庫:

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

數(shù)據(jù)的選擇與獲取

我們這次使用的數(shù)據(jù)是簡(jiǎn)書文章收益排行榜,日期范圍為 2020 年 6 月 20 日至 2021 年 9 月 18 日。

從網(wǎng)頁中解析數(shù)據(jù)的過程較為復(fù)雜,我們使用簡(jiǎn)書數(shù)據(jù)科學(xué)庫 JianshuResearchTools 完成。

為方便調(diào)試,我們使用 Jupyter Notebook 進(jìn)行交互式開發(fā)。

導(dǎo)入 JianshuResearchTools,并為其設(shè)置別名:

import JianshuResearchTools as jrt

調(diào)用接口,獲取 2021 年 9 月 17 日的數(shù)據(jù):

jrt.rank.GetArticleFPRankData("20210917")

返回的數(shù)據(jù)如下:

[{'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},
 (以下省略)

可以看出,返回的數(shù)據(jù)中包含文章的排名、標(biāo)題、作者名、作者頭像鏈接和關(guān)于簡(jiǎn)書資產(chǎn)的一些信息。

我們只需要文章的標(biāo)題進(jìn)行統(tǒng)計(jì),所以我們將上面獲取到的數(shù)據(jù)賦值給變量 raw_data,然后:

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

使用列表推導(dǎo)式,我們得到了文章標(biāo)題組成的列表。

為方便處理,我們將這些數(shù)據(jù)連接起來,中間用空格分隔:

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

但是我們遇到了報(bào)錯(cuò):

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

從報(bào)錯(cuò)信息中可以看出,我們獲取到的文章標(biāo)題列表中有空值,導(dǎo)致字符串的連接失敗了。

(空值是因?yàn)樽髡邉h除了文章)

所以我們還需要加入去除空值的邏輯,代碼編程這樣:

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

filter 函數(shù)在第一個(gè)參數(shù)為 None 時(shí),默認(rèn)過濾掉列表中的空值。

現(xiàn)在我們獲取到的數(shù)據(jù)如下:

'幸得君心似我心 傷痕 短篇|阿生 “我最喜愛的友友”大評(píng)選|理事會(huì) · 中秋嘉年華,等你來! 是緣是劫無須問,石火窮年一蝶迷 職業(yè)日記|從蜜月到陌路:我和美國外教的一點(diǎn)事 紅樓||淺談《紅樓夢(mèng)》開篇一頑石 城市印象|走筆八卦城 花豹與狗的愛情終結(jié)在人與動(dòng)物的戰(zhàn)爭(zhēng)里(以下省略)

接下來,我們需要獲取時(shí)間范圍內(nèi)的所有數(shù)據(jù)。

查詢 JRT 的函數(shù)文檔可知,我們需要一個(gè)字符串類型,格式為”YYYYMMDD“的參數(shù)表示目標(biāo)數(shù)據(jù)的日期。

所以我們需要寫一段程序,用于實(shí)現(xiàn)這些日期字符串的生成,代碼如下:

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

接下來,我們編寫一段代碼,實(shí)現(xiàn)對(duì)這些數(shù)據(jù)的獲取:

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 庫顯示了一個(gè)進(jìn)度條,非必須。

使用 Pandas 庫,將我們采集到的數(shù)據(jù)轉(zhuǎn)換成 DataFrame:

df = pandas.DataFrame(result)

分詞

我們使用 jieba 庫實(shí)現(xiàn)分詞,先嘗試對(duì)第一條數(shù)據(jù)進(jìn)行處理:

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

使用 Python 標(biāo)準(zhǔn)庫 collections 中的 Counter 進(jìn)行詞頻統(tǒng)計(jì):

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

簡(jiǎn)單畫個(gè)條形圖:

可以看到,空格和一些標(biāo)點(diǎn)符號(hào),包括”的“、”我“之類無意義詞匯出現(xiàn)頻率很高,我們需要將它們剔除出去。

我們構(gòu)建一個(gè)存放停用詞的 txt 文檔,之后使用如下代碼將其讀取,并轉(zhuǎn)換成一個(gè)列表:

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

接下來,編寫一個(gè)函數(shù),實(shí)現(xiàn)停用詞的剔除,為了方便后續(xù)的數(shù)據(jù)處理,我們也一并剔除單字和只出現(xiàn)一次的詞語:

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 函數(shù)將一些簡(jiǎn)書中的組織名和專有名詞添加到詞庫中,從而提高分詞的準(zhǔn)確性,代碼如下:

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)

經(jīng)過一番處理,現(xiàn)在分詞效果有了明顯的改善:

最后,用這段代碼對(duì)所有數(shù)據(jù)進(jìn)行分詞,并將結(jié)果保存到另一個(gè) 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)

我最終得到的結(jié)果是一個(gè) 455 行,2087 列的 DataFrame。

篩選與可視化

這樣多的數(shù)據(jù),其中很大一部分都不能代表整體情況,所以我們需要進(jìn)行數(shù)據(jù)篩選。

使用以下代碼,統(tǒng)計(jì)所有列數(shù)值的總和,即每個(gè)關(guān)鍵詞在全部數(shù)據(jù)中出現(xiàn)的次數(shù),存儲(chǔ)到名為 sum 的行中:

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

運(yùn)行以下代碼,只保留在數(shù)據(jù)集中出現(xiàn) 300 次以上的關(guān)鍵詞:

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

現(xiàn)在,數(shù)據(jù)集中的列數(shù)減少到了 24 個(gè),可以進(jìn)行可視化了。

不要忘記先導(dǎo)入模塊:

import bar_chart_race as bcr

使用此模塊需要先安裝 ffmpeg,這方面教程可以自行查找。

另外,為了支持中文顯示,我們需要打開這個(gè)模塊下的 _make_chart.py 文件,在 import 之后增加以下兩行代碼:

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

這兩行代碼將會(huì)把 matplotlib 的默認(rèn)字體替換成支持中文顯示的字體。

最后,使用一行代碼完成可視化:

bcr.bar_chart_race(smaller_df, steps_per_period=30, period_length=1500, title="簡(jiǎn)書文章收益排行榜可視化", bar_size=0.8, fixed_max=10, n_bars=10)

在這行代碼中,我們使用 smaller_df 作為數(shù)據(jù)集,輸出文件為 output.mp4,幀率設(shè)置為 30,每行數(shù)據(jù)顯示 2 秒。

由于數(shù)據(jù)較多,這一步時(shí)間較長,而且會(huì)占用較多內(nèi)存。運(yùn)行結(jié)束后,即可在目錄中找到輸出的文件。

總結(jié)

到此這篇關(guān)于Python制作動(dòng)態(tài)詞頻條形圖的文章就介紹到這了,更多相關(guān)Python制作動(dòng)態(tài)詞頻條形圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解多線程Django程序耗盡數(shù)據(jù)庫連接的問題

    詳解多線程Django程序耗盡數(shù)據(jù)庫連接的問題

    這篇文章主要介紹了多線程Django程序耗盡數(shù)據(jù)庫連接的問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-10-10
  • Python Django form 組件動(dòng)態(tài)從數(shù)據(jù)庫取choices數(shù)據(jù)實(shí)例

    Python Django form 組件動(dòng)態(tài)從數(shù)據(jù)庫取choices數(shù)據(jù)實(shí)例

    這篇文章主要介紹了Python Django form 組件動(dòng)態(tài)從數(shù)據(jù)庫取choices數(shù)據(jù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • python使用jenkins發(fā)送企業(yè)微信通知的實(shí)現(xiàn)

    python使用jenkins發(fā)送企業(yè)微信通知的實(shí)現(xiàn)

    公司使用的是企業(yè)微信,因此考慮Jenkins通知企業(yè)微信機(jī)器人的實(shí)現(xiàn)方式,本文主要介紹了python使用jenkins發(fā)送企業(yè)微信通知的實(shí)現(xiàn),感興趣的可以了解一下
    2021-06-06
  • Python Mock模塊原理及使用方法詳解

    Python Mock模塊原理及使用方法詳解

    這篇文章主要介紹了Python Mock模塊原理及使用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Python+matplotlib實(shí)現(xiàn)堆疊圖的繪制

    Python+matplotlib實(shí)現(xiàn)堆疊圖的繪制

    Matplotlib作為Python的2D繪圖庫,它以各種硬拷貝格式和跨平臺(tái)的交互式環(huán)境生成出版質(zhì)量級(jí)別的圖形。本文將利用Matplotlib庫繪制堆疊圖,感興趣的可以了解一下
    2022-03-03
  • 如何利用python實(shí)現(xiàn)詞頻統(tǒng)計(jì)功能

    如何利用python實(shí)現(xiàn)詞頻統(tǒng)計(jì)功能

    詞頻統(tǒng)計(jì)用途很廣泛,比如我們統(tǒng)計(jì)某篇文章中的用詞頻率,網(wǎng)絡(luò)熱點(diǎn)詞匯,再比如起名排行榜呀、熱門旅游景點(diǎn)排行榜呀什么的,其實(shí)也都可以套用,這篇文章主要給大家介紹了關(guān)于如何利用python實(shí)現(xiàn)詞頻統(tǒng)計(jì)功能的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Python讀寫ini文件的方法

    Python讀寫ini文件的方法

    這篇文章主要介紹了Python讀寫ini文件的方法,實(shí)例分析了Python針對(duì)ini配置文件的讀寫及修改等操作技巧,需要的朋友可以參考下
    2015-05-05
  • Python標(biāo)準(zhǔn)庫之itertools庫的使用方法

    Python標(biāo)準(zhǔn)庫之itertools庫的使用方法

    Python提供了一個(gè)非常棒的模塊用于創(chuàng)建自定義的迭代器,這個(gè)模塊就是 itertools。itertools 提供的工具相當(dāng)高效且節(jié)省內(nèi)存,下面這篇文章主要給大家介紹了關(guān)于Python標(biāo)準(zhǔn)庫之itertools庫使用的相關(guān)資料,需要的朋友可以參考下。
    2017-09-09
  • 基于python OpenCV實(shí)現(xiàn)動(dòng)態(tài)人臉檢測(cè)

    基于python OpenCV實(shí)現(xiàn)動(dòng)態(tài)人臉檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了基于python OpenCV實(shí)現(xiàn)動(dòng)態(tài)人臉檢測(cè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Python Paramiko模塊的安裝與使用詳解

    Python Paramiko模塊的安裝與使用詳解

    最近閑著學(xué)習(xí)python,看到有個(gè)paramiko模塊,貌似很強(qiáng)大,所以從網(wǎng)上學(xué)習(xí)后總結(jié)了這篇文章,下面這篇文章就給大家介紹了Python中Paramiko模塊的安裝與使用,文中介紹的很詳細(xì),相信對(duì)大家的學(xué)習(xí)很有幫助,有需要的朋友們下面來一起看看吧。
    2016-11-11

最新評(píng)論