Python新冠疫情案例_02处理疫情数据中的异常以及丢失的数据

简介: Python新冠疫情案例_02处理疫情数据中的异常以及丢失的数据
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['Microsoft YaHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
from datetime import datetime
plt.figure(figsize=(16,10))
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker
from pyecharts.charts import Bar
import os
from pyecharts.options.global_options import ThemeType

读取整理好的数据:

alldfgbcountrysum=pd.read_csv("alldfgbcountrysum.csv",encoding='utf-8-sig')

将时间转换成datetime64[ns]

alldfgbcountrysum['Date']=pd.to_datetime(alldfgbcountrysum['Date']).dt.normalize()

绘制初始图像:

alldfgbcountrysum[['Confirmed','Date']].set_index(['Date']).plot(figsize=(20,12)) 

60ecbdcc64d44a8c9d283ee9a347a850.png46e769b350904a5d880ee2889621d7fc.png

解决异常数据以及数据丢失的问题

allDate=alldfgbcountrysum.copy()
allDate=allDate.groupby(['Date'])['Confirmed','Deaths','Recovered'].sum()
#对每天所有的确诊人数,死亡人数,治愈人数进行汇总求和
allDate=allDate.reset_index().replace()
allDate

5f8499d3611c47ccb282b8318e4218cc.png

数据当中日期的第一天:2020-2-24

数据当中日期的最后一天:2022-3-12


分析:

由于数据当中日期的第一天是:2020-2-24,从2020-2-25开始循环。24号是前一天,25号是当天,26号是后一天。

前一天确诊人数:bedata 当天确诊人数:data 后一天确诊人数:afdata


只要前一天的数据比当天的小,就说明是正常的,反之则异常,就进入循环。


异常数据当中的凸起部分:放大观察发现,异常数据是由两部分凸起组成,且第一小段的凸起大于第二小段。每小段凸起都是由一段数据构成的,在每小段凸起当中,数据仍然是增长的。

d4a8613240ef4463a49d9b27db7f28f9.png


  1. strftime()函数:如果已经有了datetime对象,要把它格式化为字符串显示给用户,就需要转换为str,转换方法是通过strftime()实现。
  2. Timestamp:时间戳,指1970年01月01日00时00分00秒起至现在的总秒数。
  3. datetime.timedelta对象代表两个时间之间的时间差,两个date或datetime对象相减就可以返回一个timedelta对象。如果有人问你昨天是几号,这个很容易就回答出来了。但是如果问你200天前是几号,则使用Python中datetime模块中的timedelta可以给出答案。
  4. datetime.date: 表示日期的类
  5. datetime.date():来比较两个日期(天数),这样可以截断datetime,使其具有天数而不是小时的分辨率。
  6. drop:使用drop删除表中的某一行或者某一列,它不改变原有的df中的数据,而是返回另一个dataframe来存放删除后的数据。
import datetime
start=datetime.date(2020,2,25) 
last=datetime.date(2022,3,12)
datalist=[] # 用来存放异常数据
for i in range((last-start).days+1):
    day=start+datetime.timedelta(days=i)# 类似一个计数器,随着循环不断增加天数。
    # 前一天
    bedata=allDate[allDate['Date']==pd.Timestamp(str(day+datetime.timedelta(days=-1)))]['Confirmed'].sum()
    # 当天
    data=allDate[allDate['Date']==pd.Timestamp(str(day))]['Confirmed'].sum()
    # 后一天
#     afdata=allDate[allDate['Date']==pd.Timestamp(str(day+datetime.timedelta(days=1)))]['Confirmed'].sum()
    # 判断数据是否异常
    if(bedata>data):# 第一次进入这个条件判断是在第一个凸起与第二个凸起交界处,因为第二个凸起比第一个凸起小
        if(bedata/2<data) & (bedata>data): # 凸出来的部分,向前找异常数据
            j=-1     
            while allDate[allDate['Date']==pd.Timestamp(str(day+datetime.timedelta(days=j)))]['Confirmed'].sum()>data:
# 此时前一天的数据大于当天的数据,进入while循环。循环的作用:找出从哪天开始,数据比当天的数据要小,则从那天开始数据就是正常的,而之间的数据就都是异常数据,把异常数据保存在datalist列表里面。
                datalist.append(str(day+datetime.timedelta(days=j))) # 把异常数据变成字符串类型并且保持到列表              
                j-=1.               
        else: #进入else说明这部分异常数据是下凹的数据,向后找异常数据
            m=0 
            print(day+datetime.timedelta(days=-1))# 打印
            while bedata>allDate[allDate['Date']==pd.Timestamp(str(day+datetime.timedelta(days=m)))]['Confirmed'].sum():
                datalist.append(str(day+datetime.timedelta(days=m)))
                m+=1 
print(datalist)
allDate['Date']=allDate['Date'].apply(lambda x:x.strftime('%Y-%m-%d')) # 将Date中的数据都变成字符串类型
for i in allDate['Date']:
    if str(i) in datalist:
        print(i)
        allDate.drop(index=allDate[allDate['Date']==i].index[0],inplace=True) # 将原始数据当中包含有datalist元素的都删除

得到的结果(也就是找到的异常数据):

2021-12-14
['2021-06-13', '2021-06-12', '2021-06-24', '2021-07-09', '2021-07-08', '2021-07-07', '2021-07-06', '2021-07-05', '2021-07-04', '2021-07-03', '2021-07-02', '2021-07-01', '2021-06-30', '2021-06-29', '2021-06-28', '2021-06-27', '2021-09-05', '2021-12-15', '2022-01-22', '2022-02-09', '2022-02-16', '2022-02-15', '2022-03-01', '2022-02-28', '2022-02-27', '2022-03-07', '2022-03-10']
2021-06-12
2021-06-13
2021-06-24
2021-06-27
2021-06-28
2021-06-29
2021-06-30
2021-07-01
2021-07-02
2021-07-03
2021-07-04
2021-07-05
2021-07-06
2021-07-07
2021-07-08
2021-07-09
2021-09-05
2021-12-15
2022-01-22
2022-02-09
2022-02-15
2022-02-16
2022-02-27
2022-02-28
2022-03-01
2022-03-07
2022-03-10
allDate=allDate.sort_values(by='Date')
import os
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.options.global_options import ThemeType
attrmax=allDate['Date']
v1=allDate['Confirmed']
bar=(Bar(
            init_opts=opts.InitOpts(bg_color='rgba(255,250,200,0.2)',
                                   width='1500px',
                                   height='800px',
                                   page_title='疫情数据',
                                   theme=ThemeType.ROMA
            )
        )
     .add_xaxis(attrmax.to_list())
     .add_yaxis("人数",v1.to_list(),stack='stack1')
     .set_global_opts(title_opts=opts.TitleOpts(title="世界疫情数据"),
                     xaxis_opts=opts.AxisOpts(name='日期',axislabel_opts={"rotate":50}),
                     yaxis_opts=opts.AxisOpts(name='确诊人数:人'))
     .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
     )
bar.render_notebook()
55ae89644d3e4ba7a1bc87f5dd013879.png


相关文章
|
7天前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
16 1
|
8天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
8天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
20天前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
48 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
|
7天前
|
索引 Python
SciPy 空间数据1
SciPy 通过 `scipy.spatial` 模块处理空间数据,如判断点是否在边界内、计算最近点等。三角测量是通过测量角度来确定目标距离的方法。多边形的三角测量可将其分解为多个三角形,用于计算面积。Delaunay 三角剖分是一种常用方法,可以对一系列点进行三角剖分。示例代码展示了如何使用 `Delaunay()` 函数创建三角形并绘制。
15 0
|
1天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
1天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
3天前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
2天前
|
机器学习/深度学习 存储 算法
探索Python编程:从基础到高级应用
【10月更文挑战第38天】本文旨在引导读者从Python的基础知识出发,逐渐深入到高级编程概念。通过简明的语言和实际代码示例,我们将一起探索这门语言的魅力和潜力,理解它如何帮助解决现实问题,并启发我们思考编程在现代社会中的作用和意义。
|
1天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!