微博熱搜數(shù)據(jù)探索與處理
??????關(guān)注我,和老表一起學(xué)Python、云服務(wù)器
一、前言
二、專欄概要
三、搞事情(上):讀取mysql數(shù)據(jù)并進行數(shù)據(jù)探索與處理
3.1 pandas+sqlalchemy讀取數(shù)據(jù)
3.2 數(shù)據(jù)探索與處理
四、下集預(yù)告

一、前言
今天的分享來滿足這位讀者的需求,想讀“關(guān)于數(shù)據(jù)庫sql或者MySQL的,就那種Python來處理數(shù)據(jù)庫,比如Python爬蟲爬到數(shù)據(jù),然后封存到數(shù)據(jù)庫里面,然后再從sql里面讀取,進行分析可視化”。
后面寫文章一方面是自己學(xué)習(xí)筆記,另外也會針對讀者需求寫一些專題文章,如果你有自己的想法,歡迎瀏覽器訪問下方鏈接,或者點擊閱讀原文,給老表提意見:
https://shimo.im/forms/GryQ9CYRcxJ9hcYx/fill?channel=wechat二、專欄概要
直接來:一行代碼爬取微博熱搜數(shù)據(jù) 做準備:將爬取到的數(shù)據(jù)存入csv和mysql、其他數(shù)據(jù)庫 搞事情(上):讀取mysql數(shù)據(jù)并進行數(shù)據(jù)探索與處理 搞事情(下):讀取處理好的數(shù)據(jù)并進行數(shù)據(jù)分析與可視化 進階活:將可視化數(shù)據(jù)結(jié)果呈現(xiàn)到web頁面(大屏可視化) 悄悄話:項目總結(jié)與思考,期待你的來稿
三、搞事情:讀取mysql數(shù)據(jù)并進行數(shù)據(jù)分析與可視化
在上一節(jié)中,我們已經(jīng)將數(shù)據(jù)存儲到了MySQL數(shù)據(jù)庫,本節(jié)我們將從數(shù)據(jù)庫中讀取出數(shù)據(jù),然后進行數(shù)據(jù)探索和針對性處理。
3.1 pandas+sqlalchemy讀取數(shù)據(jù)
我們采用的是pandas+sqlalchemy進行數(shù)據(jù)的存儲讀取等操作,原因嘛,對比其他的這個方法最快,最簡單(上篇文章已經(jīng)說過了),讀取出來的數(shù)據(jù)就是dataframe格式,還可以在讀取過程進行數(shù)據(jù)格式化,優(yōu)秀。
讀取數(shù)據(jù):
#?調(diào)用pandas?的?read_sql?、讀取數(shù)據(jù)
from?sqlalchemy?import?create_engine
#?利用sqlalchemy的create_engine創(chuàng)建一個數(shù)據(jù)庫連接引擎
engine?=?create_engine('mysql+pymysql://用戶名:密碼@localhost:3306/數(shù)據(jù)庫名稱?charset=utf8')
sql?=?'select?*?from?wb_hot'
#?第一個參數(shù):查詢sql語句
#?第二個參數(shù):engine,數(shù)據(jù)庫連接引擎
#?第三個參數(shù):將指定列轉(zhuǎn)換成指定的日期格式
pd_read_sql?=?pd.read_sql(sql,?engine,?parse_dates={'wb_first_time':?"%Y:%m:%H:%M:%S"})

3.2 數(shù)據(jù)探索與處理
首先我們可以利用調(diào)用shape屬性查看數(shù)據(jù)的規(guī)模,調(diào)用info函數(shù)查看數(shù)據(jù)信息,調(diào)用describe函數(shù)查看數(shù)據(jù)分布情況。
數(shù)據(jù)有82869行,4列
#?查看數(shù)據(jù)規(guī)模?多少行?多少列
pd_read_sql.shape
#?---輸出---?#?
(82869,?4)
沒有空值,we_title是字符串類型,web_hot_time和wb_hot_number是數(shù)值類型,wb_first_time是日期類型。
#?查看整體數(shù)據(jù)信息,包括每個字段的名稱、非空數(shù)量、字段的數(shù)據(jù)類型查看數(shù)據(jù)基本信息
pd_read_sql.info()

describe默認輸出數(shù)值類型的列的各項指標數(shù)據(jù)。
#?查看數(shù)據(jù)表中數(shù)據(jù)類型的列的數(shù)據(jù)分布情況
'''
?? count:數(shù)量統(tǒng)計,非空值數(shù)量
?? mean:均值
?? std:標準差
?? min:最小值
?? 25%:四分之一分位數(shù)
?? 50%:二分之一分位數(shù)
?? 75%:四分之三分位數(shù)
?? max:最大值
?? unipue:不同的值有多少個
?? top:出現(xiàn)次數(shù)最多的詞
?? freq:top詞出現(xiàn)的次數(shù)
'''
pd_read_sql.describe()

我們也可以看其他兩列(非數(shù)值類型)的數(shù)據(jù)情況
#?查看單列的數(shù)據(jù)發(fā)布情況
pd_read_sql['wb_title'].describe()

看下微博熱搜不同標題出現(xiàn)次數(shù)情況top10
#?統(tǒng)計所有熱搜標題出現(xiàn)次數(shù)
pd_read_sql['wb_title'].value_counts()[:10]

通過上面基本探索,我們了解了數(shù)據(jù)的大概情況,目前數(shù)據(jù)只有四個維度,能分析的維度就很有限,所以我們需要先自己列下有哪些維度可以拆分、可以進行分析可視化,如下是我自己的簡單思考:

基于上面的內(nèi)容,需要提前拆分的只有熱搜標題,從里面我們可以拆分出熱搜相關(guān)地理位置、熱搜相關(guān)人名、熱搜相關(guān)年齡段等數(shù)據(jù)。
那么接下來我們就想辦法來拆分熱搜標題吧~
這里我想到的是直接用現(xiàn)成的命名實體識別庫來對熱搜標題進行拆分,最先想到的就是之前畢設(shè)用過的Stanford CoreNLP,不過由于這個是Java寫的,使用需要安裝jdk,所以不太想用它,查了下,發(fā)現(xiàn)了一個只用python就可以的第三方庫:foolnltk,
官方項目地址:https://github.com/rockyzhengwu/FoolNLTK
直接運行pip命令即可安裝,不過包比較大(包括訓(xùn)練好的模型)、依賴也多,所以建議用鏡像源安裝,如:
pip3?install?-i?http://mirrors.aliyun.com/pypi/simple/?foolnltk

還可以直接調(diào)用一些免費、開放的接口,如百度大腦的詞法分析,如果大家感興趣,可以留言說說,下回給大家分享,也歡迎大家提前體驗,將學(xué)習(xí)操作筆記分享給老表。
https://ai.baidu.com/tech/nlp_basic/lexical
安裝好后,直接導(dǎo)入,你可能遇到下面問題,不要慌,這是tensorflow版本的問題,tf2.0以后移除了tf.contrib模塊,所以我們直接安裝低版本tf即可。

首先卸載tensorflow高版本,然后安裝低版本,如1.15.0。
#?先卸載
pip3?install?tensorflow
#?安裝2.0以下的tensorflow版本?避免No?module?named?'tensorflow.contrib'?
!pip3?install?tensorflow==1.15
安裝成功后,我們可以運行一個示例看看效果:
import?fool?
text?=?["15地抵北京大興機場航班取消"]
words,?ners?=?fool.analysis(text)
print(ners)

可以看到,結(jié)果是出來了,但是有警告提示,也很簡單,按上面說明,到對應(yīng)文件中改下代碼即可,先看代碼,我們直接調(diào)用了foolnltk的analysis函數(shù),傳入了一個列表參數(shù)(也可以是字符串),返回結(jié)果是一個元組。
words是對字符串的文本詞性分析,ners是對文本的實體識別,每組是一個元組,其中第一個和第二個元素是識別出的內(nèi)容在字符串中起始結(jié)束位置,第三個元素是字符串表示的含義,比如北京大興機場被識別出是一個地名,用location表示,最后一個元素是識別出的字符串,而且ners是一個兩層列表。
經(jīng)過測試,我們發(fā)現(xiàn)person表示人名(如:趙麗穎),org表示組織名字(一般是國家組織,如:工信部),company表示公司名字(如:鴻星爾克)。
不過有點不太好的就是識別不是很準確,另外無法識別出表示年齡段的詞,比如:00后這種,關(guān)于識別準確問題,這篇文章暫且這樣處理,00后這種年齡段,我寫了一個正則表達式來識別。
import?re?
def?get_age_group(text):
????data?=?re.findall('.*?(\d{2}后).*?',?text)
????if?data:
????????return?'-'.join(data)
????else:
????????return?''
那么我們就需要增加五列:location、person、org、company、age,首先寫一個函數(shù),用于從一個熱搜標題中解析出需要新增的內(nèi)容,注意get_age_group函數(shù)之前上面已經(jīng)寫過啦,所以這里直接調(diào)用即可。
import?fool
def?get_key_word(text):
????#?字典匹配速度快
????result?=?{
????????'person':?'',
????????'location':?'',
????????'org':?'',
????????'company':?'',
????}
????words,?ners?=?fool.analysis(text)
????for?ner?in?ners[0]:
????????if?ner[2]?in?result:
????????????result[ner[2]]?=?result[ner[2]]?+?'-'?+?ner[3]
????
????return?result['person'],?result['location'],?result['org'],?result['company'],?get_age_group(text)
然后我們寫幾行代碼對原數(shù)據(jù)進行批量處理,這里我們主要用到了apply函數(shù)去批量處理wb_title數(shù)據(jù),然后利用concat函數(shù)將新增數(shù)據(jù)和原始數(shù)據(jù)合并。
import?time
#?新增五列?位置?姓名?組織?公司?年齡段
t1?=?time.time()??#?時間戳?單位秒
print(f'熱搜標題處理開始時間:{t1}')
#?從wb_title中解析出新增列
pd_test?=?pd_read_sql['wb_title'].apply(get_key_word)
t2?=?time.time()??#?時間戳?單位秒
print(f'熱搜標題解析結(jié)束時間:{t2}')
print(f'成功解析了數(shù)據(jù){pd_test.shape[0]}條,耗費時間:{(t2-t1)/60:.2}分鐘')
#?處理新增列
pd_test?=?pd.DataFrame(list(pd_test),??columns=['person',?'location',?'org',?'company',?'age'])
#?合并
pd_all?=?pd.concat([pd_read_sql,?pd_test],?axis=1)
t3?=?time.time()??#?時間戳?單位秒
print(f'熱搜標題處理結(jié)束時間:{t3}')
print(f'成功處理了數(shù)據(jù){pd_all.shape[0]}條,耗費時間:{(t3-t2)/60:.2}分鐘')

一共八萬多條數(shù)據(jù),整個解析花費了7分鐘左右,數(shù)據(jù)處理好后,我們先保存一份到本地,避免系統(tǒng)突然奔潰或者啥誤操作,又得重新來過。
#?處理好的數(shù)據(jù)?首先本地保存下
pd_all.to_csv('wb_data_1.csv',?encoding='utf-8_sig',index=False)
#?然后查看下數(shù)據(jù)的基本情況
pd_all.info()

四、下集預(yù)告
以上,相對簡潔的給大家分享了如何讀取數(shù)據(jù),并根據(jù)分析維度出發(fā),去拆分、處理現(xiàn)有數(shù)據(jù)。
下一講中,我們將一起學(xué)習(xí)對處理好的數(shù)據(jù)如何進行數(shù)據(jù)分析與可視化,也歡迎大家在留言區(qū)提出更多可以分析的角度,關(guān)于數(shù)據(jù)分析與可視化這一節(jié),你還想學(xué)習(xí)什么其他的內(nèi)容也可以在評論區(qū)、留言區(qū)進行留言。
點贊+留言+轉(zhuǎn)發(fā),就是對我最大的支持啦~
--End--
如何找到我:
學(xué)習(xí)更多: 整理了我開始分享學(xué)習(xí)筆記到現(xiàn)在超過250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機器學(xué)習(xí)等方面,別再說不知道該從哪開始,實戰(zhàn)哪里找了 “點贊”就是對博主最大的支持?

