疫情数据提取

2023-10-27

基于正则表达式提取新冠疫情数据

这篇博客主要基于新冠数据进行每日新增病例与累计病例的统计

开发环境:Pycharm 2019.1.1 + python 3.7

一、数据集介绍

数据集中的数据是从2019年12月31到2019年2月28日的新闻数据。

地区信息由“provinceName”标识,其中,每个省份对应着不同的’provinceId’

原始数据属性(部分)为:

属性标签 含义
id 标识各条新闻
pubDate 新闻发布时间
title 新闻标题
summary 新闻摘要(主要内容)
infoSource 新闻来源
provinceId 地区ID
provinceName 地区名称

示例:
在这里插入图片描述

二、数据处理

  1. 数据清洗

    显然,要从新闻数据中提取湖北和全国每天的新冠肺炎的新增确诊病例数,累计确诊病例数,许多数据属性(如id, infoSource, sourceUrl)是无效的。经过筛选,其中有用的数据属性仅有’pubDate’, ‘title’, ‘summary’, ‘provinceId’ 四种。

    使用pandas进行数据清洗,完成后将数据输出为CSV文件。代码如下:

   # -*- coding:utf-8 -*-
   
   import pandas as pd
   data = pd.read_csv("DXYNews.csv", encoding="utf_8_sig",
                         usecols=['pubDate', 'title', 'summary', 'provinceId'])
   data.to_csv("DXYNews_processed.csv", index=False, encoding="utf_8_sig")

2.读取文件,数据清洗



2. #### 提取指定数据

#根据'provinceId'参数:

#'provinceId'=42 表示湖北省

# 'provinceId'=100 表示全国

# 以此为判别依据进行数据划分。完成后分别导出CSV文件

​```python
# 判定省ID,挑选出湖北省的新闻,单独输出为表格
data_hubeiprovince = pd.DataFrame(columns=['pubDate', 'title', 'summary', 'provinceId'])
data_chanese = pd.DataFrame(columns=['pubDate', 'title', 'summary', 'provinceId'])
# 筛选湖南省和全国疫情数据
# provinceId:42表示湖北, 100表示全国
for i in range(data.shape[0]):
 if data.loc[i, 'provinceId'] == 42:
     data_hubeiprovince = data_hubeiprovince.append(data.iloc[i])
 if data.loc[i, 'provinceId'] == 100:
     data_chanese = data_chanese.append(data.iloc[i])
data_hubeiprovince.to_csv("DXYNews_hubei_province.csv", index=False, encoding="utf_8_sig")
data_chanese.to_csv("DXYNews_chanese.csv", index=False, encoding="utf_8_sig")

三、正则表达式提取每天新增确诊病例数,累计确诊病例数

匹配策略:

先按标题匹配,关键词为:新增—例,累计—例 若得到匹配结果则用,若无则按内容匹配

按内容匹配时,关键词为:“新增***确诊—例”和“累计确诊—例”或“累计新冠肺炎—例”

若标题和内容中均未匹配到结果,则表明该条新闻不包含疫情数据信息,可以舍弃。如果一条新闻中包含新增病例数或累计病例数其中一种数据的话,将未被包含的那位数置零。

代码实现如下:

# -*- coding:utf-8 -*-
import re
import pandas as pd

# 匹配策略:先按标题匹配,关键词:新增***例,累计***例
#           若有结果则用,若无结果则按内容匹配
def match(datapath, outpath):
    dataNews = pd.read_csv(datapath, encoding="utf_8_sig",
                                    usecols=['pubDate', 'title', 'summary', 'provinceId'])
    data = dataNews.reindex(columns=['pubDate', 'title', 'summary', 'provinceId', 'New', 'accumulation'])

    for i in range(data.shape[0]):
        res_new_num = 0
        res_add_num = 0
        # 新增
        res_new_title = re.search(r'新增[\u4e00-\u9fa5]*[0-9]+例', data.iat[i, 1])
        if res_new_title is not None:
            res_new_num = re.search(r'[0-9]+', res_new_title.group(0)).group(0)
        else:
            res_new_summary = re.search(r'新增[\u4e00-\u9fa5]*确诊[\u4e00-\u9fa5]*[0-9]+例', data.iat[i, 2])
            if res_new_summary is not None:
                res_new_num = re.search(r'[0-9]+', res_new_summary.group(0)).group(0)
        # 累计
        res_add_title = re.search(r'累计[\u4e00-\u9fa5]*[0-9]+例', data.iat[i, 1])
        res_add_summary = re.search(r'累计[\u4e00-\u9fa50-9,]*?[确诊|新冠肺炎][\u4e00-\u9fa5]*[0-9]+例', data.iat[i, 2])
        print(res_add_summary)
        if res_add_title is not None:
            res_class = re.search(r'累计治愈出院', res_add_title.group(0))
            # 如果不是累计出院的数据则保留
            if res_class is None:
                res_add_num = re.search(r'[0-9]+', res_add_title.group(0)).group(0)
            elif res_add_summary is not None:
                res_add = re.search(r'确诊[\u4e00-\u9fa5]*[0-9]+|新冠肺炎[\u4e00-\u9fa5]*[0-9]+', res_add_summary.group(0))
                if res_add is not None:
                    res_add_num = re.search(r'[0-9]+', res_add.group(0)).group(0)
        else:
            if res_add_summary is not None:
                res_add = re.search(r'确诊[\u4e00-\u9fa5]*[0-9]+|新冠肺炎[\u4e00-\u9fa5]*[0-9]+', res_add_summary.group(0))
                if res_add is not None:
                    res_add_num = re.search(r'[0-9]+', res_add.group(0)).group(0)
        # 数据调整
        if res_new_num != 0 or res_add_num != 0:
            data.iat[i, 4] = res_new_num
            data.iat[i, 5] = res_add_num

    data_result = data.dropna(axis=0, how='any')
    data_result.to_csv(outpath, index=False, encoding="utf_8_sig")
    return data_result

数据提取后将新数据导出到CSV文件中方便查看。

四、可视化

绘制以日期为横坐标轴的折线图

注:对累计病例来讲,匹配时由于新闻中未提及而设置为0,绘制时需要将这些为零的数据从列表中剔除。尝试了几种不同的方法后,最终使用了最便捷的函数np.isin()方法进行数据剔除。

代码实现如下:

# 绘图函数
def data_draw(data, data2, data3):
    # data
    time = [datetime.strptime(d, '%Y/%m/%d %H:%M').date() for d in data.values[:, 0]]
    plt.figure(1)
    plt.subplot(3, 2, 1)
    plt.plot(time, data.values[:, 4], 'ro-', color='r', alpha=0.8, linewidth=1)
    plt.xlabel('日期')
    plt.ylabel('全国新增人数')

    data_add = data[~data['accumulation'].isin([0])]
    time_add = [datetime.strptime(d, '%Y/%m/%d %H:%M').date() for d in data_add.values[:, 0]]
    plt.subplot(3, 2, 2)
    plt.plot(time_add, data_add.values[:, 5], 'ro-', color='r', alpha=0.8, linewidth=1)
    plt.xlabel('日期')
    plt.ylabel('全国累计人数')

    # data2
    time2 = [datetime.strptime(d, '%Y/%m/%d %H:%M').date() for d in data2.values[:, 0]]
    plt.subplot(3, 2, 3)
    plt.plot(time2, data2.values[:, 4], 'ro-', color='r', alpha=0.8, linewidth=1)
    plt.xlabel('日期')
    plt.ylabel('湖北新增人数')

    data2_add = data2[~data2['accumulation'].isin([0])]
    time2_add = [datetime.strptime(d, '%Y/%m/%d %H:%M').date() for d in data2_add.values[:, 0]]
    plt.subplot(3, 2, 4)
    plt.plot(time2_add, data2_add.values[:, 5], 'ro-', color='r', alpha=0.8, linewidth=1)
    plt.xlabel('日期')
    plt.ylabel('湖北累计人数')

    # data3
    time3 = [datetime.strptime(d, '%Y/%m/%d %H:%M').date() for d in data3.values[:, 0]]
    plt.subplot(3, 2, 5)
    plt.plot(time3, data3.values[:, 4], 'ro-', color='r', alpha=0.8, linewidth=1)
    plt.xlabel('日期')
    plt.ylabel('上海新增人数')

    data3_add = data3[~data3['accumulation'].isin([0])]
    time3_add = [datetime.strptime(d, '%Y/%m/%d %H:%M').date() for d in data3_add.values[:, 0]]
    plt.subplot(3, 2, 6)
    plt.plot(time3_add, data3_add.values[:, 5], 'ro-', color='r', alpha=0.8, linewidth=1)
    plt.xlabel('日期')
    plt.ylabel('上海累计人数')

    plt.gcf().autofmt_xdate()  # 自动旋转日期标记
    plt.show()

    
if __name__ == '__main__':
    data_chanese = match("DXYNews_chanese.csv", "match_result_chanese.csv")
    data_hubei = match("DXYNews_hubei_province.csv", "match_result_HuBei.csv")
    data_shanghai = match('DXYNews_shanghai.csv', "match_result_Shanghai.csv")
    data_draw(data_chanese, data_hubei, data_shanghai)

运行结果如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

疫情数据提取 的相关文章

  • 如何删除django中级联的一对一相关模型?

    背景 我在 Django 1 8 5 中定义了以下模型 class PublishInfo models Model pass class Book models Model info models OneToOneField Publis
  • 如何将base64字符串直接解码为二进制音频格式

    音频文件通过 API 发送给我们 该文件是 Base64 编码的 PCM 格式 我需要将其转换为 PCM 然后再转换为 WAV 进行处理 我能够使用以下代码解码 gt 保存到 pcm gt 从 pcm 读取 gt 保存为 wav decod
  • Python从int到string的快速转换

    我正在用 python 求解大量阶乘 并发现当我完成计算阶乘时 需要相同的时间才能转换为字符串以保存到文件中 我试图找到一种将 int 转换为字符串的快速方法 我将举一个计算和 int 转换时间的例子 我正在使用通用的 a str a 但感
  • Python在postgresql表中查找带有单引号符号的字符串

    我需要从 psql 表中查找包含多个单引号的字符串 我当前的解决方案是将单引号替换为双单引号 如下所示 sql query f SELECT exists SELECT 1 FROM table name WHERE my column m
  • TF map_fn 或 while_loop 用于不同形状的张量列表

    我想处理不同形状的张量序列 列表 并输出另一个张量列表 考虑每个时间戳上具有不同隐藏状态大小的 RNN 就像是 输入 tf ones 1 2 2 tf ones 2 2 3 tf ones 3 2 1 输出 tf zeros 1 2 4 t
  • Tweepy StreamListener 到 CSV

    我是 python 新手 我正在尝试开发一个应用程序 使用 Tweepy 和 Streaming API 从 Twitter 检索数据并将数据转换为 CSV 文件 问题是此代码不会创建输出 CSV 文件 也许是因为我应该将代码设置为在实现例
  • 当我在 Pandas 中使用 df.corr 时,我的一些列丢失了

    这是我的代码 import numpy as np import pandas as pd import seaborn as sns import matplotlib pyplot as plt data pd read csv dea
  • 当单词以“|”分隔时如何读取文件(埃因霍温)?

    在Python中 我有一个文件 其中的单词由 例如 city state zipcode 我的文件阅读器无法区分单词 另外 我希望我的文件阅读器从第 2 行而不是第 1 行开始 如何让我的文件阅读器分隔单词 import os import
  • 登录网站并使用 python 请求下载文件

    我有一个带有 HTML 表单的网站 登录后 它会将我带到 start php 站点 然后将我重定向到overview php 我想从该服务器下载文件 当我单击 ZIP 文件的下载链接时 链接后面的地址是 getimage php path
  • 如何将 self 传递给装饰器?

    我该如何通过self key下面进入装饰器 class CacheMix object def init self args kwargs super CacheMix self init args kwargs key func Cons
  • 使用 scipy curve_fit 拟合噪声指数的建议?

    我正在尝试拟合通常按以下方式建模的数据 def fit eq x a b c d e return a 1 np exp x b c np exp x d e x np arange 0 100 0 001 y fit eq x 1 1 1
  • Apache Spark 中的高效字符串匹配

    我使用 OCR 工具从屏幕截图中提取文本 每个大约 1 5 句话 然而 当手动验证提取的文本时 我注意到时不时会出现一些错误 鉴于文本 你好 我真的很喜欢 Spark 我注意到 1 像 I 和 l 这样的字母被 替换 2 表情符号未被正确提
  • PySide6.1 与 matplotlib 3.4 不兼容

    当我只安装PySide6时 GUI程序运行良好 但是一旦我安装了matplotlib及其依赖包 包括pyqt5 则GUI程序将无法运行并输出以下错误消息 This application failed to start because no
  • 在Python中计算内存碎片

    我有一个长时间运行的进程 不断分配和释放对象 尽管正在释放对象 但 RSS 内存使用量会随着时间的推移而增加 如何计算发生了多少碎片 一种可能性是计算 RSS sum of allocations 并将其作为指标 即便如此 我该如何计算分母
  • Python多处理错误“ForkAwareLocal”对象没有属性“连接”

    下面是我的代码 我面临着多处理问题 我看到这个问题之前已经被问过 我已经尝试过这些解决方案 但它似乎不起作用 有人可以帮我吗 from multiprocessing import Pool Manager Class X def init
  • django-admin.py makemessages 不起作用

    我正在尝试翻译一个字符串 load i18n trans Well Hello there how are you to Hola amigo que tal 我的 settings py 文件有这样的内容 LOCALE PATHS os
  • PyTorch DataLoader 对并行运行的批次使用相同的随机种子

    有一个bug https tanelp github io posts a bug that plagues thousands of open source ml projects 在 PyTorch Numpy 中 当并行加载批次时Da
  • 在 Sphinx 中,有没有办法在声明参数的同时记录参数?

    我更喜欢在声明参数的同一行记录每个参数 根据需要 以便应用D R Y http en wikipedia org wiki Don t repeat yourself 如果我有这样的代码 def foo flab nickers a ser
  • 更改 Python Cmd 模块处理自动完成的方式

    我有一个 Cmd 控制台 设置为自动完成 Magic the Gathering 收藏管理系统的卡牌名称 它使用文本参数在数据库中查询卡片 并使用结果自动完成 建议卡片 然而 这些卡片名称有多个单词 Cmd 会从last到行尾的空间 例如
  • 长/宽数据到宽/长

    我有一个数据框 如下所示 import pandas as pd d decil 1 decil 1 decil 2 decil 2 decil 3 decil 3 decil kommune AA BB AA BB AA BB 2010

随机推荐

  • VUE加解密MD5、RSA(分段)、AES(SHA1PRNG)

    md5方法 使用 crypto js 1 安装 npm install crypto js 2 引用 import CryptoJS from crypto js 3 加密 let md5 CryptoJS MD5 test toStrin
  • k8s 1.26.3 安装--使用containerd

    机器准备 或虚拟机 三台机器 一 环境准备 1 三台机器分别设置主机名 hostnamectl set hostname master hostnamectl set hostname node2 hostnamectl set hostn
  • 05-----Qt应用程序在windows和Linux操作系统下的打包发布

    1 介绍 对于发布程序 我们最常用的就是获取release版本的exe后 拷贝对应的动态库然后发布 但是QT下我们可以使用相关软件代替 它能帮我们找到该exe所需的动态库文件 下面我们直接参考以下文章即可 非常详细 很不错 所以我觉得没必要
  • 时间戳转化

    1 自定义时间戳转化 2 使用Moment js JavaScript 日期处理类库 地址如下 Moment js 中午网
  • 主从复制报错Fatal error:The slave I/O thread stops because master and slave have equal MySQL server UUIDs;

    异常 在MySQL中开启主从复制失败 原因 先确定主机和从机的server id是否不一样 如果一样也会导致主从复制失败 主机和从机的server id在 etc my cnf配置文件中配置的 下面的结果不一致说明不是server id的问
  • Ubuntu系统下安装rpm安装包

    目录 前言 方法 前言 Ubuntu的软件包格式为deb 而RPM格式的包归属于红帽子Red Hat 在这直接使用命令是安装不了的 需要通过一个桥梁进行转换 方法 将其rpm的格式包转换为deb的格式包 具体转换通过alien进行转换 这个
  • 华为OD机试 Python 【分割数组的最大差值】

    题目 给你一个整数数组 尝试将其分成两部分 左边和右边 然后分别求它们的和 你能找到一种切分方式 使得两边和的差的绝对值最大吗 输入 第一行是一个整数n 表示数组中的元素数量 其中 1 lt n 100000 第二行包含n个整数 它们组成了
  • 一个集成的BurpSuite漏洞探测插件1.2

    4 DNSLog查询漏报 注 扫描结束后才会在BurpSuite的Target Dashboard模块显示高危漏洞 进程扫描中无法进行同步 但可以在插件中查看 涉及到DoPassive方法问题
  • Ninth season twelfth episode,Phoebe fed a bunch of rats!!!!!!

    Scene Coffee place Joey is there Chandler is entering Chandler Hey Joey Hey So where s Mon Chandler Oh she s at home put
  • Keil报错:cannot open source input file “core_cmInstr.h“ 解决办法

    文章目录 前言 参考资料 历史精选文章 前言 前几天在面包板社区申请了一块uFun开发板 昨天刚到手 在烧录Demo程序的时候遇到一个问题 就是Keil打开工程 编译 报很多错误cannot open source input file c
  • Angular 4.x Forms patchValue and setValue

    在 Angular 4 x 中有多种方式可以更新表单的值 对于使用响应式表单的场景 我们可以通过框架内部提供的 API 如 patchValue 和 setValue 方便地更新表单的值 这篇文章我们将介绍如何使用 patchValue 和
  • J-link烧录MCU镜像文件

    1 使用范围 本文档基于NXP M4芯片 介绍MCU镜像文件烧录流程以及在烧录过程中遇到的问题 2 烧录步骤2 1 资源准备 烧录前需准备MCU镜像文件 镜像文件一般由Keil工具 SylixOS IDE工具或者其他工具生成 本文档以Kei
  • 读写分离与分库分表,涉及sharding-JDBC、sharding-sphere、停机迁移和双写方案、分布式id

    一 读写分离 1 1 何为读写分离 读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上 这样的话 就能够小幅提升写性能 大幅提升读性能 一主多从 也就是一台主数据库负责写 其他的从数据库负责读 主库和从库之间会进行数据同步 以保
  • ERP管理系统的权限控制实现--shiro

    1 Shiro基本原理分析 Authentication 身份认证 登录 验证用户是不是拥有相应的身份 Authorization 授权 即权限验证 验证某个已认证的用户是否拥有某个权限 即判断用户是否能做事情 常见的如 验证某个用户是否拥
  • 用Java Socket开发小型服务器,支持上千个并发

    Java Socket 套接字 socket 为两台计算机之间的通信提供了一种机制 在James Gosling注意到Java 语言之前 套接字就早已赫赫有名 该语言只是让您不必了解底层操作系统的细节就能有效地使用套接字 1 客户机 服务器
  • 质因数分解

    找出最小的质数 与它相乘的就是最大的质数 include
  • Django中基于FBV和CBV的免除或开启csrf验证

    一 全局crsf验证开启 但希望某函数或方法豁免验证 1 基于FBV免除某个函数csrf验证的步骤 1 1 在settings的中间件 添加csrf验证全局验证 默认都已经添加 1 2 导入 django views decorators
  • Qt信号槽的几种写法

    信号槽是Qt的核心部分 它使得对象之间的的通信变得很简单 Qt通过connect来连接信号与槽 当信号被发出时 槽函数立刻被执行 connect函数有五个重载 重载1 QMetaObject Connection connect const
  • Linux修改密码

    Linux修改密码用 passwd 命令 用root用户运行passwd passwd user name可以设置或修改任何用户的密码 普通用户运行passwd只能修改它自己的密码 root localhost passwd 修改root用
  • 疫情数据提取

    基于正则表达式提取新冠疫情数据 这篇博客主要基于新冠数据进行每日新增病例与累计病例的统计 开发环境 Pycharm 2019 1 1 python 3 7 一 数据集介绍 数据集中的数据是从2019年12月31到2019年2月28日的新闻数