Python 3 时间序列可视化指南

news/2024/2/28 10:02:58

简介

时间序列分析属于统计学的一个分支,涉及对有序的、通常是时间性的数据进行研究。当适当应用时,时间序列分析可以揭示意想不到的趋势,提取有用的统计数据,甚至预测未来的趋势。因此,它被应用于许多领域,包括经济学、天气预报和容量规划等。

在本教程中,我们将介绍时间序列分析中使用的一些常见技术,并逐步介绍操作、可视化时间序列数据所需的迭代步骤。

先决条件

本指南将介绍如何在本地桌面或远程服务器上进行时间序列分析。处理大型数据集可能会占用大量内存,因此在任何情况下,计算机都需要至少2GB的内存来执行本指南中的一些计算。

在本教程中,我们将使用Jupyter Notebook来处理数据。如果您尚未安装,请按照我们的教程安装和设置Python 3的Jupyter Notebook。

步骤1 — 安装软件包

我们将利用pandas库,它在处理数据时提供了很大的灵活性,以及statsmodels库,它允许我们在Python中进行统计计算。这两个库的结合扩展了Python的功能,显著增加了我们的分析工具包。

与其他Python软件包一样,我们可以使用pip安装pandasstatsmodels。首先,让我们进入本地编程环境或基于服务器的编程环境:

cd environments
. my_env/bin/activate

从这里开始,让我们为我们的项目创建一个新目录。我们将其命名为timeseries,然后进入该目录。如果您将项目命名为其他名称,请确保在整个指南中用您的名称替换timeseries

mkdir timeseries
cd timeseries

现在,我们可以安装pandasstatsmodels和数据绘图包matplotlib。它们的依赖项也将被安装:

pip install pandas statsmodels matplotlib

到目前为止,我们已经准备好开始使用pandasstatsmodels进行工作。

步骤2 — 加载时间序列数据

要开始处理我们的数据,我们将启动Jupyter Notebook:

jupyter notebook

要创建一个新的笔记本文件,请从右上角的下拉菜单中选择New > Python 3

!创建一个新的Python 3笔记本

这将打开一个笔记本,允许我们加载所需的库(请注意,我们使用了标准的缩写来引用pandasmatplotlibstatsmodels)。在我们的笔记本顶部,我们应该写入以下内容:

import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

在本教程的每个代码块之后,您应该键入ALT + ENTER来运行代码,并在笔记本中进入新的代码块。

方便的是,statsmodels自带内置数据集,因此我们可以直接将时间序列数据集加载到内存中。

我们将使用一个名为“夏威夷火奴鲁鲁马努阿罗观测站连续空气样本中的大气二氧化碳(CO2)”的数据集,该数据集从1958年3月到2001年12月收集了CO2样本。我们可以这样导入这些数据:

data = sm.datasets.co2.load_pandas()
co2 = data.data

让我们看看我们的时间序列数据的前5行是什么样子:

print(co2.head(5))
              co2
1958-03-29  316.1
1958-04-05  317.3
1958-04-12  317.6
1958-04-19  317.5
1958-04-26  316.4

通过导入包并准备好CO2数据集,我们可以继续对数据进行索引。

步骤3 — 使用时间序列数据进行索引

您可能已经注意到日期已经被设置为我们pandas DataFrame的索引。在Python中处理时间序列数据时,我们应该确保使用日期作为索引,因此请务必始终检查,我们可以通过运行以下命令来实现:

co2.index
DatetimeIndex(['1958-03-29', '1958-04-05', '1958-04-12', '1958-04-19','1958-04-26', '1958-05-03', '1958-05-10', '1958-05-17','1958-05-24', '1958-05-31',...'2001-10-27', '2001-11-03', '2001-11-10', '2001-11-17','2001-11-24', '2001-12-01', '2001-12-08', '2001-12-15','2001-12-22', '2001-12-29'],dtype='datetime64[ns]', length=2284, freq='W-SAT')

dtype=datetime[ns]字段确认了我们的索引由日期时间戳对象组成,而length=2284freq='W-SAT'告诉我们,我们有2284个每周日期时间戳,从星期六开始。

每周数据可能很难处理,因此让我们改为使用时间序列的月均值。这可以通过使用方便的resample函数来实现,该函数允许我们将时间序列分组为桶(1个月),在每个组上应用函数(均值),并组合结果(每组一行)。

y = co2['co2'].resample('MS').mean()

在这里,术语MS表示我们按月份将数据分组到桶中,并确保我们使用每个月的开始作为时间戳:

y.head(5)
1958-03-01    316.100
1958-04-01    317.200
1958-05-01    317.120
1958-06-01    315.800
1958-07-01    315.625
Freq: MS, Name: co2, dtype: float64

pandas的一个有趣特性是它能够处理日期时间戳索引,这使我们能够快速地切片我们的数据。例如,我们可以将数据集切片,仅检索1990年之后的数据点:

y['1990':]
1990-01-01    353.650
1990-02-01    354.650...   
2001-11-01    369.375
2001-12-01    371.020
Freq: MS, Name: co2, dtype: float64

或者,我们可以将数据集切片,仅检索1995年10月到1996年10月之间的数据点:

y['1995-10-01':'1996-10-01']
1995-10-01    357.850
1995-11-01    359.475
1995-12-01    360.700
1996-01-01    362.025
1996-02-01    363.175
1996-03-01    364.060
1996-04-01    364.700
1996-05-01    365.325
1996-06-01    364.880
1996-07-01    363.475
1996-08-01    361.320
1996-09-01    359.400
1996-10-01    359.625
Freq: MS, Name: co2, dtype: float64

通过适当地为处理时间数据进行索引,我们可以继续处理可能缺失的值。

第四步 — 处理时间序列数据中的缺失值

现实世界的数据往往是杂乱的。正如我们从图中所看到的,时间序列数据中包含缺失值并不罕见。检查缺失值的最简单方法要么是直接绘制数据,要么是使用下面的命令来查看输出中的缺失数据:

y.isnull().sum()

5

这个输出告诉我们,在我们的时间序列中有 5 个月的数据缺失。

通常情况下,如果缺失值不是太多,我们应该“填补”这些缺失值,以免数据中出现间断。我们可以使用 pandas 中的 fillna() 命令来实现这一点。为简单起见,我们可以使用时间序列中最接近的非空值来填补缺失值,尽管需要注意的是,有时滚动均值可能更可取。

y = y.fillna(y.bfill())

填补了缺失值之后,我们可以再次检查是否存在任何空值,以确保我们的操作成功:

y.isnull().sum()

0

经过这些操作之后,我们看到我们已经成功填补了时间序列中的所有缺失值。

第五步 — 可视化时间序列数据

在处理时间序列数据时,通过可视化可以揭示很多信息。一些需要注意的事项包括:

  • 季节性数据是否显示出明显的周期模式?
  • 趋势数据是否遵循一致的上升或下降趋势?
  • 噪音是否存在任何与其余数据不一致的异常值或缺失值?

我们可以使用 pandasmatplotlib API 的封装来显示数据集的图表:

y.plot(figsize=(15, 6))
plt.show()

!时间序列可视化图 1

当我们绘制数据时,一些明显的模式出现了。时间序列具有明显的季节性模式,以及总体上升的趋势。我们还可以使用一种称为时间序列分解的方法来可视化我们的数据。顾名思义,时间序列分解允许我们将时间序列分解为三个不同的组成部分:趋势、季节性和噪音。

幸运的是,statsmodels 提供了方便的 seasonal_decompose 函数来执行季节性分解。如果您有兴趣了解更多信息,可以在以下论文中找到其原始实现的参考资料:“STL: A Seasonal-Trend Decomposition Procedure Based on Loess.”

下面的脚本展示了如何在 Python 中执行时间序列季节性分解。默认情况下,seasonal_decompose 返回一个相对较小的图形,因此代码块的前两行确保输出图形足够大,以便我们进行可视化。

from pylab import rcParams
rcParams['figure.figsize'] = 11, 9decomposition = sm.tsa.seasonal_decompose(y, model='additive')
fig = decomposition.plot()
plt.show()

!时间序列季节性-趋势分解可视化图 2

使用时间序列分解可以更容易地快速识别数据中的均值变化或变异性。上面的图表清楚地显示了数据的上升趋势,以及其年度季节性。这些可以用来理解我们时间序列的结构。时间序列分解背后的直觉很重要,因为许多预测方法都建立在这种结构化分解的概念之上,以生成预测。

结论

如果您跟随本指南,现在您已经具备了在 Python 中可视化和操作时间序列数据的经验。

为了进一步提高您的技能,您可以加载另一个数据集,并重复本教程中的所有步骤。例如,您可以使用 pandas 库读取一个 CSV 文件,或者使用 statsmodels 库预先加载的 sunspots 数据集:data = sm.datasets.sunspots.load_pandas().data


http://www.ppmy.cn/news/1350385.html

相关文章

代码随想录算法训练营day 29|第七章 回溯算法part05

491.递增子序列 本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。 代码随想录 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 这道题本身没那么难想到,但…

unity2017 遇到visual studio 2017(社区版) 30日试用期到了

安装unity2017 遇到visual studio 2017 30日试用期到了,网上百度搜了好多方法都没有成功。 最后用了这个方法: 1)启动vs2017,在弹出要登录的窗口之前,迅速的点击工具-》选项-》账户,勾选在添加账户或对账户重新进行身…

〔025〕Stable Diffusion 之 接口开发 篇

✨ 目录 ▷ 启动接口▷ 接口文档▷ 接口开发▷ 代码解释 ▷ 启动接口 想要在各种其他服务中对接 Stable Diffusion 的绘画功能,需要开启 Stable Diffusion 的 api 功能开发接口需要有一定的技术功底才可以,非技术人员其实不用学习直接在 webui-user.bat…

【Java程序设计】【C00264】基于Springboot的原创歌曲分享平台(有论文)

基于Springboot的原创歌曲分享平台(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的原创歌曲分享平台 本系统分为平台功能模块、管理员功能模块以及用户功能模块。 平台功能模块:在平台首页可以查看首…

分布式系统架构介绍

1、为什么需要分布式架构? 增大系统容量:单台系统的性能瓶颈,多台机器才能应对大规模的应用场景,所以就需要我们的应用支撑平台具备分布式架构。 加强系统的可用:为了满足业务的SLA要求,需要通过分布式架构…

【LeetCode】37. 解数独(困难)——代码随想录算法训练营Day30

题目链接:37. 解数独 题目描述 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&…

C++泛型编程:模板偏特化

模板偏特化为模板提供特殊的实现,针对特定的模板参数或参数组合。 在模板全特化,所有的模板参数都被指定了具体的类型。 我们可以在泛化设计中提供一个特化版本,针对其中某个或者数个模板参数进行特化,我们可以指定一部分模板参…

STM32自学☞定时器定时中断案例

timer_interrupt.c文件 /* 初始化函数编写步骤: 1.打开时钟 2.选择时基单元的时钟源(内部时钟源) 3.配置时基单元 4.NVIC配置 5.启动定时器 */ #include "stm32f10x.h" #include "stm32f10x_tim.h" #include …

​​​​​​C#系列-C#EF框架实现分库分表(21)

在C#中使用Entity Framework (EF)框架实现分库分表(也称为数据库分片或水平切分)是一个相对复杂的过程,因为EF本身并不直接支持分库分表。分库分表通常是为了解决单一数据库的性能瓶颈、数据量过大、高并发等问题而采取的一种策略。 实现分库…

速盾:cdn集群防御空间dns服务器

在当今数字化时代,网络安全和性能成为了企业关注的焦点。速盾的CDN集群防御空间DNS服务器技术为网站提供了更高水平的安全性和性能优化。本文将深入探讨这一技术的关键特点和优势。 1. 集群防御: 速盾的CDN集群防御通过分布在全球的节点集群,…

【Python】单元测试unittest框架

note 使用unittest框架进行单元测试是Python标准库的一部分,提供了编写测试用例、测试套件以及运行测试的能力。测试用例是继承自unittest.TestCase的类。在这个类中,你可以定义一系列的方法来测试不同的行为。每个测试方法都应该以test开头。 文章目录…

华为配置车地通信快速切换实验

配置车地通信快速切换示例 组网图形 图1 配置车地通信快速切换业务示意图 组网需求配置思路配置注意事项操作步骤配置文件 组网需求 某轨交企业为了降低网络部署成本,提升服务质量,希望通过WLAN技术实现车地通信,使部署在地面网络的组播服务器…

已解决org.springframework.web.HttpMediaTypeNotAcceptableException异常的正确解决方法,亲测有效!!!

已解决org.springframework.web.HttpMediaTypeNotAcceptableException异常的正确解决方法,亲测有效!!! 文章目录 问题分析 报错原因 解决思路 解决方法 总结 问题分析 在Spring MVC应用中处理HTTP请求时,我们有…

JavaI/O流 File类(文件)

目录 File类实例 File类 Java的File类是java.io.File的一个类,它表示文件或目录的路径名。这个类在处理文件和目录时非常有用,它提供了很多静态方法来操作文件和目录。 以下是一些File类的常见方法: 构造方法:创建表示文件或目…

洛谷: P1308 [NOIP2011 普及组] 统计单词数

前言: 这道题没理解清题目表达意思,我开始想的是用map来记录个数,然后一个变量记录一开始出现的单词位置,不挺简单的吗,然后....就AC了2个..从错误提示能看到个数没啥问题,但是第一个单词位置不对,看了新样…

【原创 附源码】Flutter安卓及iOS海外登录--Google登录最详细流程

最近接触了几个海外登录的平台,踩了很多坑,也总结了很多东西,决定记录下来给路过的兄弟坐个参考,也留着以后留着回顾。更新时间为2024年2月8日,后续集成方式可能会有变动,所以目前的集成流程仅供参考&#…

三、案例 - MySQL数据迁移至ClickHouse

MySQL数据迁移至ClickHouse 一、生成测试数据表和数据1.在MySQL创建数据表和数据2.在ClickHouse创建数据表 二、生成模板文件1.模板文件内容2.模板文件参数详解2.1 全局设置2.2 数据读取(Reader)2.3 数据写入(Writer)2.4 性能设置…

15 ABC基于状态机的按键消抖原理与状态转移图

1. 基于状态机的按键消抖 1.1 什么是按键? 从按键结构图10-1可知,按键按下时,接点(端子)与导线接通,松开时,由于弹簧的反作用力,接点(端子)与导线断开。 从…

Linux操作系统基础(三):虚拟机与Linux系统安装

文章目录 虚拟机与Linux系统安装 一、系统的安装方式 二、虚拟机概念 三、虚拟机的安装 四、Linux系统安装 1、解压人工智能虚拟机 2、找到解压目录中的node1.vmx 3、启动操作系统 虚拟机与Linux系统安装 一、系统的安装方式 Linux操作系统也有两种安装方式&#xf…

STM32控制JQ8400语音播报模块

时间记录:2024/2/7 一、JQ8400引脚介绍 标示说明ONE LINE一线操作引脚BUSY忙信号引脚,正在播放语音时输出高电平RX串口两线操作接收引脚TX串口两线操作发送引脚GND电源地引脚DC-5V电源引脚,3.3-5VDAC-RDAC输出右声道引脚DAC-LDAC输出左声道…
最新文章