全年平均地表气温的时间序列分析和直方图绘制

气温的变化对农业生产、环境、水资源、人民生活有很大的影响,对气温的建模及预测一直是人工智能领域的热点话题。

本文运用时间序列 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()
相关推荐
Desire.9848 分钟前
Python 数学建模——灰色关联度分析
python·数学建模·灰色关联度
小鹿( ﹡ˆoˆ﹡ )26 分钟前
Python中的树与图:构建复杂数据结构的艺术
开发语言·python
阡之尘埃32 分钟前
Python数据分析案例59——基于图神经网络的反欺诈交易检测(GCN,GAT,GIN)
python·神经网络·数据挖掘·数据分析·图神经网络·反欺诈·风控大数据
xiaojiesec36 分钟前
第157天: 安全开发-Python 自动化挖掘项目&SRC 目标&FOFA 资产&Web 爬虫解析库
python·安全
27划流星雨_40 分钟前
from tqdm.auto import tqdm用法详细介绍
python
爱里承欢。1 小时前
【Python语言初识(二)】
python
hzw05101 小时前
Jupyter的使用
ide·python·jupyter
憨憨小白2 小时前
函数的高级应用
开发语言·python·青少年编程·少儿编程
CV-King2 小时前
计算机视觉硬件知识点整理(三):镜头
图像处理·人工智能·python·opencv·计算机视觉
惟长堤一痕2 小时前
医学数据分析实训 项目三 关联规则分析作业--在线购物车分析--痹症方剂用药规律分析
python·数据分析