├── prediction_results.png ├── model ├── __pycache__ │ └── model.cpython-37.pyc └── model.py ├── utils ├── __pycache__ │ └── data_loader.cpython-37.pyc └── data_loader.py ├── eval.py ├── plot.py ├── main.py ├── train.py ├── README.md ├── all.py └── data └── temps.csv /prediction_results.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mirror30z/Temperature-forecast/HEAD/prediction_results.png -------------------------------------------------------------------------------- /model/__pycache__/model.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mirror30z/Temperature-forecast/HEAD/model/__pycache__/model.cpython-37.pyc -------------------------------------------------------------------------------- /utils/__pycache__/data_loader.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mirror30z/Temperature-forecast/HEAD/utils/__pycache__/data_loader.cpython-37.pyc -------------------------------------------------------------------------------- /eval.py: -------------------------------------------------------------------------------- 1 | import torch 2 | 3 | 4 | def evaluate_model(model, input_features): 5 | # 将数据转为 tensor 6 | x = torch.tensor(input_features, dtype=torch.float32) 7 | # 前向传播,获取预测结果 8 | predictions = model(x).data.numpy() 9 | return predictions 10 | 11 | 12 | -------------------------------------------------------------------------------- /model/model.py: -------------------------------------------------------------------------------- 1 | import torch 2 | 3 | def create_model(input_size, hidden_size=128, output_size=1): 4 | # 定义神经网络 5 | model = torch.nn.Sequential( 6 | torch.nn.Linear(input_size, hidden_size), 7 | torch.nn.Sigmoid(), 8 | torch.nn.Linear(hidden_size, output_size), 9 | ) 10 | return model 11 | 12 | -------------------------------------------------------------------------------- /plot.py: -------------------------------------------------------------------------------- 1 | import matplotlib.pyplot as plt 2 | import pandas as pd 3 | 4 | def plot_predictions(dates, true_values, predictions,save_path = 'prediction_plot.png'): 5 | predictions = predictions.reshape(-1) 6 | # 创建一个 DataFrame 来存储日期和标签(真实值) 7 | true_data = pd.DataFrame(data={'date': dates, 'actual': true_values}) 8 | 9 | # 创建一个 DataFrame 来存储日期和模型预测值 10 | predictions_data = pd.DataFrame(data={'date': dates, 'prediction': predictions}) 11 | 12 | # 绘制真实值 13 | plt.plot(true_data['date'], true_data['actual'], 'b-', label='Actual') 14 | 15 | # 绘制预测值 16 | plt.plot(predictions_data['date'], predictions_data['prediction'], 'ro', label='Prediction') 17 | 18 | # 调整图表 19 | plt.xticks(rotation=60) 20 | plt.legend() 21 | 22 | # 设置标题和坐标轴标签 23 | plt.xlabel('Date') 24 | plt.ylabel('Maximum Temperature (F)') 25 | plt.title('Actual and Predicted Values') 26 | 27 | # 显示图表 28 | plt.tight_layout() 29 | 30 | plt.savefig(save_path) 31 | plt.show() 32 | -------------------------------------------------------------------------------- /utils/data_loader.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | from sklearn import preprocessing 4 | import datetime 5 | 6 | def load_data(file_path): 7 | # 加载数据 8 | features = pd.read_csv(file_path) 9 | 10 | # 处理时间数据 11 | years = features['year'] 12 | months = features['month'] 13 | days = features['day'] 14 | 15 | # 将日期转换为 datetime 格式 16 | dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)] 17 | dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates] 18 | 19 | # 独热编码 20 | features = pd.get_dummies(features) 21 | 22 | # 提取标签列 'actual' 23 | labels = np.array(features['actual']) 24 | # 在特征中去掉标签列 25 | features = features.drop('actual', axis=1) 26 | # 保存特征列名 27 | feature_list = list(features.columns) 28 | # 转换为 NumPy 数组并标准化 29 | input_features = preprocessing.StandardScaler().fit_transform(np.array(features)) 30 | 31 | return input_features, labels, dates, feature_list 32 | 33 | 34 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from utils.data_loader import load_data 3 | from model.model import create_model 4 | from train import train_model 5 | from eval import evaluate_model 6 | from plot import plot_predictions 7 | import os 8 | def main(): 9 | # 1加载数据 替换为你的目录 10 | #input_features, labels, dates, feature_list = load_data(r'E:\teach\tang\pytorch\Temperature forecast\data\temps.csv') 11 | # 获取当前脚本所在的目录 12 | current_dir = os.path.dirname(__file__) 13 | data_path = os.path.join(current_dir, 'data', 'temps.csv') 14 | # 加载数据 15 | input_features, labels, dates, feature_list = load_data(data_path) 16 | 17 | # 获取输入特征的维度 18 | input_size = input_features.shape[1] 19 | 20 | # 创建模型 21 | model = create_model(input_size) 22 | 23 | # 训练模型 24 | model = train_model(model, input_features, labels) 25 | 26 | # 使用训练好的模型进行预测 27 | predictions = evaluate_model(model, input_features) 28 | 29 | # 绘制预测结果与真实值 30 | plot_predictions(dates, labels, predictions, save_path='prediction_results.png') 31 | 32 | if __name__ == '__main__': 33 | main() 34 | -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | 2 | import torch 3 | import torch.optim as optim 4 | import torch.nn as nn 5 | import matplotlib.pyplot as plt 6 | import pandas as pd 7 | import datetime 8 | import torch 9 | import numpy as np 10 | 11 | def train_model(model, input_features, labels, batch_size=64, epochs=2000, lr=0.001): 12 | # 定义损失函数和优化器 13 | cost = torch.nn.MSELoss(reduction='mean') 14 | optimizer = torch.optim.Adam(model.parameters(), lr=lr) 15 | 16 | losses = [] 17 | for i in range(epochs): 18 | batch_loss = [] 19 | # Mini-Batch 训练 20 | for start in range(0, len(input_features), batch_size): 21 | end = start + batch_size if start + batch_size < len(input_features) else len(input_features) 22 | xx = torch.tensor(input_features[start:end], dtype=torch.float32, requires_grad=True) 23 | yy = torch.tensor(labels[start:end], dtype=torch.float32, requires_grad=True) 24 | 25 | # 前向传播 26 | prediction = model(xx) 27 | loss = cost(prediction, yy.view(-1, 1)) 28 | 29 | # 反向传播和优化 30 | optimizer.zero_grad() 31 | loss.backward(retain_graph=True) 32 | optimizer.step() 33 | 34 | # 记录损失 35 | batch_loss.append(loss.data.numpy()) 36 | 37 | # 每 100 次迭代打印一次损失 38 | if i % 100 == 0: 39 | losses.append(np.mean(batch_loss)) 40 | print(f'Epoch {i}, Loss: {np.mean(batch_loss)}') 41 | 42 | return model 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 神经网络回归——气温预测 2 | 3 | 该项目使用 PyTorch 实现了一个深度学习模型,用于预测每天的最高气温。项目采用模块化设计,包含数据预处理、模型定义、训练、评估和结果可视化模块。最终结果会以图表的形式展示,并保存为图片文件。 4 | 5 | ## 项目结构 6 | 7 | 项目的文件结构如下: 8 | 9 | ``` 10 | Temperature forecast/ 11 | │ 12 | ├── data/ # 包含数据集的目录 13 | │ └── temps.csv # CSV 文件,包含气温数据 14 | │ 15 | ├── model/ # 模型定义的目录 16 | │ └── model.py # 神经网络模型定义 17 | │ 18 | ├── utils/ # 工具目录,包含数据加载等功能 19 | │ └── data_loader.py # 数据加载与预处理脚本 20 | │ 21 | ├── all.py # (可选)包含所有功能可直接运行 22 | ├── eval.py # 模型评估脚本 23 | ├── main.py # 主程序脚本,协调整个流程 24 | ├── plot.py # 结果绘图脚本 25 | ├── train.py # 模型训练脚本 26 | ├── prediction_results.png # 示例输出图片,包含预测与实际温度对比 27 | ├── README.md # 项目说明文档 28 | 29 | ``` 30 | 31 | ## 环境依赖 32 | 33 | 要运行此项目,您需要安装以下依赖项: 34 | 35 | ```bash 36 | pip install numpy pandas matplotlib torch scikit-learn 37 | ``` 38 | 39 | ## 数据集 40 | 41 | ![数据](https://github.com/user-attachments/assets/978a6925-6b01-4181-8a2b-665a8c81ee74) 42 | 43 | 44 | 数据集 (`temps.csv`) 包含每日的天气信息,包含以下列: 45 | 46 | - `year`: 观测年份 47 | - `month`: 观测月份 48 | - `day`: 观测日 49 | - `temp_1`: 前一天的最高温度 50 | - `temp_2`: 前两天的最高温度 51 | - `actual`: 当天的实际最高温度(目标变量) 52 | - friend:朋友猜测的可能值 53 | 54 | ## Run 55 | 56 | **1.克隆仓库或者直接下载:** 57 | 58 | ```python 59 | git clone https://github.com/your-username/temperature-forecast.git 60 | cd temperature-forecast 61 | ``` 62 | 63 | **2.放置数据集**:确保 `temps.csv` 文件位于 `data/` 目录下。 64 | 65 | **3.运行主脚本**: 要加载数据、训练模型、评估并绘制结果,请运行 `main.py` 脚本: 66 | 67 | ```python 68 | python main.py 69 | ``` 70 | 71 | ## Result 72 | 73 | 真实值和预测值结果展示 74 | 75 | ![预测结果](https://github.com/user-attachments/assets/94aeeeed-be33-408f-95b6-968ad79e7c3b) 76 | -------------------------------------------------------------------------------- /all.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | import matplotlib.pyplot as plt 4 | import torch 5 | import torch.optim as optim 6 | import warnings 7 | import datetime 8 | from sklearn import preprocessing 9 | import os 10 | 11 | # 1加载数据 替换为你的目录 12 | # features = pd.read_csv(r'E:\teach\tang\pytorch\Temperature forecast\data\temps.csv') 13 | # 2加载数据 确保当前项目data中有数据集 14 | current_dir = os.path.dirname(__file__) 15 | # 构建相对路径 16 | data_path = os.path.join(current_dir, 'data', 'temps.csv') 17 | # 读取数据 18 | features = pd.read_csv(data_path) 19 | # 处理时间数据 20 | years = features['year'] 21 | months = features['month'] 22 | days = features['day'] 23 | 24 | # 将日期转换为 datetime 格式 25 | dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)] 26 | dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates] 27 | 28 | # 独热编码 29 | features = pd.get_dummies(features) 30 | 31 | # 提取标签列 'actual' 32 | labels = np.array(features['actual']) 33 | 34 | # 在特征中去掉标签列 35 | features = features.drop('actual', axis=1) 36 | 37 | # 保存特征列名 38 | feature_list = list(features.columns) 39 | 40 | # 转换为 NumPy 数组 41 | features = np.array(features) 42 | 43 | # 标准化特征 44 | input_features = preprocessing.StandardScaler().fit_transform(features) 45 | 46 | # 定义网络结构参数 47 | input_size = input_features.shape[1] 48 | hidden_size = 128 49 | output_size = 1 50 | batch_size = 16 51 | 52 | # 定义神经网络 53 | my_nn = torch.nn.Sequential( 54 | torch.nn.Linear(input_size, hidden_size), 55 | torch.nn.Sigmoid(), 56 | torch.nn.Linear(hidden_size, output_size), 57 | ) 58 | 59 | # 损失函数和优化器 60 | cost = torch.nn.MSELoss(reduction='mean') 61 | optimizer = torch.optim.Adam(my_nn.parameters(), lr=0.001) 62 | 63 | # 训练网络 64 | losses = [] 65 | for i in range(1000): 66 | batch_loss = [] 67 | # Mini-Batch 训练 68 | for start in range(0, len(input_features), batch_size): 69 | end = start + batch_size if start + batch_size < len(input_features) else len(input_features) 70 | xx = torch.tensor(input_features[start:end], dtype=torch.float32, requires_grad=True) 71 | yy = torch.tensor(labels[start:end], dtype=torch.float32, requires_grad=True) 72 | 73 | # 前向传播 74 | prediction = my_nn(xx) 75 | loss = cost(prediction, yy.view(-1, 1)) 76 | 77 | # 反向传播和优化 78 | optimizer.zero_grad() 79 | loss.backward(retain_graph=True) 80 | optimizer.step() 81 | 82 | # 记录损失 83 | batch_loss.append(loss.data.numpy()) 84 | 85 | # 每 100 次迭代打印一次损失 86 | if i % 100 == 0: 87 | losses.append(np.mean(batch_loss)) 88 | print(f'Epoch {i}, Loss: {np.mean(batch_loss)}') 89 | 90 | # 模型预测 91 | x = torch.tensor(input_features, dtype=torch.float32) 92 | predict = my_nn(x).data.numpy() 93 | 94 | # 创建一个 DataFrame 来存储日期和标签(真实值) 95 | true_data = pd.DataFrame(data={'date': dates, 'actual': labels}) 96 | 97 | # 创建一个 DataFrame 来存储日期和模型预测值 98 | test_dates = dates 99 | predictions_data = pd.DataFrame(data={'date': test_dates, 'prediction': predict.reshape(-1)}) 100 | 101 | # 绘制真实值和预测值的对比图 102 | plt.plot(true_data['date'], true_data['actual'], 'b-', label='Actual') 103 | 104 | # 绘制预测值 105 | plt.plot(predictions_data['date'], predictions_data['prediction'], 'ro', label='Prediction') 106 | 107 | # 调整图表 108 | plt.xticks(rotation=60) 109 | plt.legend() 110 | 111 | # 设置标题和坐标轴标签 112 | plt.xlabel('Date') 113 | plt.ylabel('Maximum Temperature (F)') 114 | plt.title('Actual and Predicted Values') 115 | 116 | # 显示图表 117 | plt.tight_layout() 118 | plt.show() 119 | -------------------------------------------------------------------------------- /data/temps.csv: -------------------------------------------------------------------------------- 1 | year,month,day,week,temp_2,temp_1,average,actual,friend 2 | 2016,1,1,Fri,45,45,45.6,45,29 3 | 2016,1,2,Sat,44,45,45.7,44,61 4 | 2016,1,3,Sun,45,44,45.8,41,56 5 | 2016,1,4,Mon,44,41,45.9,40,53 6 | 2016,1,5,Tues,41,40,46,44,41 7 | 2016,1,6,Wed,40,44,46.1,51,40 8 | 2016,1,7,Thurs,44,51,46.2,45,38 9 | 2016,1,8,Fri,51,45,46.3,48,34 10 | 2016,1,9,Sat,45,48,46.4,50,47 11 | 2016,1,10,Sun,48,50,46.5,52,49 12 | 2016,1,11,Mon,50,52,46.7,45,39 13 | 2016,1,12,Tues,52,45,46.8,49,61 14 | 2016,1,13,Wed,45,49,46.9,55,33 15 | 2016,1,14,Thurs,49,55,47,49,58 16 | 2016,1,15,Fri,55,49,47.1,48,65 17 | 2016,1,16,Sat,49,48,47.3,54,28 18 | 2016,1,17,Sun,48,54,47.4,50,47 19 | 2016,1,18,Mon,54,50,47.5,54,58 20 | 2016,1,19,Tues,50,54,47.6,48,53 21 | 2016,1,20,Wed,54,48,47.7,52,61 22 | 2016,1,21,Thurs,48,52,47.8,52,57 23 | 2016,1,22,Fri,52,52,47.9,57,60 24 | 2016,1,23,Sat,52,57,48,48,37 25 | 2016,1,24,Sun,57,48,48.1,51,54 26 | 2016,1,25,Mon,48,51,48.2,54,63 27 | 2016,1,26,Tues,51,54,48.3,56,61 28 | 2016,1,27,Wed,54,56,48.4,57,54 29 | 2016,1,28,Thurs,56,57,48.4,56,34 30 | 2016,1,29,Fri,57,56,48.5,52,49 31 | 2016,1,30,Sat,56,52,48.6,48,47 32 | 2016,1,31,Sun,52,48,48.7,47,61 33 | 2016,2,1,Mon,48,47,48.8,46,51 34 | 2016,2,2,Tues,47,46,48.8,51,56 35 | 2016,2,3,Wed,46,51,48.9,49,40 36 | 2016,2,4,Thurs,51,49,49,49,44 37 | 2016,2,5,Fri,49,49,49.1,53,45 38 | 2016,2,6,Sat,49,53,49.1,49,56 39 | 2016,2,7,Sun,53,49,49.2,51,63 40 | 2016,2,8,Mon,49,51,49.3,57,34 41 | 2016,2,9,Tues,51,57,49.4,62,57 42 | 2016,2,10,Wed,57,62,49.4,56,30 43 | 2016,2,11,Thurs,62,56,49.5,55,37 44 | 2016,2,12,Fri,56,55,49.6,58,33 45 | 2016,2,15,Mon,55,58,49.9,55,53 46 | 2016,2,16,Tues,58,55,49.9,56,55 47 | 2016,2,17,Wed,55,56,50,57,46 48 | 2016,2,18,Thurs,56,57,50.1,53,34 49 | 2016,2,19,Fri,57,53,50.2,51,42 50 | 2016,2,20,Sat,53,51,50.4,53,43 51 | 2016,2,21,Sun,51,53,50.5,51,46 52 | 2016,2,22,Mon,53,51,50.6,51,59 53 | 2016,2,23,Tues,51,51,50.7,60,43 54 | 2016,2,24,Wed,51,60,50.8,59,46 55 | 2016,2,25,Thurs,60,59,50.9,61,35 56 | 2016,2,26,Fri,59,61,51.1,60,65 57 | 2016,2,27,Sat,61,60,51.2,57,61 58 | 2016,2,28,Sun,60,57,51.3,53,66 59 | 2016,3,1,Tues,53,54,51.5,58,53 60 | 2016,3,2,Wed,54,58,51.6,55,37 61 | 2016,3,3,Thurs,58,55,51.8,59,71 62 | 2016,3,4,Fri,55,59,51.9,57,45 63 | 2016,3,5,Sat,59,57,52.1,64,46 64 | 2016,3,6,Sun,57,64,52.2,60,49 65 | 2016,3,7,Mon,64,60,52.4,53,71 66 | 2016,3,8,Tues,60,53,52.5,54,70 67 | 2016,3,9,Wed,53,54,52.7,55,57 68 | 2016,3,10,Thurs,54,55,52.8,56,50 69 | 2016,3,11,Fri,55,56,53,55,36 70 | 2016,3,12,Sat,56,55,53.1,52,65 71 | 2016,3,13,Sun,55,52,53.3,54,54 72 | 2016,3,14,Mon,52,54,53.4,49,44 73 | 2016,3,15,Tues,54,49,53.6,51,70 74 | 2016,3,16,Wed,49,51,53.7,53,65 75 | 2016,3,17,Thurs,51,53,53.9,58,62 76 | 2016,3,18,Fri,53,58,54,63,56 77 | 2016,3,19,Sat,58,63,54.2,61,62 78 | 2016,3,20,Sun,63,61,54.3,55,50 79 | 2016,3,21,Mon,61,55,54.5,56,52 80 | 2016,3,22,Tues,55,56,54.6,57,64 81 | 2016,3,23,Wed,56,57,54.7,53,70 82 | 2016,3,24,Thurs,57,53,54.9,54,72 83 | 2016,3,25,Fri,53,54,55,57,42 84 | 2016,3,26,Sat,54,57,55.2,59,54 85 | 2016,3,27,Sun,57,59,55.3,51,39 86 | 2016,3,28,Mon,59,51,55.5,56,47 87 | 2016,3,29,Tues,51,56,55.6,64,45 88 | 2016,3,30,Wed,56,64,55.7,68,57 89 | 2016,3,31,Thurs,64,68,55.9,73,56 90 | 2016,4,1,Fri,68,73,56,71,41 91 | 2016,4,2,Sat,73,71,56.2,63,45 92 | 2016,4,3,Sun,71,63,56.3,69,64 93 | 2016,4,4,Mon,63,69,56.5,60,45 94 | 2016,4,5,Tues,69,60,56.6,57,72 95 | 2016,4,6,Wed,60,57,56.8,68,64 96 | 2016,4,7,Thurs,57,68,56.9,77,38 97 | 2016,4,8,Fri,68,77,57.1,76,41 98 | 2016,4,9,Sat,77,76,57.2,66,74 99 | 2016,4,10,Sun,76,66,57.4,59,60 100 | 2016,4,11,Mon,66,59,57.6,58,40 101 | 2016,4,12,Tues,59,58,57.7,60,61 102 | 2016,4,13,Wed,58,60,57.9,59,77 103 | 2016,4,14,Thurs,60,59,58.1,59,66 104 | 2016,4,15,Fri,59,59,58.3,60,40 105 | 2016,4,16,Sat,59,60,58.5,68,59 106 | 2016,4,17,Sun,60,68,58.6,77,54 107 | 2016,4,18,Mon,68,77,58.8,89,39 108 | 2016,4,19,Tues,77,89,59,81,61 109 | 2016,4,20,Wed,89,81,59.2,81,66 110 | 2016,4,21,Thurs,81,81,59.4,73,55 111 | 2016,4,22,Fri,81,73,59.7,64,59 112 | 2016,4,23,Sat,73,64,59.9,65,57 113 | 2016,4,24,Sun,64,65,60.1,55,41 114 | 2016,4,25,Mon,65,55,60.3,59,77 115 | 2016,4,26,Tues,55,59,60.5,60,75 116 | 2016,4,27,Wed,59,60,60.7,61,50 117 | 2016,4,28,Thurs,60,61,61,64,73 118 | 2016,4,29,Fri,61,64,61.2,61,49 119 | 2016,4,30,Sat,64,61,61.4,68,78 120 | 2016,5,1,Sun,61,68,61.6,77,75 121 | 2016,5,2,Mon,68,77,61.9,87,59 122 | 2016,5,3,Tues,77,87,62.1,74,69 123 | 2016,5,4,Wed,87,74,62.3,60,61 124 | 2016,5,5,Thurs,74,60,62.5,68,56 125 | 2016,5,6,Fri,60,68,62.8,77,64 126 | 2016,5,7,Sat,68,77,63,82,83 127 | 2016,5,8,Sun,77,82,63.2,63,83 128 | 2016,5,9,Mon,82,63,63.4,67,64 129 | 2016,5,10,Tues,63,67,63.6,75,68 130 | 2016,5,11,Wed,67,75,63.8,81,60 131 | 2016,5,12,Thurs,75,81,64.1,77,81 132 | 2016,5,13,Fri,81,77,64.3,82,67 133 | 2016,5,14,Sat,77,82,64.5,65,65 134 | 2016,5,15,Sun,82,65,64.7,57,58 135 | 2016,5,16,Mon,65,57,64.8,60,53 136 | 2016,5,17,Tues,57,60,65,71,55 137 | 2016,5,18,Wed,60,71,65.2,64,56 138 | 2016,5,19,Thurs,71,64,65.4,63,56 139 | 2016,5,20,Fri,64,63,65.6,66,73 140 | 2016,5,21,Sat,63,66,65.7,59,49 141 | 2016,5,22,Sun,66,59,65.9,66,80 142 | 2016,5,23,Mon,59,66,66.1,65,66 143 | 2016,5,24,Tues,66,65,66.2,66,67 144 | 2016,5,25,Wed,65,66,66.4,66,60 145 | 2016,5,26,Thurs,66,66,66.5,65,85 146 | 2016,5,27,Fri,66,65,66.7,64,73 147 | 2016,5,28,Sat,65,64,66.8,64,64 148 | 2016,5,29,Sun,64,64,67,64,76 149 | 2016,5,30,Mon,64,64,67.1,71,69 150 | 2016,5,31,Tues,64,71,67.3,79,85 151 | 2016,6,1,Wed,71,79,67.4,75,58 152 | 2016,6,2,Thurs,79,75,67.6,71,77 153 | 2016,6,3,Fri,75,71,67.7,80,55 154 | 2016,6,4,Sat,71,80,67.9,81,76 155 | 2016,6,5,Sun,80,81,68,92,54 156 | 2016,6,6,Mon,81,92,68.2,86,71 157 | 2016,6,7,Tues,92,86,68.3,85,58 158 | 2016,6,8,Wed,86,85,68.5,67,81 159 | 2016,6,9,Thurs,85,67,68.6,65,80 160 | 2016,6,10,Fri,67,65,68.8,67,73 161 | 2016,6,11,Sat,65,67,69,65,87 162 | 2016,6,12,Sun,67,65,69.1,70,83 163 | 2016,6,13,Mon,65,70,69.3,66,79 164 | 2016,6,14,Tues,70,66,69.5,60,85 165 | 2016,6,15,Wed,66,60,69.7,67,69 166 | 2016,6,16,Thurs,60,67,69.8,71,87 167 | 2016,6,17,Fri,67,71,70,67,54 168 | 2016,6,18,Sat,71,67,70.2,65,77 169 | 2016,6,19,Sun,67,65,70.4,70,58 170 | 2016,6,20,Mon,65,70,70.6,76,79 171 | 2016,6,21,Tues,70,76,70.8,73,57 172 | 2016,6,22,Wed,76,73,71,75,78 173 | 2016,6,23,Thurs,73,75,71.3,68,56 174 | 2016,6,24,Fri,75,68,71.5,69,65 175 | 2016,6,25,Sat,68,69,71.7,71,89 176 | 2016,6,26,Sun,69,71,71.9,78,70 177 | 2016,6,27,Mon,71,78,72.2,85,84 178 | 2016,6,28,Tues,78,85,72.4,79,67 179 | 2016,6,29,Wed,85,79,72.6,74,81 180 | 2016,6,30,Thurs,79,74,72.8,73,87 181 | 2016,7,1,Fri,74,73,73.1,76,93 182 | 2016,7,2,Sat,73,76,73.3,76,84 183 | 2016,7,3,Sun,76,76,73.5,71,85 184 | 2016,7,4,Mon,76,71,73.8,68,86 185 | 2016,7,5,Tues,71,68,74,69,62 186 | 2016,7,6,Wed,68,69,74.2,76,86 187 | 2016,7,7,Thurs,69,76,74.4,68,72 188 | 2016,7,8,Fri,76,68,74.6,74,77 189 | 2016,7,9,Sat,68,74,74.9,71,60 190 | 2016,7,10,Sun,74,71,75.1,74,95 191 | 2016,7,11,Mon,71,74,75.3,74,71 192 | 2016,7,12,Tues,74,74,75.4,77,71 193 | 2016,7,13,Wed,74,77,75.6,75,56 194 | 2016,7,14,Thurs,77,75,75.8,77,77 195 | 2016,7,15,Fri,75,77,76,76,75 196 | 2016,7,16,Sat,77,76,76.1,72,61 197 | 2016,7,17,Sun,76,72,76.3,80,88 198 | 2016,7,18,Mon,72,80,76.4,73,66 199 | 2016,7,19,Tues,80,73,76.6,78,90 200 | 2016,7,20,Wed,73,78,76.7,82,66 201 | 2016,7,21,Thurs,78,82,76.8,81,84 202 | 2016,7,22,Fri,82,81,76.9,71,70 203 | 2016,7,23,Sat,81,71,77,75,86 204 | 2016,7,24,Sun,71,75,77.1,80,75 205 | 2016,7,25,Mon,75,80,77.1,85,81 206 | 2016,7,26,Tues,80,85,77.2,79,74 207 | 2016,7,27,Wed,85,79,77.3,83,79 208 | 2016,7,28,Thurs,79,83,77.3,85,76 209 | 2016,7,29,Fri,83,85,77.3,88,77 210 | 2016,7,30,Sat,85,88,77.3,76,70 211 | 2016,7,31,Sun,88,76,77.4,73,95 212 | 2016,8,1,Mon,76,73,77.4,77,65 213 | 2016,8,2,Tues,73,77,77.4,73,62 214 | 2016,8,3,Wed,77,73,77.3,75,93 215 | 2016,8,4,Thurs,73,75,77.3,80,66 216 | 2016,8,5,Fri,75,80,77.3,79,71 217 | 2016,8,6,Sat,80,79,77.2,72,60 218 | 2016,8,7,Sun,79,72,77.2,72,95 219 | 2016,8,8,Mon,72,72,77.1,73,65 220 | 2016,8,9,Tues,72,73,77.1,72,94 221 | 2016,8,10,Wed,73,72,77,76,68 222 | 2016,8,11,Thurs,72,76,76.9,80,80 223 | 2016,8,12,Fri,76,80,76.9,87,81 224 | 2016,8,13,Sat,80,87,76.8,90,73 225 | 2016,8,14,Sun,87,90,76.7,83,65 226 | 2016,8,15,Mon,90,83,76.6,84,70 227 | 2016,8,16,Tues,83,84,76.5,81,90 228 | 2016,8,23,Tues,84,81,75.7,79,89 229 | 2016,8,28,Sun,81,79,75,75,85 230 | 2016,8,30,Tues,79,75,74.6,70,63 231 | 2016,9,3,Sat,75,70,73.9,67,68 232 | 2016,9,4,Sun,70,67,73.7,68,64 233 | 2016,9,5,Mon,67,68,73.5,68,54 234 | 2016,9,6,Tues,68,68,73.3,68,79 235 | 2016,9,7,Wed,68,68,73,67,70 236 | 2016,9,8,Thurs,68,67,72.8,72,56 237 | 2016,9,9,Fri,67,72,72.6,74,78 238 | 2016,9,10,Sat,72,74,72.3,77,91 239 | 2016,9,11,Sun,74,77,72.1,70,70 240 | 2016,9,12,Mon,77,70,71.8,74,90 241 | 2016,9,13,Tues,70,74,71.5,75,82 242 | 2016,9,14,Wed,74,75,71.2,79,77 243 | 2016,9,15,Thurs,75,79,71,71,64 244 | 2016,9,16,Fri,79,71,70.7,75,52 245 | 2016,9,17,Sat,71,75,70.3,68,84 246 | 2016,9,18,Sun,75,68,70,69,90 247 | 2016,9,19,Mon,68,69,69.7,71,88 248 | 2016,9,20,Tues,69,71,69.4,67,81 249 | 2016,9,21,Wed,71,67,69,68,76 250 | 2016,9,22,Thurs,67,68,68.7,67,56 251 | 2016,9,23,Fri,68,67,68.3,64,61 252 | 2016,9,24,Sat,67,64,68,67,64 253 | 2016,9,25,Sun,64,67,67.6,76,62 254 | 2016,9,26,Mon,67,76,67.2,77,74 255 | 2016,9,27,Tues,76,77,66.8,69,64 256 | 2016,9,28,Wed,77,69,66.5,68,62 257 | 2016,9,29,Thurs,69,68,66.1,66,57 258 | 2016,9,30,Fri,68,66,65.7,67,74 259 | 2016,10,1,Sat,66,67,65.3,63,54 260 | 2016,10,2,Sun,67,63,64.9,65,82 261 | 2016,10,3,Mon,63,65,64.5,61,49 262 | 2016,10,4,Tues,65,61,64.1,63,60 263 | 2016,10,5,Wed,61,63,63.7,66,48 264 | 2016,10,6,Thurs,63,66,63.3,63,55 265 | 2016,10,7,Fri,66,63,62.9,64,78 266 | 2016,10,8,Sat,63,64,62.5,68,73 267 | 2016,10,9,Sun,64,68,62.1,57,55 268 | 2016,10,10,Mon,68,57,61.8,60,62 269 | 2016,10,11,Tues,57,60,61.4,62,58 270 | 2016,10,12,Wed,60,62,61,66,52 271 | 2016,10,13,Thurs,62,66,60.6,60,57 272 | 2016,10,14,Fri,66,60,60.2,60,78 273 | 2016,10,15,Sat,60,60,59.9,62,46 274 | 2016,10,16,Sun,60,62,59.5,60,40 275 | 2016,10,17,Mon,62,60,59.1,60,62 276 | 2016,10,18,Tues,60,60,58.8,61,53 277 | 2016,10,19,Wed,60,61,58.4,58,41 278 | 2016,10,20,Thurs,61,58,58.1,62,43 279 | 2016,10,21,Fri,58,62,57.8,59,44 280 | 2016,10,22,Sat,62,59,57.4,62,44 281 | 2016,10,23,Sun,59,62,57.1,62,67 282 | 2016,10,24,Mon,62,62,56.8,61,70 283 | 2016,10,25,Tues,62,61,56.5,65,70 284 | 2016,10,26,Wed,61,65,56.2,58,41 285 | 2016,10,27,Thurs,65,58,55.9,60,39 286 | 2016,10,28,Fri,58,60,55.6,65,52 287 | 2016,10,29,Sat,60,65,55.3,68,65 288 | 2016,10,31,Mon,65,68,54.8,59,62 289 | 2016,11,1,Tues,68,59,54.5,57,61 290 | 2016,11,2,Wed,59,57,54.2,57,70 291 | 2016,11,3,Thurs,57,57,53.9,65,35 292 | 2016,11,4,Fri,57,65,53.7,65,38 293 | 2016,11,5,Sat,65,65,53.4,58,41 294 | 2016,11,6,Sun,65,58,53.2,61,71 295 | 2016,11,7,Mon,58,61,52.9,63,35 296 | 2016,11,8,Tues,61,63,52.7,71,49 297 | 2016,11,9,Wed,63,71,52.4,65,42 298 | 2016,11,10,Thurs,71,65,52.2,64,38 299 | 2016,11,11,Fri,65,64,51.9,63,55 300 | 2016,11,12,Sat,64,63,51.7,59,63 301 | 2016,11,13,Sun,63,59,51.4,55,64 302 | 2016,11,14,Mon,59,55,51.2,57,42 303 | 2016,11,15,Tues,55,57,51,55,46 304 | 2016,11,16,Wed,57,55,50.7,50,34 305 | 2016,11,17,Thurs,55,50,50.5,52,57 306 | 2016,11,18,Fri,50,52,50.3,55,35 307 | 2016,11,19,Sat,52,55,50,57,56 308 | 2016,11,20,Sun,55,57,49.8,55,30 309 | 2016,11,21,Mon,57,55,49.5,54,67 310 | 2016,11,22,Tues,55,54,49.3,54,58 311 | 2016,11,23,Wed,54,54,49.1,49,38 312 | 2016,11,24,Thurs,54,49,48.9,52,29 313 | 2016,11,25,Fri,49,52,48.6,52,41 314 | 2016,11,26,Sat,52,52,48.4,53,58 315 | 2016,11,27,Sun,52,53,48.2,48,53 316 | 2016,11,28,Mon,53,48,48,52,44 317 | 2016,11,29,Tues,48,52,47.8,52,50 318 | 2016,11,30,Wed,52,52,47.6,52,44 319 | 2016,12,1,Thurs,52,52,47.4,46,39 320 | 2016,12,2,Fri,52,46,47.2,50,41 321 | 2016,12,3,Sat,46,50,47,49,58 322 | 2016,12,4,Sun,50,49,46.8,46,53 323 | 2016,12,5,Mon,49,46,46.6,40,65 324 | 2016,12,6,Tues,46,40,46.4,42,56 325 | 2016,12,7,Wed,40,42,46.3,40,62 326 | 2016,12,8,Thurs,42,40,46.1,41,36 327 | 2016,12,9,Fri,40,41,46,36,54 328 | 2016,12,10,Sat,41,36,45.9,44,65 329 | 2016,12,11,Sun,36,44,45.7,44,35 330 | 2016,12,12,Mon,44,44,45.6,43,42 331 | 2016,12,13,Tues,44,43,45.5,40,46 332 | 2016,12,14,Wed,43,40,45.4,39,49 333 | 2016,12,15,Thurs,40,39,45.3,39,46 334 | 2016,12,16,Fri,39,39,45.3,35,39 335 | 2016,12,17,Sat,39,35,45.2,35,38 336 | 2016,12,18,Sun,35,35,45.2,39,36 337 | 2016,12,19,Mon,35,39,45.1,46,51 338 | 2016,12,20,Tues,39,46,45.1,51,62 339 | 2016,12,21,Wed,46,51,45.1,49,39 340 | 2016,12,22,Thurs,51,49,45.1,45,38 341 | 2016,12,23,Fri,49,45,45.1,40,35 342 | 2016,12,24,Sat,45,40,45.1,41,39 343 | 2016,12,25,Sun,40,41,45.1,42,31 344 | 2016,12,26,Mon,41,42,45.2,42,58 345 | 2016,12,27,Tues,42,42,45.2,47,47 346 | 2016,12,28,Wed,42,47,45.3,48,58 347 | 2016,12,29,Thurs,47,48,45.3,48,65 348 | 2016,12,30,Fri,48,48,45.4,57,42 349 | 2016,12,31,Sat,48,57,45.5,40,57 --------------------------------------------------------------------------------