一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python制作動態詞頻條形圖的全過程

Python制作動態詞頻條形圖的全過程

2022-02-28 00:13初心不變_葉子 Python

說起動態圖表,最火的莫過于動態條形圖了,下面這篇文章主要給大家介紹了關于Python制作動態詞頻條形圖的全過程,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

前言

”數據可視化“這個話題,相信大家并不陌生,在一些平臺,經常可以看到一些動態條形圖的視頻,大多都是某國家 GDP 的變化或者不同國家疫情中感染人數的變化等等。

這篇文章,我們將使用 Python 繪制動態詞頻條形圖,顧名思義,就是以詞頻作為數量指標的動態條形圖。

 

前期準備

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

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

 

數據的選擇與獲取

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

Python制作動態詞頻條形圖的全過程

從網頁中解析數據的過程較為復雜,我們使用簡書數據科學庫 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)

Python制作動態詞頻條形圖的全過程

Python制作動態詞頻條形圖的全過程

 

分詞

我們使用 jieba 庫實現分詞,先嘗試對第一條數據進行處理:

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

使用 Python 標準庫 collections 中的 Counter 進行詞頻統計:

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

簡單畫個條形圖:

Python制作動態詞頻條形圖的全過程

可以看到,空格和一些標點符號,包括”的“、”我“之類無意義詞匯出現頻率很高,我們需要將它們剔除出去。

我們構建一個存放停用詞的 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)

經過一番處理,現在分詞效果有了明顯的改善:

Python制作動態詞頻條形圖的全過程

最后,用這段代碼對所有數據進行分詞,并將結果保存到另一個 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。

Python制作動態詞頻條形圖的全過程

 

篩選與可視化

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

使用以下代碼,統計所有列數值的總和,即每個關鍵詞在全部數據中出現的次數,存儲到名為 sum 的行中:

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

Python制作動態詞頻條形圖的全過程

運行以下代碼,只保留在數據集中出現 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,  src="/uploads/allimg/220228/00145QQ6-7.png" />

 

總結

到此這篇關于Python制作動態詞頻條形圖的文章就介紹到這了,更多相關Python制作動態詞頻條形圖內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.jianshu.com/p/5a9ca9bc22d7

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 极品久久 | 亚洲天堂免费看 | 色综合久久综精品 | 亚洲欧美国产另类视频 | 久久精品观看影院2828 | 欧美猛男同志同性video | 翁公与小莹在客厅激情 | 天天夜夜啦啦啦 | naruto堂同人本子汉化gg | 91精品手机国产在线观 | 人人揉揉香蕉 | 久久热这里只有 精品 | 日韩高清一区二区 | 国产永久在线观看 | 四虎成人国产精品视频 | 黑人日白人 | 国产精品视频二区不卡 | 欧美高清在线精品一区二区不卡 | 青青青青在线视频 | 亚洲H成年动漫在线观看不卡 | 久久受www免费人成_看片中文 | 2019年国产高清情侣视频 | 精品9e精品视频在线观看 | 亚洲欧美国产自拍 | 91这里只有精品 | 狠狠燥 | 美女翘臀跪床被打屁股作文 | 国产区最新 | 古装床戏做爰无遮挡三级 | jazz中国在线视频 | 日韩性生活片 | 国产在线综合网 | 久99久热只有精品国产99 | 免费网站直接进入 | 女性性色生活片免费观看 | 热久久最新地址 | 5566中文字幕亚洲精品 | 楚乔传第二部免费观看全集完整版 | 99re7在线精品免费视频 | 国产极品麻豆91在线 | 国产草|