一个快速追踪密切接触者的开源脚本方案
需求
新冠疫情下,对特定人员的密切接触者流调工作非常重要。流调工作方式多种多样,比如视频,电话,数据分析等。这里数据分析自然是我们 IT 工作者的任务。也就是需要基于各类的行为数据,去修找与特定人员有时空伴随的密切接触者。
数据的来源显然是多样化的,可能包括网络,消费,门禁等各式各类的数据,同时流调的需求也是时刻变化的,我们需要对这个场景进行抽象,形成一个统一的模型,才能便于后续的自动化处理。
模型
我要挖掘的是与特定人员有时空伴随的密切接触者,因此无论原始数据是什么样的类型,我们所关注的字段应该始终只有三个。
用户的 ID —— 他对于每个自然人应该是唯一的
行为的时间 —— 通过时间,我们就可以对”时空”中的“时”进行定位了。
行为所发生的位置 —— 例如无线的 AP 名称,消费的终端 ID 等,具体的内容并不重要,只要他能够对行为发生的空间进行定位就可以。
在确定了这三要素后,我们需要进一步描述“时空伴随”的概念。“时间”的伴随,我们可以理解为限定时间范围的行为记录,而“空间”的伴随,则可以视作在特定位置限定数量的行为记录。
因此一个流调工作,无论是自动化或者手动查询,大体都遵循以下过程:
查询“被流调人员”的行为记录,锁定三要素
根据得到的行为记录,进一步追溯在相同位置上产生的前后 N 名有行为记录的人员
如果行为记录超出了限定的时间,则忽略
脚本
很容易基于上述的模型和算法,实现自动化的流调脚本。我们将一种实现的方案开源了出来,供大家参考 —— https://github.com/ECNU/contact_tracing
运行环境
python3
依赖安装
配置
数据库和密接参数
修改 settings.py
配置文件,配置基本参数
输入参数
在 USERID.xlsx
表格中填入 userid
,每行一个
执行
在 src
目录下执行 main.py
输出
在
result
目录下,以运行时间为命名的文件即为流调输出其中被标注为黄色的行是输入的流调人员的消费记录
运行逻辑
第一步,读取输入的 user_id,一个个进行密接查询
查询某个 user_id 在流调时间内的消费记录
根据每一条记录进行下游查询,查询在该记录中的同一地点同一时间在前后若干分钟内的消费记录,取限定范围的人数。
将所有记录输出到指定表格并高亮输入人员的单元格
实践
在我们开源的仓库中,我们提供了一个示例的 sqlite
数据集。实际应用中,我们可以将需要进行流调排查的数据集,以视图的方式构建成适合脚本执行的字段。如果生产环境上的数据库视图不方便调整,也可以将数据导出以后,在其他数据库中导入构建适用脚本的数据集。
对于不同来源的数据,可以通过数据同步的方式将其整合到一起,对于非结构化的数据来源,可以将其相关的字段内容提取后,进行结构化整合。总之将需要的数据根据模型所需的格式进行整合调整即可,这也是数据治理的日常工作。
脚本基于 sqlalchemy
做的 orm
方案,目前可以支持 mysql
、oracle
、sqlite
三种数据库,应该可以很容易的进一步扩展到 PG
和 MsSql
,欢迎大家贡献 PR
。
这项工作在疫情结束以后,可以转化为社交关系的数据挖掘。通过分析人群之间的“密接“程度进而挖掘人群之间的社交关系,因此依然有很好的拓展潜力。这其中可能涉及隐私和伦理问题,需要后续工作中注意相关的流程合规。
申明
仓库内的 example.db
相关数据均为随机生成的测试数据,仅用于测试验证,没有实际含义。
项目开发过程中仅使用上述测试数据开发,没有使用任何真实个人信息。
开发完成的脚本将交付给授权的工作人员使用,开发人员无权获取生产环境的个人信息数据。
项目由社区自发开源,本文由个人撰写,不代表官方立场。
版权声明: 本文为 InfoQ 作者【冯骐】的原创文章。
原文链接:【http://xie.infoq.cn/article/1ce94aa4ead96765bfe5c8bb4】。
本文遵守【CC BY-SA】协议,转载请保留原文出处及本版权声明。
评论