简介
现在因上海疫情困在房子里哪也去不了,非常无聊!于是突发其想,要不利用之前搭建好的ELK,搞一个上海3月以来疫情感染数的看板?OK,那就想办法实现吧!
先上一下最终效果,勾起一下兴趣:
初使数据来源
我最初的数据来源是一张别人整理过的表格,不幸的是,它只是一张图片。
转换图片为表格
这里借用了一下微信的搜一搜功能使用腾讯文档进行转换:
用微信打开原始数据图片
然后长按图片,点击底部的「搜一搜」按钮,此时,表格正在识别中。
识别好以后就可以去把图片导出excel格式了
导入数据到ES
在ES中新建索引
新建了一个如下结构的index:xinguan-sh
1 | { |
使用kibana的机器学习功能导入表格数据
目前该功能还在实验阶段,支持的格式有限,所以记得把excel表格另存为csv格式的。如下步骤导入即可:
kibana中选择如下入口上传csv文件
编辑每一列对应的字段属性
- 选择index名称xinguan-sh后进行导入
每日数据更新
由于疫情数据每天都会由上海发布公众号进行更新,因此,需要每天更新一条ES的记录。
计算公式
确诊数、无症状数、无症状转归确诊数可以直接录入,然而有另外两项值来源于计算所得:
- 新增人数 = 确诊数 + 无症状数 - 无症状转归确诊数
- 累积数 = 前一天累积数 + 今日新增数
SpringBoot项目主要代码
对于上面这些公式,使用手算或者计算器都还是太麻烦,于是想着还是简单写个接口让程序自己算吧。
引入maven依赖
1
2
3
4
5<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>4.0.6.RELEASE</version>
</dependency>配置application.yml参数
1
2
3
4
5
6spring:
elasticsearch:
rest:
uris: http://es-host:9200
password: 密码不展示
username: 用户名实体类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19"xinguan-sh") (indexName =
public class XinGuanSH implements Serializable {
private String id;
private String quezhen;
private String toquezhen;
private String wuzhengzhuang;
private String newadd;
private String sum;
(type = FieldType.Text)
private String date;
}Repository类
1
2public interface XinGuanSHRepository extends ElasticsearchRepository<XinGuanSH, String> {
}Service实现类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class XinGuanSHSeviceImpl implements XinGuanSHService {
private XinGuanSH xinGuanSHRepository;
public void save(XinGuanSH xinGuanSH) {
String dateStr = xinGuanSH.getDate();
Integer quezhen = Integer.valueOf(xinGuanSH.getQuezhen());
Integer wuzhengzhuang = Integer.valueOf(xinGuanSH.getWuzhengzhuang());
Integer toquezhen = Integer.valueOf(xinGuanSH.getToquezhen());
// 计算新增数
Integer newadd = quezhen + wuzhengzhuang - toquezhen;
String lastDate = lastDate(dateStr);
XinGuanSH lastDoc = xinGuanSHRepository.findById(lastDate).get();
// 计算累积数
Integer sum = newadd + Integer.valueOf(lastDoc.getSum());
// 组装新doc记录
XinGuanSH doc = new XinGuanSH();
doc.setId(dateStr);
doc.setDate(dateStr);
doc.setQuezhen(quezhen.toString());
doc.setToquezhen(toquezhen.toString());
doc.setWuzhengzhuang(wuzhengzhuang.toString());
doc.setNewadd(newadd.toString());
doc.setSum(sum.toString());
xinGuanSHRepository.save(doc);
}
/**
* 获取上一天
* @param dateStr
* @return
*/
private String lastDate(String dateStr){
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sf.parse(dateStr);
Date lastDate = DateUtil.offsetDay(date, -1);
return sf.format(lastDate);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}Controller类
1
2
3
4
5
6
7
8
9
10
11
12
"/xxx") (
public class EsController {
private XinGuanSHService xinGuanSHService;
"/save") (
public JSONObject save(@RequestBody XinGuanSH xinGuanSH) {
xinGuanSHService.save(xinGuanSH);
return CommonUtil.successJson();
}
}
每日调用接口更新数据
每天只需根据新闻发布的几项数值,调用一下接口就行
Kibana看板设计
这一项其实都是一些界面配置,没有什么好说的,各种图表配置参考官方文档中的介绍即可,大致步骤如下:
新建kibana索引模式:xinguan-sh
新增各项可视化组件,并编辑组件展示项对应于kibana索引模式xinguan-sh中的属性等
如果有特殊要显示的计算值或拼装值,可结合定义kibana索引模式中的脚本字段来实现。
比如我想显示单位为万的换算值,于是我可以定义1个叫做wuzhengzhuang-w的脚本字段,给其填入如下脚本:
1
2def a = doc['wuzhengzhuang'].value;
return a/10000.00;可视化组件编辑完成后,再新建仪表板,选择上面的一些组件,进行拖拽放置在页面中的不同位置即可。
最终效果就是文章开头那样啦!
总结
利用kibana可以实现的看板效果还有很多,或者也可以用Canvas做一些绚丽的页面。目前本人只是简单的尝试了一下几个组件的效果,从图中趋势看,上海近几日疫情已经稳步好转,希望早日解封吧!
本文链接: https://www.xiajunyi.com/pages/p87.html
版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。转载请注明出处!