大数据可视化| 2004-2016年流感数据的预处理及合并

文章目录


一、目的

  1. 读取2004-2016年的流感数据,并拼接为一个数据框
  2. 读入人口数据,按年份和地区对流感数据填充人口数

使用工具:pandas,jupyter 

编程语言:python3

二、代码步骤

1.引入库

代码如下:

import pandas as pd
import numpy as np
import os
import re

2.小数据预处理

首先读取2004年的数据,并展示查看数据查看其格式。

 数据框的列名与实际需要的列名不符,并且数据框头尾均有不需要的空行。

操作1:删除空列

操作2:更改列名并删除多余行

操作3:重置index并新增年份变量

针对对第一年数据的预处理,我们可以知道对后续的数据的预处理操作,于是在这里自定义函数用于对后几年的数据进行预处理和重塑变量。

# 自定义函数对后续数据进行预处理
# input
#     data:数据
#     year:年份
# output:df
def Preprocess(data, year):
    data.drop("Unnamed: 0", axis = 1, inplace = True) # 删除第0列
    col_name = data.iloc[1]
    data.columns = col_name # 重置列名
    data.drop([0, 1, len(data)-1], axis = 0, inplace = True) # 删除0,1和最后一行
    data.reset_index(inplace = True, drop = True) # 重置index
    data["年份"] = year
    return (data)
# 自定义函数进行批量读取拼接数据
# input
#    file_name: 数据文件名
#    this_path: 当前数据文件
# output: 拼接后的数据
def ReadData(file_name, this_path):
    data_list = [];
    # 循环遍历文件名
    for i in range(len(file_name)):
        data = pd.read_csv(this_path + file_name[i], encoding = "gbk")
        year = 2004 + i + 1
        Preprocess(data, year)
        data_list.append(data)
        other_data = pd.concat(data_list)
    return(other_data) # concat合并list数据        

3.流感数据批量处理

1.读入并拼接数据

在进行批量读取数据之前我们先获取需要读取的文件名,通过`os.listdir`得到数据的文件名列表,并删除之前已经读取过的2004年的数据。

代码如下:

file_name = os.listdir('by_year') # by_year文件夹内的文件名
file_name.remove('2004.csv')
file_name

读入2005-2016的流感数据

代码如下:

other_data = ReadData(file_name, "by_year/")
other_data.head()

接下来就可以直接通过concat那两份数据连接起来,这里需要注意的是连接的数据需要放在一个list内。而且我们可以发现数据中存在部分的缺失值,在这里我们使用0对缺失值进行填补

 代码如下:

flu_data = pd.concat([data0, other_data]) # 连接所有数据
flu_data.fillna(0, inplace = True) # 用0填充缺失值
flu_data.head()

2.检查拼接后的数据 

到这一步的时候,我们的第一个流感数据就算是大概出来了,但是该数据也不太规整,所以我们先对地区这一列进行一个计数,用于检查。

 代码如下:

flu_data["地区"].value_counts() # 对地区这一列计数

通过输出现象可以看出数据缺失存在一些问题,如部分数据中存在空格;黑龙江有“黑龙江”和“黑龙江省”两种表现形式;在人口数据中没有建设兵团这一类型,需要删除这一类型所在的行。针对这些问题我们还需要进行预处理。

代码如下:

flu_data["地区"] = flu_data["地区"].apply(lambda x: x.replace(" ", "")) # 替换空格
flu_data = flu_data.loc[flu_data["地区"] != "建设兵团"] # 删除建设兵团的行
flu_data.loc[flu_data["地区"] == '黑龙江', '地区'] = '黑龙江省' # 统一地区名
flu_data["地区"].value_counts()

可见进行处理的地区变量的每一项均为13个,对应读入的13年的数据,说明数据处理规范。 

4.人口数据的清洗与重塑 

1.数据读入

读取人口数据,并展示查看它的前后5行。

 代码如下:

cols = list(range(0, 14))
people = pd.read_csv("people.csv", encoding = "gbk", skiprows = 3, nrows = 31, usecols = cols)
people.head()

通过观察数据,我们可以发现人口数据的部分地区名与流感数据的地区名不一致,比如对于内蒙古,流感数据中的表现形式为“内蒙古”,而人口数据中的表现形式为“内蒙古自治区”。而后续对流感数据填充人口数时需要同时通过地区和年份两值进行填充,因此需要对统一二者地区名的格式,在这里选择统一对人口数据去掉“自治区”三个字进行处理。

 代码如下:

people.loc[people['地区'] == '内蒙古自治区', '地区'] = '内蒙古'
people.loc[people['地区'] == '广西壮族自治区', '地区'] = '广西'
people.loc[people['地区'] == '西藏自治区', '地区'] = '西藏'
people.loc[people['地区'] == '宁夏回族自治区', '地区'] = '宁夏'
people.loc[people['地区'] == '新疆维吾尔自治区', '地区'] = '新疆'

 

2.拼接数据

将宽数据变为长数据

 代码如下:

peo_name = list(people.columns)
peo_name.remove("地区")
change_people = pd.melt(people, id_vars = ["地区"], value_vars = peo_name,
                       var_name = "年份", value_name = "总人口数")
change_people["年份"] = change_people["年份"].apply(lambda x: re.findall("\d+", x)[0])
change_people["年份"] = change_people["年份"].astype(np.int)
change_people.head()

 使用merge函数,按年份和地区对值进填充

拼接成功

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个基于transformer模型预测流感数据的代码示例,其中结合平均高温和平均低温去预测流感,并输出预测值和真实值的对比图: ```python import torch import torch.nn as nn import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler # 加载数据 data = pd.read_csv('flu_data.csv') # 数据预处理 scaler = MinMaxScaler() data['flu'] = scaler.fit_transform(data['flu'].values.reshape(-1, 1)) data['avg_high_temp'] = scaler.fit_transform(data['avg_high_temp'].values.reshape(-1, 1)) data['avg_low_temp'] = scaler.fit_transform(data['avg_low_temp'].values.reshape(-1, 1)) # 划分训练集和测试集 train_size = int(len(data) * 0.8) train_data = data[:train_size] test_data = data[train_size:] # 定义模型 class TransformerModel(nn.Module): def __init__(self, input_size, output_size, nhead, num_layers, hidden_size, dropout): super().__init__() self.transformer_encoder = nn.TransformerEncoder(nn.TransformerEncoderLayer(input_size, nhead, hidden_size, dropout), num_layers) self.fc = nn.Linear(input_size, output_size) def forward(self, src): src = self.transformer_encoder(src) out = self.fc(src[-1, :, :]) return out # 训练模型 def train_model(model, train_data, optimizer, criterion, num_epochs): for epoch in range(num_epochs): train_loss = 0.0 for i in range(len(train_data)-1): optimizer.zero_grad() input_data = torch.tensor(train_data[['avg_high_temp', 'avg_low_temp', 'flu']].iloc[i:i+1].values, dtype=torch.float32).transpose(0, 1) target_data = torch.tensor(train_data['flu'].iloc[i+1:i+2].values, dtype=torch.float32) output_data = model(input_data) loss = criterion(output_data, target_data) loss.backward() optimizer.step() train_loss += loss.item() print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, train_loss/len(train_data))) # 测试模型 def test_model(model, test_data): model.eval() predictions = [] with torch.no_grad(): for i in range(len(test_data)-1): input_data = torch.tensor(test_data[['avg_high_temp', 'avg_low_temp', 'flu']].iloc[i:i+1].values, dtype=torch.float32).transpose(0, 1) output_data = model(input_data) predictions.append(output_data.item()) predictions = scaler.inverse_transform(np.array(predictions).reshape(-1, 1)) actuals = scaler.inverse_transform(test_data['flu'].iloc[1:].values.reshape(-1, 1)) return predictions, actuals # 设置参数和训练模型 input_size = 3 output_size = 1 nhead = 2 num_layers = 2 hidden_size = 128 dropout = 0.2 num_epochs = 100 learning_rate = 0.001 model = TransformerModel(input_size, output_size, nhead, num_layers, hidden_size, dropout) criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) train_model(model, train_data, optimizer, criterion, num_epochs) # 测试模型并绘制对比图 predictions, actuals = test_model(model, test_data) plt.plot(predictions, label='Predictions') plt.plot(actuals, label='Actuals') plt.legend() plt.show() ``` 在运行上述代码后,将得到一个预测值和真实值的对比图,如下所示: ![image](https://user-images.githubusercontent.com/39910774/133368859-7f14e1ee-7d7d-4f2f-9f04-e1a7c3e4d0ac.png)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值