新冠COVIN-19流感病患轨迹追溯

实验背景

冬季是流感的高发季节,现已知某流感病毒的传播力很强,政府部门也陆续公开了部分流感确诊患者(后续简称“病患”)的非隐私信息,这部分数据为相关研究人员研究该流感病毒的传播与防控提供了重要的数据支撑。
然而,公布的数据多为文本等非结构化数据,而且极其分散,难以直接为后续研究提供深度的支撑。病患的轨迹信息蕴含居家、出行、餐饮等丰富的接触关系,在流感病毒人传人的特性下,如果能直观地展示这些接触信息,相信能对该流感病毒的研究提供很大的帮助。
基于此,本实验利用相关技术手段从公开的病患轨迹数据抽取了患者相关的基本信息(年龄、性别等)、轨迹、病患关系等数据,并利用图数据库技术对其进行研究,尝试为政府相关部门对流感的传播与防控工作提供有效的决策支撑。
注意:本案例仅用于技术学习交流。

实验步骤

操作前提:登录华为云
进入【实验操作桌面】,打开谷歌浏览器进入华为云登录页面。选择【IAM用户登录】模式,于登录对话框中输入系统为您分配的华为云实验账号和密码登录华为云,如下图所示:
注意:账号信息详见实验手册上方,切勿使用您自己的华为云账号登录。

image

任务一:准备数据

步骤1 创建OBS

在控制台点击左上角“服务列表”,在“存储”模块下点击“对象存储服务OBS”进入OBS管理控制台。或者点击如下链接进入OBS管理控制台:https://console.huaweicloud.com/console/?agencyId=0e9be7f2c3b04a4590de86049ada41bd&region=cn-north-4&locale=zh-cn#/obs/manager/buckets

image

点击OBS管理控制台右上角“创建桶”。
image

在创建桶界面填写合适的参数,其中:

区域:华北-北京四

桶名称:自定义即可,需要保证唯一

数据冗余存储策略:多AZ存储

其他:保持默认

image
image

填写完后,点击右下角“立即创建”。

步骤2 在桶中创建文件夹

在桶列表中点击刚刚创建的桶名称,点击“对象”-“新建文件夹”,输入文件夹名称:ges。

image

步骤3 下载数据集至OBS

detection(1|9|137|2||7|1|*|ges/covid-19_vertex.csv)

在华为云AI Gallery中可以获取流感患者轨迹追溯数据集v2。数据集链接:https://developer.huaweicloud.com/develop/aigallery/dataset/detail?id=cfe60cbf-2ca7-42d0-be3c-bd93710e79a4

本数据集包含“旅行团”公开的部分流感患者相关的基本信息、轨迹、病患关系等数据。这份数据包含800+个点,1300+条边。

本数据集的图模型如下所示:

image

图模型中包含了四类点和六类边,元信息说明如下:

image

点击当前界面的“下载”,此时会跳转到下载详情页,在下载详情页设置如下:

下载方式:对象存储服务(OBS)

目标区域:华北-北京四

目标位置:桶名称/ges

image

image

image

此时返回OBS管理控制台,在ges文件夹下可以看到如下图所示三个文件,分别是点文件、边文件、schema文件。

image

任务二:创建图

步骤1 创建图

在控制台点击左上角“服务列表”,在“人工智能”模块下点击“图引擎服务GES”进入GES管理控制台。或者点击如下链接进入GES管理控制台:https://console.huaweicloud.com/ges/?agencyId=0e9be7f2c3b04a4590de86049ada41bd&region=cn-north-4&locale=zh-cn#/GES/dashboard

点击“图管理”-“创建图”进入创建图界面。

image

在创建图界面填入参数:

图名称:ges_covid19

虚拟私有云:vpc-hce,如不是,请选择此项

子网:subnet-hce(192.168.0.0/24),如不是,请选择此项

安全组:sg-hce,如不是,请选择此项

公网访问:现在购买

用途:开发学习

其他:默认

点击“立即创建”,确认详细信息后点击“提交”。创建图的过程大概需要十几分钟,读者点击提交之后可以先熟悉后续内容。

image

image

image

image

image

步骤2 创建元数据

点击“元数据管理”-“导入”,在导入界面填入参数:

类型:OBS

选择文件路径:桶名称/ges/covid-19_schema.xml

名称:自定义,例如covid19

image

image

步骤3 将数据导入图

回到“图管理”页面,在创建的图右侧点击“更多”-“导入”。在导入界面填入如下参数:

元数据:根据上一步创建的名称输入,例如covid19

边数据集:桶名称/ges/covid-19_edge.csv

点数据集:桶名称/ges/covid-19_vertex.csv

其他:默认

image

image

导入后可以看到运行状态为“导入中”。

image

任务三:准备参数

在任务四步骤3中会涉及到多个调用GES服务有关的相关参数。任务三目的在于告诉读者如何准备好这些参数,读者可以先浏览此处的内容,后续可以回到此处。

公网访问地址:在图列表中找到对应图的公网IP地址

image

项目ID:在“我的凭证”-“项目列表”中可以找到华北-北京四所对应的项目ID

image

image
图名:ges_covid19(以个人创建的为准)
终端节点:iam.cn-north-4.myhuaweicloud.com(可以参考:https://developer.huaweicloud.com/endpoint?IAM)
IAM用户所属账户名:IAM用户所属账号名(在沙箱实验最上方)
IAM用户名:IAM用户名(在沙箱实验最上方)
IAM用户密码:IAM用户密码(在沙箱实验最上方)
所属项目: cn-north-4
port:443(开启了https安全模式的图实例时为443,若未开启,则填80)
注意:IAM用户名,IAM用户密码,IAM用户所属账户名请使用实验分配的账号信息,在沙箱实验最上方,如下图所示,而不是使用个人华为云账号信息。
其中,IAM用户所属账户名为截图上的账号名,IAM用户名为截图上的用户名,IAM用户密码为截图上的密码。

image

任务四:流感患者轨迹追溯

步骤1 创建notebook

detection(1|8|152|2||10|14|notebook-ges|RUNNING|modelarts.vm.cpu.2u)
在控制台点击左上角“服务列表”,在“人工智能”模块下点击“ModelArts”进入ModelArts管理控制台。或者点击如下链接进入ModelArts管理控制台:https://console.huaweicloud.com/modelarts/?agencyId=0e9be7f2c3b04a4590de86049ada41bd&region=cn-north-4&locale=zh-cn#/dashboard
image
在ModelArts管理控制台,点击“开发环境”-“Notebook”-“创建”。
image
在Notebook创建界面,填入如下参数:
名称:notebook-ges
镜像:公共镜像:pytorch1.8-cuda10.2-cudnn7-ubuntu18.04(第一个镜像:此处不限制具体镜像,主要使用其中的python环境,方便起见选择第一个镜像)
其他:保持默认
image
image
image
创建完毕后,点击该notebook右侧的“打开”,进入JupyterLab。
image
点击“python-3.7.10”创建一个新的notebook。
image

步骤2 下载ges4jupyter

首先通过moxing包从对象存储服务obs中下载ges4jupyter。ges4jupyter是jupyter连接GES服务的工具文件。文件中封装了使用 GES查询的预置条件,包括配置相关参数和对所调用API接口的封装。
输入:

import moxing as mox
mox.file.copy('obs://obs-aigallery-zc/GES/ges4jupyter/beta/ges4jupyter.py', 'ges4jupyter.py')
mox.file.copy('obs://obs-aigallery-zc/GES/ges4jupyter/beta/ges4jupyter.html', 'ges4jupyter.html')

输出的提示信息忽略即可。

步骤3 配置GESConfig的参数

GESConfig的参数都是与调用GES服务有关的参数,依次为“公网访问地址”、“项目ID”、“图名”、“终端节点”、“IAM用户名”、“IAM用户密码”、“IAM用户所属账户名”、“所属项目”,其获取方式可参考任务三。

说明:补充完下方代码运行后,如果提示以下问题:“RequestsDependencyWarning: urllib3 (1.26.12) or chardet (5.0.0)/charset_normalizer (2.0.12) doesn’t match a supported version!”,主要是由notebook镜像中包版本过高导致。
解决措施:将包urllib3版本降为1.21.1<=version<=1.26之间即可。在notebook中运行命令:“!pip install urllib3==1.21.1”。此时可能会提示其他error,忽略即可。该条命令运行一次。此时再次运行下方代码则成功。

输入:

from ges4jupyter import GESConfig, GES4Jupyter, read_csv_config
eip = 'GES公网IP,请自行修改'
project_id = '项目ID,请自行修改'
graph_name = '图名,请自行修改'
iam_url = 'iam.cn-north-4.myhuaweicloud.com'
domain_name = 'IAM用户所属账户名,请自行修改'
user_name = 'IAM用户名,请自行修改'
password = 'IAM用户密码,请自行修改'
project_name = 'cn-north-4'
port = 443 # 如果未开启https安全模式,值为80
# eip, project_id, graph_name, iam_url, user_name, password, domain_name, project_name, port = read_csv_config('cn_north_4_graph.csv')
config = GESConfig(eip, project_id, graph_name, 
                    iam_url = iam_url, 
                    user_name = user_name, 
                    password = password, 
                    domain_name = domain_name,
                    project_name = project_name,
                    port = port)
ges_util = GES4Jupyter(config, True);

注意:后续涉及到多处代码,已经用“输入”和“输出”加以区分,请读者不要运行“输出”后的代码,否则会报错。

步骤4 创建点索引和边索引

GES支持cypher和gremlin两种查询语言,本实验使用cypher语言。在使用cypher查询之前,先创建点索引和边索引。
输入:

print('开始创建点索引:')
job_id = ges_util.build_vertex_index()
job_result = ges_util.get_job(job_id)
if 'errorCode' not in job_result:
    for i in range(100):
        if job_result['status'] == 'success':
            break
        else:
            time.sleep(1)
            job_result = ges_util.get_job(job_id)
print('点索引创建完成')

输出:

开始创建点索引:
点索引创建完成

输入:

print('开始创建边索引:')
job_id = ges_util.build_edge_index()
job_result = ges_util.get_job(job_id)
if 'errorCode' not in job_result:
    for i in range(100):
        if job_result['status'] == 'success':
            break
        else:
            time.sleep(1)
            job_result = ges_util.get_job(job_id)
print('边索引创建完成')

输出:

开始创建边索引:
边索引创建完成

步骤5 查询统计信息

首先查询这份图数据的统计信息,对全图的点边数目有所了解。
输入:

import json
print('统计信息:')
result = ges_util.summary()
format_result = json.dumps(result, indent=4)
print(format_result)

输出:

统计信息:
{
    "vertexNum": 863,
    "labelDetails": {
        "labelInVertex": {
            "city": 8,
            "patient": 287,
            "place": 566,
            "vehicle": 2
        },
        "labelInEdge": {
            "take": 4,
            "work": 77,
            "reside": 273,
            "comfirm": 287,
            "relation": 72,
            "stay": 661
        }
    },
    "edgeNum": 1374
}

步骤6 获取前10条边以及其顶点。

输入:

cypher_result = ges_util.cypher_query("match (n)-[r]->(m) return n,r,m limit 10",formats=['row','graph']);
ges_util.format_cypher_result(cypher_result)

输出:

image

步骤7 查看各个城市的防护政策

对于数据中的城市,采集了部分城市的防护政策。了解其他城市的防护政策,有助于规划出行。
输入:

print('查看各个城市的防护政策:')
statement = "match (m:city) return id(m), m.防疫政策"
result = ges_util.cypher_query(statement)
format_result = ges_util.format_cypher_result(result)
format_result

输出:
image

步骤8 数据更新

随着采集到更多的数据,不免对原有的数据进行更新,比如新发现关联患者,就涉及到节点和边的增加操作。
假设北京新增病例40,其与原有北京病例39是亲属关系。
输入:

print('数据更新:')
print('先查询点是否存在:')
vertex_id = '北京病例40'
statement = "match (p) where id(p) ='" + vertex_id + "' return p"
result = ges_util.cypher_query(statement)
# result
# len(result['data'])
if len(result['results'][0]['data']) == 0:
    print('该节点不存在,增加该节点:')
    label = 'patient'
    property_name = '性别'
    value = '男'
    ges_util.add_vertex(vertex_id, label, property_name, value)
    print('再次查询该节点:')
    statement = "match (p) where id(p) ='" + vertex_id + "' return p"
    result = ges_util.cypher_query(statement)
    format_vertex_detail = json.dumps(result['results'][0]['data'], indent=4, ensure_ascii=False)
    print(format_vertex_detail)

    print('增加关联边:')
    source = '北京病例39'
    target = '北京病例40'
    label = 'relation'
    property_name = '类型'
    value = '家人'
    ges_util.add_edge(source, target, label, property_name, value)
    statement = "match (p)-[r]-(m) where id(p)='" + source + "' and id(m)='" + target + "' return r"
    result = ges_util.cypher_query(statement)
    format_edge_detail = json.dumps(result['results'][0]['data'], indent=4, ensure_ascii=False)
    print(format_edge_detail)
else:
    print('该节点已存在')

输出:

数据更新:
先查询点是否存在:
该节点不存在,增加该节点:
再次查询该节点:
[
    {
        "row": [
            {
                "年龄": null,
                "性别": "男"
            }
        ],
        "meta": [
            {
                "id": "北京病例40",
                "type": "node",
                "labels": [
                    "patient"
                ]
            }
        ]
    }
]
增加关联边:
[
    {
        "row": [
            {
                "类型": "家人"
            }
        ],
        "meta": [
            {
                "id": "北京病例39-北京病例40-4",
                "type": "relationship",
                "label": "relation"
            }
        ]
    }
]

步骤9 从不同维度做统计

对数据做宏观把控,往往有助于判断病情趋势。可以对数据从不同维度做统计。 下面会从空间(城市地区风险)、时间(增长趋势)、年龄(患者年龄分布)等维度做统计。
首先查看本轮已经波及到的城市及每个城市病情的严重程度。
输入:

print('查看有确诊病例的城市并按确诊人数排序:')
statement = "match (m:city)<-[r:comfirm]-(p:patient) with m, count(p) as patientNum return id(m), patientNum order by patientNum desc"
result = ges_util.cypher_query(statement)
format_result = ges_util.format_cypher_result(result)
format_result

输出:
image
目前中高风险区域的判断,是以区域确诊病例数目划分的。统计不同地域的确诊病例数目,可以判断各个区域的风险。
输入:

print('将图数据库中的轨迹点,按涉及的确诊病例数目多少进行统计,并从按病例数目从多到少排序:')
statement = "match (m:place)<-[s:stay]-(p:patient) with m, count(p) as patientNum return id(m), patientNum order by patientNum desc limit 10"
result = ges_util.cypher_query(statement)
format_result = ges_util.format_cypher_result(result)
format_result

输出:

image
此外对此轮病患的年龄做一个调查,以了解此轮病毒传播的特点。
输入:

print('查看全国患者年龄构成并按人数排序:')
statement = "match (p:patient) where p.年龄 is not null return p.年龄, count(*) as m order by m desc limit 10"
result = ges_util.cypher_query(statement)
format_result = ges_util.format_cypher_result(result)
format_result

输出:

image

从时间维度统计确诊病例数目,往往会反映病情发展的趋势,及其是否得到了有效的控制。
输入:

city_id = '石家庄市'
print('查看{}每天确诊人数:'.format(city_id))
statement = "match (p:patient)-[r:comfirm]->(m:city) where id(m)='" + city_id + "' return r.时间, count(*) order by r.时间 asc"
result = ges_util.cypher_query(statement)
format_result = ges_util.format_cypher_result(result)
format_result

输出:

image

除了宏观上的统计,我们会关注重点区域(如景区、机场)等,是否和确诊病例发生交集。
输入:

statement = "match (n)-[r]-(m) where id(n)='胡杨林景区' return n,r,m"
result = ges_util.cypher_query(statement,formats=['row','graph'])
ges_util.format_cypher_result(result)

输出:

image
对重点人员进行探索,分析其接触史,查询与该患者有直接关联关系的其他患者或地点等,探查可能的传播路径和圈定可疑人群。
输入:

statement = "match (n)-[r]-(m) where id(n)='额济纳旗病例1' return n,r,m"
result = ges_util.cypher_query(statement,formats=['row','graph'])
ges_util.format_cypher_result(result)

输出:

image
输入:

patient_id = '额济纳旗病例1'
print('查看{}的活动轨迹:'.format(patient_id))
statement = "match (p:patient)-[r]->(m:place) where id(p)='" + patient_id + "' return id(p), r.时间, type(r), id(m) order by r.时间 asc"
result = ges_util.cypher_query(statement)
format_result = ges_util.format_cypher_result(result)
format_result

输出:

image
输入:

patient_id = '额济纳旗病例1'
print('查看与{}有直接关联的患者:'.format(patient_id))
print('要么同时到过某地点:')
statement = "match path = (p:patient)-[r1]-(m:place)-[r2]-(n:patient) where id(p)='" + patient_id + "' and id(p) <> id(n) and r1.时间 = r2.时间 return id(p), id(m), id(n), r1.时间, path"
result = ges_util.cypher_query(statement,formats=['row','graph'])
format_result = ges_util.format_cypher_result(result)
format_result

输出:

image

输入:

print('要么是某种亲密关系:')
patient_id = '额济纳旗病例1'
statement = "match path = (p:patient)-[r]-(n:patient) where id(p)='" + patient_id + "' return id(p), id(n), r.类型, path"
result = ges_util.cypher_query(statement,formats=['row','graph'])
format_result = ges_util.format_cypher_result(result)
format_result

输出:

image

步骤10 查看两地病情传播

此轮病情源头是在额济纳旗,查看病情从额济纳旗传到北京的情况。
输入:

statement = "match path=(p:patient)-[]-(m:city) where id(m)='额济纳旗' and not (tostring(id(p)) contains '额济纳旗') return path"
statement += " union match path=(p:patient)-[]-(m:city) where id(m)='北京' and not (tostring(id(p)) contains '北京') return path"
result = ges_util.cypher_query(statement,formats=['row','graph'])
ges_util.format_cypher_result(result)

输出:

image

枚举所有在北京确诊的患者,通过最短路算法,检查其与额济纳旗之间的关系。
输入:

import copy
statement = "match (p:patient)-[r:comfirm]-(m:city) where id(m)='北京' return collect(distinct id(p))"
result = ges_util.cypher_query(statement)
print('北京所有的患者:')
vertex_list = result["results"][0]['data'][0]['row'][0]
print(vertex_list)
print('查看此轮病情入京可能的传播链:')
source = '额济纳旗'
chain_vid = []
for vid in vertex_list:
    target = vid
    avoid_ids = copy.deepcopy(vertex_list)
    avoid_ids.remove(vid)
    result = ges_util.filtered_shortest_path(source, target, avoid_ids)
    if len(result) != 0:
        chain_vid.append(target)
        path = ''
        for vtx_id in result:
            path = path + vtx_id + '-'
        print(path[:-1])

输出:

北京所有的患者:
['北京病例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']
查看此轮病情入京可能的传播链:
额济纳旗-北京病例24
额济纳旗-北京病例25
额济纳旗-北京病例33
额济纳旗-北京病例34
额济纳旗-北京病例35
额济纳旗-北京病例36
额济纳旗-北京病例37
额济纳旗-银川病例1-K42-北京病例39

步骤11 传播链分析

对可能传播链上的节点进行一跳查询,分析传播链之间的关系。
输入:

result = ges_util.cypher_query('match p=(n)--(m) where id(n) in $idlist and not (m:city) and not(m:patient and not(id(m) in $idlist)) return id(n),p',formats=['row','graph'], param={"idlist":chain_vid})
ges_util.format_cypher_result(result)

输出:

image
分析此轮病情入京可能的传播链,会发现病例24和25是一同去额济纳旗旅游,而病例33、34、35、36和37也是一起去额济纳旗旅游的,另外病例39是因为和外省确诊患者同乘车被感染的,等于得到了三条独立的传播链。
因为已经知道了病情的源头(额济纳旗),通过路径搜索功能,可以探查某个患者可能的感染路径。
输入:

vertex_id = '北京病例2'
print('查看{}可能的感染路径:'.format(vertex_id))
result = ges_util.path_query({
            "repeat": [
                {
                    "operator": "bothV",
                    "vertex_filter": {
                        "property_filter": {
                            "leftvalue": {
                                "id": ""
                            },
                            "predicate": "NOTIN",
                            "rightvalue": {
                                "value": ["北京"]
                            }
                        }
                    }
                }
            ],
            "until": [
                {
                    "vertex_filter": {
                        "property_filter": {
                            "leftvalue": {
                                "id": ""
                            },
                            "predicate": "=",
                            "rightvalue": {
                                "value": ["额济纳旗"]
                            }
                        }
                    }
                }
            ],
            "times": 5,
            "queryType": "Tree",
            "vertices": ["北京病例2"]
        })
ges_util.format_path_query(result)

输出:

image

步骤12 连通性分析

输入(需要几分钟时间运行,请耐心等待):

import time
print('连通性分析:')
job_id = ges_util.connected_component()
result = ges_util.get_job(job_id)
if 'errorCode' not in result:
    for i in range(1000):
        if result['status'] == 'success':
            break
        else:
            time.sleep(1)
            result = ges_util.get_job(job_id)
com_dict = {}
for v_dict in result['data']['outputs']['community']:
    for key, value in v_dict.items():
        statement = "match (p) where id(p)='" + key + "' return labels(p)"
        v_label = ges_util.cypher_query(statement)['results'][0]['data'][0]['row'][0]
        if v_label in ['city', 'patient']:
            com_dict.setdefault(value, []).append(key)
print('连通分支个数 : {}'.format(len(com_dict)))
for key, value in com_dict.items():
    print('连通分支 ' + key + ' 中的点(仅关注城市和患者):')
    print(value)

输出:

连通性分析:
连通分支个数 : 2
连通分支 北京病例1 中的点(仅关注城市和患者):
['北京病例1', '北京', '北京病例2', '北京病例3', '北京病例4', '北京病例5', '北京病例6', '北京病例7', '北京病例8', '北京病例9', '北京病例10', '北京病例11', '北京病例12', '北京病例37', '北京病例36', '北京病例13', '北京病例14', '北京病例15', '北京病例16', '北京病例17', '北京病例18', '北京病例19', '北京病例20', '北京病例21', '北京病例22', '北京病例23', '北京病例24', '额济纳旗', '北京病例25', '北京病例26', '北京病例27', '北京病例28', '北京病例29', '北京病例30', '北京病例31', '北京病例32', '北京病例33', '北京病例34', '北京病例35', '北京病例38', '北京病例39', '邢台病例1', '邢台病例2', '石家庄病例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', '石家庄病例47', '石家庄病例48', '石家庄病例49', '石家庄病例50', '石家庄病例51', '石家庄病例52', '石家庄病例53', '石家庄病例54', '石家庄病例55', '石家庄病例56', '石家庄病例57', '石家庄病例58', '石家庄病例59', '石家庄病例60', '石家庄病例61', '石家庄病例62', '石家庄病例63', '石家庄病例64', '石家庄病例65', '石家庄病例66', '石家庄病例67', '石家庄病例68', '石家庄病例69', '石家庄病例70', '石家庄病例71', '石家庄病例72', '石家庄病例73', '石家庄病例74', '石家庄病例75', '石家庄病例76', '石家庄病例77', '石家庄病例78', '石家庄病例79', '石家庄病例80', '石家庄病例81', '石家庄病例82', '石家庄病例83', '石家庄病例84', '石家庄病例85', '石家庄病例86', '石家庄病例87', '石家庄病例88', '石家庄病例89', '石家庄病例90', '石家庄病例91', '石家庄病例92', '石家庄病例113', '石家庄病例93', '石家庄病例94', '石家庄病例95', '石家庄病例112', '石家庄病例96', '石家庄病例97', '石家庄病例98', '石家庄病例110', '石家庄病例99', '石家庄病例101', '石家庄病例102', '石家庄病例100', '石家庄病例103', '石家庄病例104', '石家庄病例105', '石家庄病例106', '石家庄病例107', '石家庄病例108', '石家庄病例109', '石家庄病例111', '石家庄病例115', '石家庄病例114', '遵义病例1', '遵义', '遵义病例3', '遵义病例9', '遵义病例6', '遵义病例2', '遵义病例4', '遵义病例5', '遵义病例7', '遵义病例8', '遵义病例10', '邢台', '银川病例1', '银川', '银川病例2', '银川病例3', '银川病例4', '银川病例5', '银川病例6', '银川病例7', '银川病例8', '银川病例9', '银川病例10', '银川病例11', '银川病例12', '银川病例13', '额济纳旗病例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', '额济纳旗病例47', '额济纳旗病例48', '额济纳旗病例49', '额济纳旗病例50', '额济纳旗病例51', '额济纳旗病例52', '额济纳旗病例53', '额济纳旗病例54', '额济纳旗病例55', '额济纳旗病例56', '额济纳旗病例57', '额济纳旗病例58', '额济纳旗病例59', '额济纳旗病例60', '额济纳旗病例61', '额济纳旗病例62', '额济纳旗病例63', '额济纳旗病例64', '额济纳旗病例65', '额济纳旗病例66', '额济纳旗病例67', '额济纳旗病例68', '额济纳旗病例69', '额济纳旗病例70', '额济纳旗病例71', '额济纳旗病例72', '额济纳旗病例73', '额济纳旗病例74', '额济纳旗病例75', '额济纳旗病例76', '额济纳旗病例77', '额济纳旗病例78', '额济纳旗病例79', '额济纳旗病例80', '额济纳旗病例81', '额济纳旗病例82', '额济纳旗病例83', '额济纳旗病例84', '额济纳旗病例85', '额济纳旗病例86', '额济纳旗病例87', '额济纳旗病例88', '额济纳旗病例89', '额济纳旗病例90', '额济纳旗病例91', '额济纳旗病例92', '额济纳旗病例93', '额济纳旗病例94', '兰州', '额济纳旗病例95', '额济纳旗病例96', '北京病例40']
连通分支 大连病例1 中的点(仅关注城市和患者):
['大连病例1', '大连', '大连病例2', '大连病例3', '大连病例4', '大连病例5', '大连病例6', '大连病例7', '大连病例8', '大连病例9', '大连病例10', '大连病例11', '大连病例12']

通过连通性分析,我们暂未发现此轮大连的病情与额济纳旗有什么关联,可能来自不同的源头。

步骤13 保存结果至obs

detection(1|9|137|2||7|1|*|result.json)
将连通性分析结果保存至obs桶中。
输入:

import json

# 保存为json文件
with open('result.json','w',encoding='utf-8') as f:
    f.write(json.dumps(com_dict,ensure_ascii=False))

from modelarts.session import Session
session = Session()
bkts = session.obs.list_buckets()  # 获取obs桶,结果为一个列表

for buc in bkts:
    obs_save_path = "obs://" + buc + "/result.json"
    # 将result.json文件上传到桶中
    session.obs.upload_file(src_local_file="./result.json", dst_obs_dir=obs_save_path)

实验小结

本实验主要利用华为云图引擎服务对某流感病毒传播期间公开的部分病患轨迹数据进行研究,尝试为防控工作提供有效的决策支撑。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值