您的位置:首页 > 其它

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

2020-07-31 10:37 615 查看

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

数据来自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
key1 key2 A B C D
0 2019 10 A0 B0 C0 D0
1 2020 11 A1 B1 C1 D1
2 2021 12 A2 B2 C2 D2
3 2022 13 A3 B3 NaN NaN
4 2023 13 NaN NaN C3 D3
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
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
country 中国 中国 中国 中国 中国 中国 中国 中国 中国 中国 中国 中国 中国 中国 中国
province NaN 湖北省 广东省 北京市 吉林省 上海市 浙江省 安徽省 江西省 山东省 广西壮族自治区 海南省 四川省 贵州省 云南省
2019-12-01 0 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2019-12-02 0 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2019-12-03 0 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2020-07-26 4659 4512 8 9 2 7 1 6 1 7 2 6 3 2 2
2020-07-27 4663 4512 8 9 2 7 1 6 1 7 2 6 3 2 2
2020-07-28 4664 4512 8 9 2 7 1 6 1 7 2 6 3 2 2
2020-07-29 4665 4512 8 9 2 7 1 6 1 7 2 6 3 2 2
2020-07-30 4665 4512 8 9 2 7 1 6 1 7 2 6 3 2 2

245 rows × 15 columns

用到的其他参考:

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

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

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

原始 样式

启动插件1

启动插件1后效果:

启动插件2

启动插件2后效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐