掘金15W沸點簡單分析(二)

1、數據預處理與入庫

獲取到了原始數據以後,下一步就是清洗入庫。html

1.1 數據模型

由於是簡單分析,因此只獲取話題用戶消息三塊內容。具體以下:python

class Pins(object):
    """
    沸點
    """
    msg_id = None            # 沸點ID
    topic_id = None            # 話題ID
    topic_title = None        # 話題名稱
    user_id = None            # 用戶ID
    user_name = None        # 用戶名
    msg_content = None        # 沸點內容
    msg_ctime = None        # 沸點建立時間
    msg_digg_count = 0      # 沸點點贊數
    msg_comment_count = 0   # 沸點評論數

    def __repr__(self):
        return '<Pins: %s>' % self.msg_id

1.2 數據庫表建立

數據庫的話,使用MySQL。由於沸點內容msg_content中含有emoji表情,因此在建表時字符集編碼須要使用utf8mb4mysql

建表SQL語句以下:git

CREATE SCHEMA `juejin` DEFAULT CHARACTER SET utf8mb4 ;

CREATE TABLE `juejin`.`pins` (
  `msg_id` VARCHAR(20) NOT NULL COMMENT '消息ID',
  `topic_id` VARCHAR(20) NOT NULL COMMENT '主題ID',
  `topic_title` VARCHAR(16) NOT NULL COMMENT '主題名稱',
  `user_id` VARCHAR(20) NOT NULL COMMENT '用戶ID',
  `user_name` VARCHAR(32) NOT NULL COMMENT '用戶暱稱',
  `msg_content` TEXT CHARACTER SET 'utf8mb4' NOT NULL COMMENT '消息內容',
  `msg_ctime` VARCHAR(16) NOT NULL COMMENT '消息建立時間戳',
  `msg_digg_count` INT(11) NOT NULL COMMENT '消息點贊數',
  `msg_comment_count` INT(11) NOT NULL COMMENT '消息評論數',
  `msg_createdate` DATETIME NOT NULL DEFAULT now() COMMENT '消息建立時間(同msg_ctime時間戳)',
  PRIMARY KEY (`msg_id`));

1.3 原始數據的讀取及入庫

接上文,咱們已經將全部沸點數據保存至json_data文件夾下。只須要將該文件下全部的json文件遍歷讀取出來,在作簡單的處理,而後存入數據庫便可。github

示例代碼以下:web

def read_all_data():
    """
    遍歷讀取全部json數據,而後入庫
    :return:
    """
    pins_list = []
    for dirpath, dirnames, filenames in os.walk('./json_data'):
        filenames = sorted(filenames, key=lambda _: _[5: 9])
        for filename in filenames:
            filename = os.path.join('./json_data', filename)
            print(filename)
            with open(filename, 'r') as pins_file:
                items_data = json.loads(''.join(pins_file.readlines()))['data']
                for item in items_data:
                    pins = Pins().parse_from_item(item)
                    pins_list.append(pins)
                    insert_db([pins])
    return pins_list

最終,數據庫表以下圖所示。sql

2、Superset簡介

官方是這樣描述的:A modern, enterprise-ready business intelligence web application.數據庫

先說下公司項目使用過程當中的感覺。咱們主要是將配置好的圖表以IFrame的形式嵌入到其餘頁面中,單獨作圖表的話是比較費時費力的。apache

  • ①首先遇到的就是權限問題,當時爲了趕進度直接對Public設置所有可讀權限,但這有數據安全的隱患。
  • ②Superset能夠很方便的生成IFrame,可是很差的地方就是每次修改完圖表後都須要更新IFrame代碼。
  • ③由於作的比較通用,因此丟失了不少特性,或者說不少功能是不太好實現的,好比數據下鑽等。
  • ④圖表展現是基於D3.js,感受風格有些不符合國內的偏好,好在開源,能夠擴展如echarts等圖表。

總體來講,配置和使用仍是比較方便的。畢竟是免費的,不要要求過高。json

2.1 安裝

根據官方文檔,我們使用OS dependencies的方式安裝和使用Superset。

根據文檔一步步走便可,virtualenv的使用可參考官方文檔

直接使用pip安裝Superset便可,pip install apache-superset。當前最新版本爲0.37.0

最後,咱們將官方示例加載如系統,superset load_examples。而後啓動開發服務器便可,`superset run -p 8088 --with-threads --reload --debugger
`。

理論上,咱們打開http://127.0.0.1:8088/superset/dashboard/births/,便可看到以下圖所示:

2.2 官方文檔

官方文檔必定要看,http://superset.apache.org/

3、基於Superset構建圖表

在製做圖表前,我們須要先制定幾個目標,也就是想要從數據中獲取什麼主題。

咱們就如下面6個主題來製做圖表吧。

  • 每日沸點數柱形圖
  • 沸點總數隨時間的變化曲線圖
  • 沸點話題佔比餅圖TOP10
  • 沸點發表數最多的用戶TOP25
  • 評論數最多的沸點TOP25
  • 點贊數最多的沸點TOP25

3.0 圖表製做準備工做

Superset圖表的製做能夠由數據庫表直接生成。這裏我們選擇更通用的一種方式,由SQL Lab -> SQL Editor經過SQL來直接獲取目標數據。

3.0.1 新增數據庫連接

格式爲SLQAlchemy URI,使用過Python的同窗對這款ORM確定不會陌生。感興趣的能夠了解一下,官方文檔:https://www.sqlalchemy.org/

首次配置時,會拋出Could not load database driver: mysql異常。執行pip install mysqlclient安裝mysql驅動便可。

3.1 圖表製做示例

3.1.1 每日沸點數柱形圖

3.1.2 沸點總數隨時間的變化曲線圖

3.1.3 沸點話題佔比餅圖TOP10

該數據統計時,將沒有話題的沸點進行了排除。

3.1.4 發表數最多的用戶TOP25

3.1.5 評論數最多的沸點TOP25

3.1.6 點贊數最多的沸點TOP25

不過這前兩條沸點有刷讚的嫌疑。

3.2 使用已建立的圖表製做Dashboard

4、後記

後續考慮對數據進行多維度、深層次的分析。如使用jieba分詞+wordcloud對沸點內容關鍵詞製做詞雲等。

可能的話,後臺專門跑個服務對沸點數據進行定時抓取和更新,並製做數據大屏進行展現。


震驚😱!所有話題 竟有1/4在摸魚

源碼已上傳至GitHub, Gitee

相關文章
相關標籤/搜索