按日期/区域做数据提取
什么是时间序列?
在本次的案例数据中,有一个字段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
# 读取数据
import pandas as pd
df = pd.read_excel('${ohstudy}/nCov/data_ncov.xlsx')
# 查看字段类型
df['date'].dtype
输出结果为:
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()
,作用是转化为时间序列数据
具体写法如下:
# 举例2
# 时间序列转换
df['date'] = df['date'].astype('str') # 先将字段转化为字符串
df['date'] = pd.to_datetime(df['date']) # 再进行时间序列转换
# 再次查看数据基本情况,可以看到date字段类型不再是int64
df.info()
# 再次输出前5行数据,可以看到date字段显示方式不一样了
df.head()
输出结果为:
<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/archives/11.html
转载时须注明出处及本声明
good
OωO