写点什么

一个快速追踪密切接触者的开源脚本方案

作者:冯骐
  • 2022 年 4 月 22 日
  • 本文字数:1978 字

    阅读完需:约 6 分钟

需求

新冠疫情下,对特定人员的密切接触者流调工作非常重要。流调工作方式多种多样,比如视频,电话,数据分析等。这里数据分析自然是我们 IT 工作者的任务。也就是需要基于各类的行为数据,去修找与特定人员有时空伴随的密切接触者。


数据的来源显然是多样化的,可能包括网络,消费,门禁等各式各类的数据,同时流调的需求也是时刻变化的,我们需要对这个场景进行抽象,形成一个统一的模型,才能便于后续的自动化处理。

模型

我要挖掘的是与特定人员有时空伴随的密切接触者,因此无论原始数据是什么样的类型,我们所关注的字段应该始终只有三个。


  • 用户的 ID —— 他对于每个自然人应该是唯一的

  • 行为的时间 —— 通过时间,我们就可以对”时空”中的“时”进行定位了。

  • 行为所发生的位置 —— 例如无线的 AP 名称,消费的终端 ID 等,具体的内容并不重要,只要他能够对行为发生的空间进行定位就可以。


在确定了这三要素后,我们需要进一步描述“时空伴随”的概念。“时间”的伴随,我们可以理解为限定时间范围的行为记录,而“空间”的伴随,则可以视作在特定位置限定数量的行为记录。


因此一个流调工作,无论是自动化或者手动查询,大体都遵循以下过程:


  • 查询“被流调人员”的行为记录,锁定三要素

  • 根据得到的行为记录,进一步追溯在相同位置上产生的前后 N 名有行为记录的人员

  • 如果行为记录超出了限定的时间,则忽略

脚本

很容易基于上述的模型和算法,实现自动化的流调脚本。我们将一种实现的方案开源了出来,供大家参考 —— https://github.com/ECNU/contact_tracing

运行环境

python3

依赖安装

pip3 install -r requirement.txt
复制代码

配置

数据库和密接参数

修改 settings.py 配置文件,配置基本参数


# 数据库配置database_type="sqlite" #支持三种数据库类型:mysql、oracle、sqliteuser = "" # 会进行特殊字符转义password = "" # 会进行特殊字符转义host = "" # 会进行特殊字符转义port="" #数据库连接端口database="" # 会进行特殊字符转义,当连接 oracle 时,等价于 oracle 连接的 servicedb_path="./example.db" # 绝对路径,当数据库为sqlite时需要填写,而user、password、host、port、database不需要填写
# 与数据库表相关table_name = "example" # 表名user_id_field_name = "USERID" # 表示用户id的字段名time_field_name = "RECORDTIME" # 表示时间的字段名location_filed_names = ["XIAOQU","TERMNAME"] # 表示位置的字段,可能是多个,比如有校区字段加位置字段
# 输出结果字段 (与数据库表中定义的字段名称相关,默认应该为:用户id的字段、时间的字段名、位置的字段;程序内部在自动加上一个与该用户密接的用户id字段;)result_filed_names = ["USERID","RECORDTIME","XIAOQU","TERMNAME","TYPE"]

# 时间范围flow_tone_start_time = "2022-03-01 00:00:00"flow_tone_end_time = "2022-03-10 00:00:00"
# 密接限制人数close_contact_people_num = 5
# 密接限制时间 (分钟)close_contact_time = 30
复制代码

输入参数

USERID.xlsx 表格中填入 userid,每行一个


执行

src 目录下执行 main.py


cd src/python3 main.py
复制代码

输出

  1. result 目录下,以运行时间为命名的文件即为流调输出

  2. 其中被标注为黄色的行是输入的流调人员的消费记录


运行逻辑

  1. 第一步,读取输入的 user_id,一个个进行密接查询

  2. 查询某个 user_id 在流调时间内的消费记录

  3. 根据每一条记录进行下游查询,查询在该记录中的同一地点同一时间在前后若干分钟内的消费记录,取限定范围的人数。

  4. 将所有记录输出到指定表格并高亮输入人员的单元格

实践

在我们开源的仓库中,我们提供了一个示例的 sqlite 数据集。实际应用中,我们可以将需要进行流调排查的数据集,以视图的方式构建成适合脚本执行的字段。如果生产环境上的数据库视图不方便调整,也可以将数据导出以后,在其他数据库中导入构建适用脚本的数据集。


对于不同来源的数据,可以通过数据同步的方式将其整合到一起,对于非结构化的数据来源,可以将其相关的字段内容提取后,进行结构化整合。总之将需要的数据根据模型所需的格式进行整合调整即可,这也是数据治理的日常工作。


脚本基于 sqlalchemy 做的 orm 方案,目前可以支持 mysqloraclesqlite 三种数据库,应该可以很容易的进一步扩展到 PGMsSql,欢迎大家贡献 PR


这项工作在疫情结束以后,可以转化为社交关系的数据挖掘。通过分析人群之间的“密接“程度进而挖掘人群之间的社交关系,因此依然有很好的拓展潜力。这其中可能涉及隐私和伦理问题,需要后续工作中注意相关的流程合规。

申明

仓库内的 example.db 相关数据均为随机生成的测试数据,仅用于测试验证,没有实际含义。


项目开发过程中仅使用上述测试数据开发,没有使用任何真实个人信息。


开发完成的脚本将交付给授权的工作人员使用,开发人员无权获取生产环境的个人信息数据。


项目由社区自发开源,本文由个人撰写,不代表官方立场。

发布于: 刚刚阅读数: 3
用户头像

冯骐

关注

教育行业码农 2020.06.19 加入

一个教育行业的码农

评论

发布
暂无评论
一个快速追踪密切接触者的开源脚本方案_Python_冯骐_InfoQ写作社区