专栏首页若是烟花掘金15W沸点简单分析(二)

掘金15W沸点简单分析(二)

一、数据预处理与入库

获取到了原始数据之后,下一步就是清洗入库。

1.1 数据模型

因为是简单分析,所以只获取话题用户消息三块内容。具体如下:

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表情,所以在建表时字符集编码需要使用utf8mb4

建表SQL语句如下:

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文件遍历读取出来,在做简单的处理,然后存入数据库即可。

示例代码如下:

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

最终,数据库表如下图所示。

二、Superset简介

官方是这样描述的:A modern, enterprise-ready business intelligence web application.

先说下公司项目使用过程中的感受。我们主要是将配置好的图表以IFrame的形式嵌入到其他页面中,单独做图表的话是比较费时费力的。

  • ①首先遇到的就是权限问题,当时为了赶进度直接对Public设置全部可读权限,但这有数据安全的隐患。
  • ②Superset可以很方便的生成IFrame,但是不好的地方就是每次修改完图表后都需要更新IFrame代码。
  • ③因为做的比较通用,所以丢失了很多特性,或者说很多功能是不太好实现的,比如数据下钻等。
  • ④图表展示是基于D3.js,感觉风格有些不符合国内的偏好,好在开源,可以扩展如echarts等图表。

整体来说,配置和使用还是比较方便的。毕竟是免费的,不要要求太高。

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/

三、基于Superset构建图表

在制作图表前,咱们需要先制定几个目标,也就是想要从数据中获取什么主题。

我们就以下面6个主题来制作图表吧。

  • 每日沸点数柱形图
  • 沸点总数随时间的变化曲线图
  • 沸点话题占比饼图TOP10
  • 沸点发表数最多的用户TOP25
  • 评论数最多的沸点TOP25
  • 点赞数最多的沸点TOP25

3.0 图表制作准备工作

Superset图表的制作可以由数据库表直接生成。这里咱们选择更通用的一种方式,由SQL Lab -&gt; 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

四、后记

后续考虑对数据进行多维度、深层次的分析。如使用jieba分词+wordcloud对沸点内容关键词制作词云等。

可能的话,后台专门跑个服务对沸点数据进行定时抓取和更新,并制作数据大屏进行展示。


震惊?!全部话题 竟有1/4在摸鱼

源码已上传至GitHub, Gitee。 </pins:>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python基础 -- 简单实现HTTP协议

    lpe234
  • 七日Python之路--第六天

    实在不太想看Django了。找点有意思的东西,突然看到了物联网,之前超感兴趣的东西。做Java的时候,就一直在想的东西。如今做Python,还是没有忘却。

    lpe234
  • 七日Python之路--第九天(blog与Django)

    在做models之前,最好将https://docs.djangoproject.com/en/1.6/ 中的the model layer 细读。

    lpe234
  • 多线程使用的关键字

      Synchronized修饰一个方法很简单,就是在方法的前面加synchronized,synchronized修饰方法和修饰一个代码块类似,只是作用范围不...

    小勇DW3
  • 一文看懂如何分析MySQL Explain(3/3)

    注:t_classes表增加了一个组合索引,字段名`grade`, `classes_name`, `student_num`, `head_teacher_...

    程序员小强
  • 内核开发知识3之串口过滤.绑定设备.

    根据上面的理论.我们可以根据API. 写简单的串口绑定了. 注意下方代码是串口绑定的代码.相当于我们在这个设备上加了一层.但是我们还没有写获取请求数据的代码.

    IBinary
  • python发送邮件和附件

    发送邮件的时候,需要发送人,收件人,和一台邮件服务器,这里使用python发送一个邮件,主要需要引入smtplib和email库。 下面是源码,粘贴即可用:

    py3study
  • Neurology:皮质下小梗死后相连深皮层的选择性萎缩

    目的:探讨慢性皮质下小梗死(chronicsmall subcortical infarct)患者中,相连皮层的皮质层是否受到不同的影响,以及这些差异是否与临床...

    用户1279583
  • 【图解数据结构】 一组动画彻底理解桶排序

    由于LeetCode上的算法题很多涉及到一些基础的数据结构,为了更好的理解后续更新的一些复杂题目的动画,推出一个新系列 -----《图解数据结构》,主要使用动画...

    五分钟学算法
  • 2017年度盘点:Github上十大有趣的机器学习项目(文末有惊喜......)

    关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 目录: AlphaZero-Gomo...

    昱良

扫码关注云+社区

领取腾讯云代金券