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

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

本文运用时间序列 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()
相关推荐
DanielYQ14 分钟前
LCR 001 两数相除
开发语言·python·算法
vener_1 小时前
LuckySheet协同编辑后端示例(Django+Channel,Websocket通信)
javascript·后端·python·websocket·django·luckysheet
封步宇AIGC1 小时前
量化交易系统开发-实时行情自动化交易-4.2.3.指数移动平均线实现
人工智能·python·机器学习·数据挖掘
互联网杂货铺1 小时前
自动化测试基础知识总结
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
小汤猿人类1 小时前
SpringTask
开发语言·python
网络安全(king)2 小时前
【Python】【持续项目】Python-安全项目搜集
开发语言·python·安全
工业甲酰苯胺2 小时前
Python脚本消费多个Kafka topic
开发语言·python·kafka
做程序员的第一天2 小时前
在PyTorch中,钩子(hook)是什么?在神经网络中扮演什么角色?
pytorch·python·深度学习
yyywxk3 小时前
VSCode 新建 Python 包/模块 Pylance 无法解析
ide·vscode·python
Nerinic3 小时前
PyTorch基础2
pytorch·python