气温的变化对农业生产、环境、水资源、人民生活有很大的影响,对气温的建模及预测一直是人工智能领域的热点话题。
本文运用时间序列 ARIMA 模型 的建模方法对1850年-2021年全国年平均温度进行分析研究,通过 Python 软件建立了 ARIMA 时间序列模型,本文的研究结果对工农业生产、人民生活具有一定参考价值。
一、导入相关库
首先需要导入 pandas 和 matplotlib.pyplot 两个库。
javascript
import pandas as pd
import matplotlib.pyplot as plt
二、解决 matplotlib 中文乱码
在使用 matplotlib 绘图时,常常要求图例使用中文,而若直接使用 plt.title('中文') 或 plt.xlabel('中文') 时,中文可能会出现下面的小方块。
在导入上述模块后加入下面以下**字体设置(中文)和坐标编码(不支持负数)**代码。
scss
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来设置字体样式(目前是黑体)以正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 默认是使用Unicode负号,设置正常显示字符,如正常显示负号
若仍无法解决中文字体乱码问题,可能是电脑没有 'SimHei' 这个字体,可以试着用 'FangSong' 等其他字体,其他字体可见如下 "plt.rcParams 参数的使用"中的其他具体字体。
plt.rcParams 参数的使用:
python
plt.rcParams['figure.figsize'] = (5.0, 4.0) # 显示图像的最大范围
plt.rcParams['image.interpolation'] = 'nearest' # 差值方式,设置 interpolation style
plt.rcParams['image.cmap'] = 'gray' # 灰度空间
# 设置rc参数显示中文标题
# 设置字体为SimHei显示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 设置其他字体显示中文
plt.rcParams['font.sans-serif']=['STSong'] # 中文宋体
plt.rcParams['font.sans-serif']=['SimHei'] # 中文黑体
plt.rcParams['font.sans-serif']=['Kaiti'] # 中文楷体
plt.rcParams['font.sans-serif']=['Lisu'] # 中文隶书
plt.rcParams['font.sans-serif']=['FangSong'] # 中文仿宋
plt.rcParams['font.sans-serif']=['YouYuan'] # 中文幼圆
# 设置正常显示字符
plt.rcParams['axes.unicode_minus'] = False
plt.title('sin曲线')
# 设置线条样式
plt.rcParams['lines.linestyle'] = '-.'
# 设置线条宽度
plt.rcParams['lines.linewidth'] = 3
# 绘制sin曲线
plt.plot(x, y, label='$sin(x)$')
三、读取 Excel 数据
Python 中的 pandas 库是数据分析中使用频率最高的库之一,而 parse_dates 是 pandas 库中常用的参数之一。在读取 CSV 或 Excel 等格式的数据时,parse_dates 参数可以让我们将指定的列中的数据解析为日期,并将其作为 DataFrame 的行索引。parse_dates 参数可以简化对日期数据的处理,使我们更加专注于数据的分析和挖掘。
读取 data.xlsx 里的数据,限定表头为 "Sheet2"(经过数据处理,把准备读取的数据放到了表头2,故此处需标明表头序号)。下面将以读取 Excel 文件为例,演示如何使用 parse_dates 参数:
ini
# 读取Excel数据
data = pd.read_excel('data.xlsx', sheet_name='Sheet2', parse_dates=['时间'])
上述代码中,我们通过 read_csv 函数读取了 Excel 文件,并在参数列表中设置 parse_dates 为指定列名,实现了将"时间"解析为格式化时间。运行代码,我们可以看到输出的 DataFrame 的行索引已经改为时间格式。
四、计算平均值和标准差
在绘制时间序列图和直方图之前,需要计算平均值和标准差,详细公式如下:
平均值:
标准差:
ini
# 计算平均值和标准差
average = data['温度距平值(°C)'].mean()
std_dev = data.loc[data['时间'].dt.year.between(1961, 1990), '温度距平值(°C)'].std()
五、绘制时间序列图
ini
# 绘制时间序列图
plt.figure(figsize=(10, 6))
plt.plot(data['时间'], data['温度距平值(°C)'], label='温度距平值')
plt.axhline(y=average, color='r', linestyle='--', label='平均值: {:.2f}'.format(average))
plt.axhline(y=std_dev, color='g', linestyle='--', label='标准差: {:.2f}'.format(std_dev))
plt.xlabel('年份')
plt.ylabel('温度距平值(°C)')
plt.title('全球年平均地表面大气温度时间序列图')
plt.legend()
plt.grid(True)
plt.show()
六、绘制直方图
ini
# 绘制直方图
plt.figure(figsize=(10, 6))
plt.hist(data['温度距平值(°C)'], bins=20, edgecolor='black')
plt.axvline(x=average, color='r', linestyle='--', label='平均值: {:.2f}'.format(average))
plt.axvline(x=std_dev, color='g', linestyle='--', label='标准差: {:.2f}'.format(std_dev))
plt.xlabel('温度')
plt.ylabel('频次')
plt.title('全球年平均地表面大气温度直方图')
plt.legend()
plt.grid(True)
plt.show()
七、代码部分
css
#!/usr/bin/env python
# -*- coding: UTF-8 -*
"""
@File :全年平均地表气温的时间序列图和直方图.py
@IDE :PyCharm
@Author :源于花海
@Date :2023/09/04 00:11
"""
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来设置字体样式(目前是黑体)以正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 默认是使用Unicode负号,设置正常显示字符,如正常显示负号
# 读取Excel数据
data = pd.read_excel('data.xlsx', sheet_name='Sheet2', parse_dates=['时间'])
# 计算平均值和标准差
average = data['温度距平值(°C)'].mean()
std_dev = data.loc[data['时间'].dt.year.between(1961, 1990), '温度距平值(°C)'].std()
# 绘制时间序列图
plt.figure(figsize=(10, 6))
plt.plot(data['时间'], data['温度距平值(°C)'], label='温度距平值')
plt.axhline(y=average, color='r', linestyle='--', label='平均值: {:.2f}'.format(average))
plt.axhline(y=std_dev, color='g', linestyle='--', label='标准差: {:.2f}'.format(std_dev))
plt.xlabel('年份')
plt.ylabel('温度距平值(°C)')
plt.title('全球年平均地表面大气温度时间序列图')
plt.legend()
plt.grid(True)
plt.show()
# 绘制直方图
plt.figure(figsize=(10, 6))
plt.hist(data['温度距平值(°C)'], bins=20, edgecolor='black')
plt.axvline(x=average, color='r', linestyle='--', label='平均值: {:.2f}'.format(average))
plt.axvline(x=std_dev, color='g', linestyle='--', label='标准差: {:.2f}'.format(std_dev))
plt.xlabel('温度')
plt.ylabel('频次')
plt.title('全球年平均地表面大气温度直方图')
plt.legend()
plt.grid(True)
plt.show()