城市设计/数据分析/技术分享/摄影记录

0%

新冠病毒疫情分析学习02-按日期/区域做数据提取

按日期/区域做数据提取

什么是时间序列?

在本次的案例数据中,有一个字段date记录了疫情数据记录的日期,例如我们把重庆市的数据单独拿出来看:

区域编码 省市 疑似 确诊 死亡 date
500000 重庆市 13 9 0 20200122
500000 重庆市 71 27 0 20200123
500000 重庆市 86 57 0 20200124
500000 重庆市 146 75 0 20200125
500000 重庆市 188 110 0 20200126
500000 重庆市 219 132 0 20200127
500000 重庆市 246 147 0 20200128
500000 重庆市 279 165 0 20200129
500000 重庆市 378 206 0 20200130
500000 重庆市 408 238 1 20200131

我们首先查看date的字段类型

1
2
3
4
5
6
7
# 举例1 
# 读取数据
import pandas as pd
df = pd.read_excel('${ohstudy}/nCov/data_ncov.xlsx')

# 查看字段类型
df['date'].dtype

输出结果为:

1
dtype('int64')

知识点:
df['date'],这里是单列索引的代码写法,单列索引之后的结果为Series;
多列索引为df[['列名1', '列名2', ...]],例如df[['省市','确诊','date']],多列索引之后的结果为DataFrame

pandas.Sereis.dtype,用于查看Series的数据类型
pandas.Sereis.astype(),用于转换Series的数据类型,为了方便学习,大家可以先记以下3中数据类型的转换写法
df['字段名'].astype('str')
df['字段名'].astype('float')
df['字段名'].astype('int')

字符串并不是时间信息最佳的存储方式,我们需要将其转化为时间序列数据,转化方法为:
pandas.to_datetime(),作用是转化为时间序列数据


具体写法如下:

1
2
3
4
5
6
7
8
9
10
# 举例2
# 时间序列转换
df['date'] = df['date'].astype('str') # 先将字段转化为字符串
df['date'] = pd.to_datetime(df['date']) # 再进行时间序列转换

# 再次查看数据基本情况,可以看到date字段类型不再是int64
df.info()

# 再次输出前5行数据,可以看到date字段显示方式不一样了
df.head()

输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 544 entries, 0 to 543
Data columns (total 6 columns):
区域编码 544 non-null int64
省市 544 non-null object
疑似 544 non-null int64
确诊 544 non-null int64
死亡 544 non-null int64
date 544 non-null datetime64[ns]
dtypes: datetime64[ns](1), int64(4), object(1)
memory usage: 25.6+ KB

区域编码 省市 疑似 确诊 死亡 date
0 500000 重庆市 13 9 0 2020-01-22
1 500000 重庆市 71 27 0 2020-01-23
2 500000 重庆市 86 57 0 2020-01-24
3 500000 重庆市 146 75 0 2020-01-25
4 500000 重庆市 188 110 0 2020-01-26

我们也可以写成一行

# 一行的写法
df['date'] = pd.to_datetime(df['date'].astype('str'))

为什么需要时间数据?

时间数据是可以按照年、月、日、时、分、秒进行聚合运算的,这可以让细碎的一眼看上去无规律的数据整理成有规律的统计数据。

有了时间数据,数据更适合研究一段时间内的变化,从而跳脱“静态数据”的牢笼,进行动态数据可视化。

有了时间数据还可能做一些更深的数据挖掘,比如时间序列分析等。

总的来说,字符串、数值、时间是三种不同的数据大类,做数据分析前一定要确定每种类型的数据是否已经符合清洗要求。

按日期提取数据

如果现在需要筛选2020-2-1日的数据,这个需求本质上不再是列索引而是行索引,且这里是判断索引,代码写法如下:

# 举例3
# 提取2020-2-1日的数据
data_0201 = df[df['date'] == '2020-2-1']
data_0201.head()

输出结果为:

区域编码    省市    疑似    确诊    死亡    date
10    500000    重庆市    425    262    1    2020-02-01
26    330000    浙江省    207    661    0    2020-02-01
42    530000    云南省    261    99    0    2020-02-01
58    650000    新疆维吾尔族自治区    21    21    0    2020-02-01
74    810000    香港特别行政区    0    14    0    2020-02-01

知识点
由于我们已经把date字段改成了时间序列,所以这里可以用多种写法来提取2020-2-1日的数据,大家可以自己动手试试
df[df['date'] == '2020-2-1']
df[df['date'] == '20200201']
df[df['date'] == '2020/2/1']


按地区提取数据-判断索引逻辑

如何提取“上海市”、“湖北省”的数据?

# 举例4
# 提取湖北省数据
data_hb = df[df['省市'] == '湖北省']

# 提取上海市数据
data_sh = df[df['省市'] == '上海市']

data_hb.head()
#date_sh.head()

按地区提取数据-汇总统计逻辑

分别提取”全国”、”非湖北省”的数据,需要对现有数据做统计分析求和。

“全国”数据,这里应该是按照date字段做求和,代表不同日期的全国疫情情况
“非湖北省”数据,这里我们应该分2步
省市字段先做判断,筛选非湖北省的其他数据
按照date字段做求和

# 举例5
# 提取全国数据
data_china = df.groupby('date')[['疑似','确诊','死亡']].sum()

# 提取非湖北省数据
data_nothb_all = df[df['省市'] != '湖北省']
data_nothb = data_nothb_all.groupby('date')[['疑似','确诊','死亡']].sum()

data_china.head()
#data_nothb.head()

知识点
pandas.DataFrame.groupby(),非常常用的数据分析函数,他的作用是:

根据某些条件将数据拆分成组
对每个组独立应用函数
将结果合并到一个数据结构中
特别注意的是pandas.DataFrame.groupby()函数只做数据的分组,不做计算,一般不会单独出现,而是在后方会跟上一个聚合函数进行计算,例如这里的df.groupby('date')[['疑似','确诊','死亡']].sum()


可以跟着步骤练习一下,有疑问可评论

吃颗糖
  • 本文作者: Erek
  • 本文链接: https://erek.top/2020/002-xg/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!