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

news2025/2/25 23:14:45

实验背景

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

实验步骤

操作前提:登录华为云
进入【实验操作桌面】,打开谷歌浏览器进入华为云登录页面。选择【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)

实验小结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/151412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网站服务实操练习

作者简介&#xff1a;一名99年软件运维应届毕业生&#xff0c;正在自学云计算课程。宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。创作不易&#xff0c;动动小手…

python:打包package

简介 把模块打包成package&#xff0c;可以进行分发和安装。 packaged的打包和安装一、package层次架构二、 package的打包和安装1. 创建setup.py2. 打包package3. 安装package一、package层次架构 其中mypackage为进行打包的文件夹&#xff0c;文件夹下包含多个脚本&#xff1…

钢铁行业应用APS生产排产系统的好处

1 钢铁行业APS生产排产系统设计的主要业务流程 全局一体化计划&#xff1a;主要负责订单交期评审与应答、销产转换、主生产计划、铁水需求计划&#xff0c;该计划的最终目标是对各个分厂的日计划提出整体要求。主要对口业务部门为公司生产计划排程部门。 各个工段厂区的一体化…

SpringCloud微服务项目实战 - 4.自媒体平台(博主后台)

“我读过很多书&#xff0c;但后来大部分都忘记了&#xff0c;你说这样的阅读究竟有什么意义&#xff1f;” “当我还是个孩子时&#xff0c;我吃过很多食物&#xff0c;现在已经记不起来吃过什么了。但可以肯定的是&#xff0c;它们中的一部分已经长成我的骨头和肉。” 系列文…

LaoCat带你认识容器与镜像(三【上】)

有道是每逢佳节倍惰怠 ~&#xff0c;春节期间随缘更新吧 ~ 本章内容 Docker挂载数据卷相关。 本文实操全部基于Ubuntu 20.04 宿主机 > linux服务器本身 前边章节就介绍过Docker数据卷相关的知识点&#xff0c;也特别强调了生产环境一定要记得挂载数据卷&#xff0c;编程的小…

【前端】Vue项目:旅游App-(11)city:添加热门数据、动态修改索引栏、点击跳转、显示城市

文章目录目标过程与代码添加热门数据热门数据样式索引栏索引监听点击、保存数据、回退首页跳转到city页、显示城市效果总代码修改的文件city.jscurrentGroupCity.vuehome.vue目标 上一篇以indexBar的形式显示了数据&#xff1a;【前端】Vue项目&#xff1a;旅游App-&#xff0…

【Kubernetes 企业项目实战】01、使用 kubeadm 安装 K8s-v1.23 高可用集群

目录 K8s-v1.23 安装环境规划 kubeadm 和二进制安装 k8s 适用场景分析 一、初始化安装 k8s 集群的环境 1.1 初步的环境初始化 1.2 配置主机之间无密码登录 1.3 关闭交换分区 swap 提升性能 1.4 修改机器内核参数 1.5 配置阿里云的 repo 源 1.6 配置安装 k8s 组件需要…

python调试器 ipdb

文章目录1. 介绍1.1 常用调试方式1.2 安装 ipdb2. 用法3. 命令3.1、查看源代码3.2、添加断点3.3 添加临时断点3.4 清除断点3.5、打印变量值3.6、逐行调试命令3.7、非逐行调试命令3.8 跳出函数&#xff0c;跳入函数3.9、查看当前函数所有参数3.10 打印变量的值3.11、打印变量类型…

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示例…

【openGauss】在openEuler(ARM架构)上安装openGauss(单机版)

一、系统版本介绍 当前案例中的openGauss安装&#xff0c;底层操作系统为openEuler-20.03-LTS版本&#xff0c;当前openGauss对Python版本兼容性最好的是Python 3.6版本与Python 3.7版本&#xff0c;该实验使用的openEuler版本自带Python 3.7.4&#xff0c;不需要再自行安装 二…

光电探测器怎么选

想要挑选光电探测器&#xff0c;首先应该理解探测器的重要的几个指标。 实际看一个光电探测器吧 输入输出接口三个部分&#xff0c;光纤输入&#xff0c;射频输出&#xff0c;电源供电 数据手册 捡几个难理解的说说&#xff0c;详细推导解释这里不赘述了&#xff0c;难理解的…

【二】Netty 搭建简单的http服务

Netty 搭建简单的http服务Netty 简介代码展示netty 依赖NettyServer netty 服务端启动类MyChannelInitializer 设置编码解码器&#xff0c;并添加自己的业务方法MyClientHandler 实现自己的业务方法。主要方法 是读取到数据后处理效果展示服务端打印截图采用Postman 测试 截图N…

JDBC 实现增删改查的实际操作,很简单

大家好&#xff0c;今天给大家分享一下JDBC 实现增删改查的实际操作 我们还是使用的Maven的方式&#xff0c; 首先要创建一个干净的Maven webapps项目 看这个就可以了 要导入相关的依赖 <dependencies><!-- https://mvnrepository.com/artifact/mysql/mysql-connec…

如何使用 HTML5 Web 连接到 VMware vSphere Hypervisor

本文将向你展示如何在计算机上连接 VMware vSphere Hypervisor 7.0.3,VMware vSphere Hypervisor 7.0.3 也称为 ESXi 7.0.3。 连接 ESXi 7.0.3 下载工具以管理 ESXi 主机服务器连接 ESXi 7.0.3 服务器下载工具以管理 ESXi 主机服务器 现在不需要任何工具来管理 ESXi 7.0.3,从…

1.8周报

SourceURL:file:///home/mrl/文档/1.8周报.docx 周报 代码行数&#xff1a; 周一 611 周二 672 周三 524 周四 528 周五 450 周六 545 周日 564 遇到的问题&#xff1a; 系统配置问题&#xff1a; 在升级安装python3时&#xff0c;由于操作失误&#xff0c;导…

数据脱敏实战经验

1. 创建隐私数据类型枚举&#xff1a;PrivacyTypeEnum2. 创建自定义隐私注解&#xff1a;PrivacyEncrypt3. 创建自定义序列化器&#xff1a;PrivacySerializer4. 隐私数据隐藏工具类&#xff1a;PrivacyUtil5. 注解使用这两天在整改等保测出的问题&#xff0c;里面有一个“用户…

如何将.md文件转换为pdf

目录 1.step1&#xff1a; 安装Visual Studio Code&#xff08;简称VScode&#xff09; 2.step2&#xff1a; 安装定制化插件 3.step3&#xff1a; 进入预览窗口模式 4.step4&#xff1a; 进行格式转换 1.step1&#xff1a; 安装Visual Studio Code&#xff08;简称VScode&a…

【实战篇】39 # 如何实现世界地图的新冠肺炎疫情可视化?

说明 【跟月影学可视化】学习笔记。 世界地图新冠肺炎疫情可视化 下面将实现世界地图新冠肺炎疫情可视化。数据用的是从 2020 年 1 月 22 日到 3 月 19 日这些天的新冠肺炎疫情进展。效果类似下图&#xff1a;https://covid19.who.int/ 步骤一&#xff1a;准备世界地图可视化…

[ 数据结构 ] 迪杰斯特拉算法(最短路径问题)

0 最短路径问题 战争时期&#xff0c;胜利乡有 7 个村庄(A, B, C, D, E, F, G) &#xff0c;现在有六个邮差&#xff0c;从 G 点出发&#xff0c;需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄各个村庄的距离用边线表示(权) &#xff0c;比如 A – B 距离 5 公里问&#…

不透明度和填充的区别

提纲 1、不透明度和填充的相同之处 2、不透明度和填充的不同之处 3、从字面意思理解不透明度和填充 1、不透明度和填充的相同之处 在初学PS时&#xff0c;一定对“不透明度”和“填充”非常迷惑&#xff0c;它们在图层面板的这个位置 这篇就来详细聊聊这两个滑块&#xff0…