疫情数据可视化01---中国疫情时间序列数据整理(截至7月30号)

中国疫情时间序列数据整理

数据来自Github By canghailan;参考和鲸社区(kesci)数据集 COVID-19 of China from 21 by WXK

## 导入库
import warnings
warnings.filterwarnings('ignore')
import pandas as pd 

解决问题1: 如何读入 243 天的文件

分析: 每个文件都是用日期命名的,则考虑是否有时间的相关 类 ,直接处理日期

参考: Python 生成日期列表
只需要修改原函数的 print 为 return 即可 原因如下 print出来的东西没有类型 Nonetype 只能显示,不能处理,这里return会的是List数据类型,后面可以直接根据索引生成文件名

## 生成时间序列 后面加 .CSV 用于读取数据
import datetime
def create_assist_date(datestart = None,dateend = None):
	# 创建日期辅助表

	if datestart is None:
		datestart = '2016-01-01'
	if dateend is None:
		dateend = datetime.datetime.now().strftime('%Y-%m-%d')

	# 转为日期格式
	datestart=datetime.datetime.strptime(datestart,'%Y-%m-%d')
	dateend=datetime.datetime.strptime(dateend,'%Y-%m-%d')
	date_list = []
	date_list.append(datestart.strftime('%Y-%m-%d'))
	while datestart<dateend:
		# 日期叠加一天
	    datestart+=datetime.timedelta(days=+1)
	    # 日期转字符串存入列表
	    date_list.append(datestart.strftime('%Y-%m-%d'))
	return date_list

## 调用函数,生成时间文件名列表
time_list = list(create_assist_date("2019-12-01","2020-07-30")) ## 分别为 起始日期和终止日期
##
i = 0
data_temp = {}  ## 声明空间,用 “[]” 时候会报错,因为先声明空列表,后用0索引复制 无效
for item in time_list:
    data_temp[i] = pd.read_csv(item+".csv")
    data_temp[i] = data_temp[i][data_temp[i]["country"]=="中国"]
    i=i+1
data_1 = pd.concat(data_temp , ignore_index=1)  ## 相同字段的表首尾相接,重排index
data_1.drop_duplicates(subset=["date","country","province","city"], keep='first', inplace=True)
data_1.to_csv("中国省市疫情数据-总.csv",encoding='utf_8_sig') ## 不加encoding 有时候会出现中文乱码

## 查看
print(
    "data_temp 变量的 数据类型为:",type(data_temp),
    "\ndata_temp 键值为:",data_temp.keys(),
)

data_temp 变量的 数据类型为: <class 'dict'> 
data_temp 键值为: dict_keys([0, 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, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242])

解决问题2:整理成时序数据,每行为一个省,每列为一个日期,四个表,分表表示 [confirmed],[suspected] ,[cured],[dead]

分析:

参考:pandas中DataFrame 数据合并,连接(merge,join,concat)
借助 pandas 的 pd.merge合并每日数据,key为省份和城市,这样就可以合成 矩阵数据集,及每行为城市,每列为日期,疑似、确诊、治愈、死亡 各做一个表

## 使用举例
a = pd.DataFrame({'key1': ['2019', '2020', '2021', '2022'],
                     'key2': ['10', '11', '12', '13'],
                      'A': ['A0', 'A1', 'A2', 'A3'],
                      'B': ['B0', 'B1', 'B2', 'B3']})

b = pd.DataFrame({'key1': ['2019', '2020', '2021', '2023'],
                       'key2': ['10', '11', '12', '13'],
                       'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})
 
c = [a,b] 
result = a.merge(c[1], how='outer', on=['key1', 'key2'])
result
key1key2ABCD
0201910A0B0C0D0
1202011A1B1C1D1
2202112A2B2C2D2
3202213A3B3NaNNaN
4202313NaNNaNC3D3
for need_key in ["confirmed","suspected","cured","dead"]:
  
    data_temp = {}  ## 声明空间,用 “[]” 时候会报错,搞不懂为什么,最后生成的都是列表类型
    i = 0  
    
    for item in time_list:
        data_temp[i] = pd.read_csv(item+".csv")
        data_temp[i] = data_temp[i][data_temp[i]["country"]=="中国"]
        
        temp = data_temp[i]


        temp = temp[["country","province",need_key]]
        temp.rename(columns={ need_key :time_list[i] },inplace=True)
        # while i > 0
        if i == 0:
            data_2_province = temp
        else:
            data_2_province = data_2_province.merge(temp, how='outer', on=['country','province'])
            data_2_province.drop_duplicates(subset=["country","province"], keep='first', inplace=True)  
            ### 重要,否则内存 迅速增长,电脑内存瞬间99% 直接卡死
            ## subset必须设置,如果选择none(即全列作为匹配值),同样占满内存
        i=i+1
    data_2_province.reset_index(drop=True, inplace=True)
    data_2_province.to_csv("1_"+ str(need_key) + ".csv",encoding='utf_8_sig')
data_2_province.head(15).T
01234567891011121314
country中国中国中国中国中国中国中国中国中国中国中国中国中国中国中国
provinceNaN湖北省广东省北京市吉林省上海市浙江省安徽省江西省山东省广西壮族自治区海南省四川省贵州省云南省
2019-12-0100NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2019-12-0200NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2019-12-0300NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
................................................
2020-07-26465945128927161726322
2020-07-27466345128927161726322
2020-07-28466445128927161726322
2020-07-29466545128927161726322
2020-07-30466545128927161726322

245 rows × 15 columns

用到的其他参考:
  1. python——修改Dataframe列名的两种方法
  2. Pandas之drop_duplicates:去除重复项
  3. pandas 之 to_csv 保存数据出现中文乱码问题及解决办法
  4. Pandas DataFrame的index重新排列

源数据文件均可在GitHub和鲸社区找到,文首已经当好地址,如果如果需要整理之前的源数据文件以及整理之后的数据文件,可在评论区留下 邮箱

附: 在vscode中,优雅的显示csv文件:

原始 样式

image-20200731103058039

启动插件1 image-20200731103157250

启动插件1后效果:

image-20200731103241999

启动插件2 image-20200731103258619

启动插件2后效果:

image-20200731103344882

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北极星~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值