<<返回python首页 python

《Python 应用案例》

用Python可视化COVID19对社交距离的影响

COVID-19占领了整个世界,并在短短几个月内使整个世界停滞不前。全世界的总病例将很快达到50万,并且已经确认有20,000多人死亡。令人担忧的是,总病例数仍呈指数增长,并且没有放缓的迹象。通过社会疏远使曲线变平似乎是唯一的出路。在过去的几周中,许多国家被封锁了,人们被要求严格待在家里。所有这些措施都不会消除病毒,但是将有助于减缓病毒的传播,从而减轻对医疗保健系统的压力,从而降低死亡率。可以使用python中的pandas和matplotlib展平可视化曲线时所产生的指数影响。

但是,许多人似乎仍然不了解社会疏离的严重性,甚至一个人都可能产生多大的影响。关键是,如果您是一个健康的个体,并且该病毒可能不会对您造成太大影响,但是您可以将其传播给可能受到其不利影响的其他人。

因此,在这篇快速文章中,我将尝试并可视化使用python进行社交疏散的效果,以了解每个人在阻止COVID-19传播方面可能产生的巨大影响,并可能挽救数千人的生命。

img

本实验

该实验的目的不是要对病毒的传播进行建模,而是要了解社交距离对减少病毒传播的影响并意识到其重要性。

首先,导入相关库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

让我们导入要素并定义一些参数。

DAYS = 90
POPULATION = 500000
SPREAD_FACTOR = 1
DAYS_TO_RECOVER = 10
INITIALLY_AFFECTED = 4
city = pd.DataFrame(data={'id': np.arange(POPULATION), 'infected': False, 'recovery_day': None, 'recovered': False})
city = city.set_index('id')

firstCases = city.sample(INITIALLY_AFFECTED, replace=False)
city.loc[firstCases.index, 'infected'] = True
city.loc[firstCases.index, 'recovery_day'] = DAYS_TO_RECOVER

stat_active_cases = [INITIALLY_AFFECTED]
stat_recovered = [0]

for today in range(1, DAYS):
    # Mark people who have recovered today
    city.loc[city['recovery_day'] == today, 'recovered'] = True
    city.loc[city['recovery_day'] == today, 'infected'] = False

    # Calcuate the number of people who are infected today
    spreadingPeople = city[ (city['infected'] == True)]
    totalCasesToday = round(len(spreadingPeople) * SPREAD_FACTOR)
    casesToday = city.sample(totalCasesToday, replace=True)
    # Ignore people who were already infected in casesToday
    casesToday = casesToday[ (casesToday['infected'] == False) & (casesToday['recovered'] == False) ]
    # Mark the new cases as infected, and their recovery day
    city.loc[casesToday.index, 'infected'] = True
    city.loc[casesToday.index, 'recovery_day'] = today + DAYS_TO_RECOVER

    stat_active_cases.append(len(city[city['infected'] == True]))
    # stat_recovered.append(len(city[city['recovered'] == True]))

    # Try and reduce the SPREAD_FACTOR to simulate the effects of different levels of social distancing
    # if today >= 5:
    #     SPREAD_FACTOR = 1
    # if today >= 10:
    #     SPREAD_FACTOR = 0.1

import matplotlib.pyplot as plt
plt.bar(x=np.arange(DAYS), height=stat_active_cases, color="red")
plt.show()

让我解释每个参数:

  • 天数:这只是我们进行模拟的天数
  • 人口:我们模拟城市的人口。
  • SPREADFACTOR:这是感染者接触的人数。在一个城市中,一个普通人每天至少要与16个人接触。假设只有四分之一的人会被感染,我选择了SPREADFACTOR为4。需要注意的是,传播因子取决于许多变量,并且在现实生活中不会保持恒定。
  • DAYSTORECOVER:感染者恢复所需的天数。在现实生活中,这也不是一个常数,但是10是一个很好的平均值。
  • INITIALLY_AFFECTED:最初受到该病毒影响的人数。他们是将病毒从受感染的地区携带到新的地区的携带者,例如我们的假设城市

我们将使用DataFrame建模一个城市,其中每一行都对应一个公民,并跟踪感染和康复的人。使用示例函数可以从DataFrame中随机选择人员。这是我们将要做的:

  • 创建一个名为city的DataFrame,其中每一行对应一个城市中的人。它还包含用于标记感染和康复时间的列。最初是随机的INITIALLY_AFFECTED个人,使用样本并将其标记为感染。还要纪念他们的康复日。
  • 运行for循环DAYS次以模拟每一天。
  • 检查当天已恢复的人数,并将其标记为已恢复。这些人不会再传播这种病毒。
  • 每天计算受感染的人数,使用SPREADFACTOR计算当天的新感染人数。因此,一天中的新案件数= SPREADFACTOR *有效案件数。
  • 跟踪活动案例的数量以及为以后进行可视化而康复的人员。

img

输出

您可以看到,在大约10到15天内,整个100,000人口受到了影响和恢复。假设该城市能够同时治疗100,000名患者,并且每个人在10天内以相同的速度康复。但是,您是否认为这个有100,000个虚拟城市的医疗系统可以在一周左右的时间内每天处理100,000个活跃病例?现在,现实中的增长可能并不那么猛烈,但是如果我们不采取任何行动,它很容易导致类似的事情。

现在,让我们看一下图中SPREAD_FACTOR的不同值。

img

观察结果:

  • SPREAD_FACTOR = 1(左上):这意味着每个感染者都会与一个随机人接触,如果尚未感染,则该人会被感染。几乎所有人口都受到了影响。
  • SPREAD_FACTOR = 0.5(左下):每天每感染两名新感染者。请注意,此新人员的选择是随机进行的,并且仅当此人尚未被感染时才被感染。这里的曲线仍然与第一种情况几乎相同,但是总数减少了约20,000。
  • SPREAD_FACTOR = 0.25(右上):每4个被感染的人,就有一个人被感染(如果尚未感染)。换句话说,这4名受感染者中有1名与新感染者接触(其他3名正在与社会隔离!)。当所有人民有意识地隔离自己并进行社会疏远时,可能是这种状态。与前一种情况相比,仅通过将传播因子减小一半,传播就呈指数下降,并且曲线明显更平坦。在这里,医疗保健系统应该能够提供良好的护理,因为在高峰期,只有40,000例活跃病例。
  • SPREAD_FACTOR = 0.2(右下):在此,每5个受感染的人中就有1个与新人接触并传播了感染。其他4人处于孤立状态。与以前的案例没有太大不同,但是曲线明显平坦,并且活动高峰期的案例下降了将近一半!

在后两种情况下,您可以观察到一个人对病毒整个传播的影响!由此可以得出结论,尽管病毒呈指数级传播,但社交距离也呈指数级增长,每个孤立的人都对平坦化曲线产生指数级影响!

注意:我知道这是对现实情况的过分简化,但是我认为它使我们对SPREAD_FACTOR与活动案例数之间的关系有了很好的了解。另外,可以使用数学方程式轻松模拟指数函数,但是我认为这更直观,更容易理解。


原文地址:https://towardsdatascience.com/covid19-visualising-the-impact-of-social-distancing-in-python-8567c14a3a73

作者:阿达什·梅农(Adarsh Menon)

好了,现在您为什么对社会隔离给予如此重要的重视!基本上,您是坐在家里来挽救生命。

您可以尝试使用不同的pandas参数值。另外,请尝试形象化其他指标,例如每天的恢复。您可以尝试以不同的时间间隔减小它,并观察效果,而不是在整个模拟中保持恒定的扩散因子值。我注意到,一旦感染,就没有回头路可走了。因此,要与社会保持距离,洗手。

移动端设备除iPad Pro外,其它移动设备仅能阅读基础的文本文字。
建议使用PC或笔记本电脑,浏览器使用Chrome或FireFox进行浏览,以开启左侧互动实验区来提升学习效率,推荐使用的分辨率为1920x1080或更高。
我们坚信最好的学习是参与其中这一理念,并致力成为中文互联网上体验更好的学练一体的IT技术学习交流平台。
您可加QQ群:575806994,一起学习交流技术,反馈网站使用中遇到问题。
内容、课程、广告等相关合作请扫描右侧二维码添加好友。

狐狸教程 Copyright 2021

进入全屏