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

Hi,大家好,我是半亩花海。气温的变化对农业生产、环境、水资源、人民生活有很大的影响,对气温的建模及预测一直是人工智能领域的热点话题。本文运用时间序列 ARIMA 模型的建模方法对1850年-2021年全国年平均温度进行分析研究,通过 Python 软件建立了 ARIMA 时间序列模型,本文的研究结果对工农业生产、人民生活具有一定参考价值。

目录

一、导入相关库

二、解决 matplotlib 中文乱码

三、读取 Excel 数据

四、计算平均值和标准差

五、绘制时间序列图

六、绘制直方图

七、代码部分​​​​​​​


一、导入相关库

首先需要导入 pandas 和 matplotlib.pyplot 两个库。

import pandas as pd
import matplotlib.pyplot as plt

二、解决 matplotlib 中文乱码

在使用 matplotlib 绘图时,常常要求图例使用中文,而若直接使用 plt.title('中文') 或 plt.xlabel('中文') 时,中文可能会出现下面的小方块。

在导入上述模块后加入下面以下字体设置(中文)坐标编码(不支持负数)代码。

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来设置字体样式(目前是黑体)以正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 默认是使用Unicode负号,设置正常显示字符,如正常显示负号

若仍无法解决中文字体乱码问题,可能是电脑没有 'SimHei' 这个字体,可以试着用 'FangSong' 等其他字体,其他字体可见如下 “plt.rcParams 参数的使用”中的其他具体字体。

plt.rcParams 参数的使用:

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 参数:

# 读取Excel数据
data = pd.read_excel('data.xlsx', sheet_name='Sheet2', parse_dates=['时间'])

上述代码中,我们通过 read_csv 函数读取了 Excel 文件,并在参数列表中设置 parse_dates 为指定列名,实现了将“时间”解析为格式化时间。运行代码,我们可以看到输出的 DataFrame 的行索引已经改为时间格式。


四、计算平均值和标准差

在绘制时间序列图和直方图之前,需要计算平均值和标准差,详细公式如下:

平均值:

\sigma =\sqrt{\frac{1}{N-1}\frac{\sum_{i=1}^{N}\left ( x_{i}-\mu \right )^{2}}{N}}

标准差:

\mu =\frac{\sum_{i=1}^{N}x_{i}}{N}

# 计算平均值和标准差
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()


七、代码部分

#!/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()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半亩花海

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值