第 2 篇:初探时间序列 - 可视化与基本概念

第 2 篇:初探时间序列 - 可视化与基本概念

在这里插入图片描述

(图片来源: Luke Chesser on Unsplash)

在上一篇《你好,时间序列!》中,我们了解了什么是时间序列数据以及学习它的重要性。现在,是时候卷起袖子,真正开始接触和探索这些按时间流动的数据了!

本篇我们将聚焦于:

  1. 如何使用 Python 加载和处理时间序列数据? (基础操作)
  2. 如何通过可视化让时间序列“说话”? (核心技能)
  3. 时间序列通常由哪些基本“成分”构成? (核心概念)

准备好你的 Python 环境 (Pandas, Matplotlib/Seaborn),让我们开始吧!

数据加载与基础操作:Pandas 的魔法

处理时间序列数据,Pandas 库是我们的得力助手。它提供了强大的 TimestampDatetimeIndex 对象,专门用于处理时间信息。

假设我们有一个 CSV 文件 my_time_series.csv,内容如下:

Date,Value
2023-01-01,10
2023-01-02,12
2023-01-03,15
2023-01-04,13
2023-01-05,16
...

我们可以这样加载它,并确保日期列被正确识别为时间索引:

import pandas as pd# 加载数据
# parse_dates=['Date'] 告诉 Pandas 'Date' 列包含日期信息
# index_col='Date' 将 'Date' 列设置为 DataFrame 的索引
try:# 假设文件在当前目录下df = pd.read_csv('my_time_series.csv', parse_dates=['Date'], index_col='Date')print("数据加载成功!")
except FileNotFoundError:print("错误:找不到 my_time_series.csv 文件。请确保文件路径正确。")# 为了演示,我们创建一个简单的示例 DataFrameprint("将创建一个示例 DataFrame 继续演示...")dates = pd.to_datetime(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05'])values = [10, 12, 15, 13, 16]df = pd.DataFrame({'Value': values}, index=dates)# 查看数据前几行和索引类型
print("\n数据概览:")
print(df.head())
print("\n索引类型:")
print(type(df.index))

关键点:

  • parse_dates=['列名']:让 Pandas 尝试将指定列解析为日期时间格式。
  • index_col='列名':将解析后的日期时间列设置为 DataFrame 的索引。这会创建一个 DatetimeIndex

为什么 DatetimeIndex 很重要?

拥有 DatetimeIndex 后,我们可以方便地进行基于时间的各种操作,例如:

  • 按时间范围选择数据 (Slicing):
# 选择 2023 年 1 月的数据
print("\n选择 2023 年 1 月数据:")
try:print(df['2023-01'])
except KeyError:print("示例数据中没有完整的 1 月数据,此为切片示例。")print(df['2023-01-01':'2023-01-03']) # 选择特定日期范围# 选择特定日期
print("\n选择 2023 年 1 月 2 日的数据:")
print(df.loc['2023-01-02'])
  • 重采样 (Resampling): 改变时间序列的频率(例如,从日数据变为月度平均数据)。我们后面会更详细地接触。
# 简单示例:计算月度平均值 (如果数据足够多)
# 'M' 表示 月末 (Month End)
# .mean() 计算平均值
try:monthly_mean = df.resample('M').mean()print("\n月度平均值 (如果数据覆盖多月):")print(monthly_mean)
except Exception as e:print(f"\n计算月度平均值出错 (可能是数据量太少): {e}")

可视化:让数据“说话”

时间序列最直观的探索方式就是画图折线图 (Line Plot) 是我们的首选,它能清晰地展示数据点如何随着时间变化。

我们将使用 MatplotlibSeaborn (通常基于 Matplotlib 提供更美观的图形) 来绘图。

import matplotlib.pyplot as plt
import seaborn as sns# 设置绘图风格 (可选)
sns.set_style("whitegrid")# 创建图形
plt.figure(figsize=(12, 6)) # 设置图形大小# 绘制折线图
plt.plot(df.index, df['Value'], marker='o', linestyle='-')
# 或者使用 Seaborn
# sns.lineplot(data=df, x=df.index, y='Value', marker='o')# 添加标题和标签
plt.title('My Time Series Data Over Time')
plt.xlabel('Date')
plt.ylabel('Value')# 优化日期显示 (可选)
plt.xticks(rotation=45)
plt.tight_layout() # 调整布局防止标签重叠# 显示图形
plt.show()

(请运行上面的代码,生成的图就是这里应该展示的内容。一个简单的折线图,X 轴是时间,Y 轴是数值。)

如何解读图形?

盯着这张图,试着回答以下问题:

  1. 整体趋势 (Trend): 数据是长期来看是上升的?下降的?还是保持水平?(看大方向
  2. 周期性模式 (Seasonality/Cycles): 是否存在固定时间间隔内(比如每年、每周、每天)反复出现的模式?(看重复的波峰波谷
  3. 异常点 (Outliers): 是否有某个或某几个点显得特别“突兀”,远离整体模式?
  4. 波动性 (Volatility): 数据变化的幅度是大致恒定的,还是时大时小?

通过可视化,我们就能对时间序列的特性有一个初步的、直观的认识。

时间序列的基本成分 (概念引入)

刚才我们在解读图形时提到了“趋势”、“周期性模式”等,这些其实就是时间序列数据通常包含的基本成分。理解这些成分对于后续分析和建模至关重要。

一个时间序列 Y(t) 通常被认为可以分解为以下几个(并非所有序列都包含全部)主要部分:

  1. 趋势 (Trend, T(t)):

    • 描述数据在长期内的主要走向或基本趋势。
    • 可以是上升的(如经济增长)、下降的(如某种技术被淘汰)或水平的。
    • 想象成一条贯穿数据中心的平滑曲线。
  2. 季节性 (Seasonality, S(t)):

    • 指数据在一个固定且已知的时间周期内(如一年、一季度、一周、一天)表现出的、可预测的模式性波动。
    • 例如:冰淇淋销量夏季高、冬季低(周期为年);工作日通勤交通量早晚高峰(周期为天)。
    • 关键: 周期长度是固定的。
  3. 周期性 (Cyclicality, C(t)):

    • 指数据在非固定长度的时期内出现的长期波动,通常与经济周期等宏观因素相关。
    • 周期长度通常比季节性长(比如几年甚至几十年),且没有固定的时间间隔。
    • 注意: 这个成分对于初学者来说比较难识别和处理,我们初期会更多关注趋势和季节性。
  4. 随机性 / 噪声 / 残差 (Noise / Irregular / Residual, R(t)):

    • 剔除掉趋势、季节性和周期性成分后,数据中剩余的、不规则的、通常是随机的波动。
    • 可以看作是模型无法解释的部分。
      在这里插入图片描述

(这张图展示了一个序列 (Data) 被分解为趋势 (Trend)、季节性 (Seasonal) 和残差 (Remainder/Residual) 的经典示例)

我们目前只需要理解这些概念即可,下一篇我们将学习如何使用工具实际地将一个时间序列分解开来。

小结与代码示例回顾

今天我们:

  • 学会了使用 pandas 加载时间序列数据,并理解了 parse_datesindex_col 的重要性,创建了 DatetimeIndex
  • 掌握了使用 matplotlibseaborn 绘制时间序列折线图这一核心可视化技能。
  • 学习了如何从图中初步观察趋势季节性等模式。
  • 理解了时间序列通常包含的趋势 (T)季节性 (S)周期性 ©随机性 ® 四个基本成分(概念层面)。

完整代码示例:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns# 1. 生成示例数据 (包含趋势和季节性)
np.random.seed(42) # for reproducibility
dates = pd.date_range(start='2022-01-01', periods=365 * 2, freq='D') # 2 年的日数据
trend = np.linspace(0, 10, len(dates)) # 线性上升趋势
seasonality = 5 * np.sin(2 * np.pi * dates.dayofyear / 365.25) # 年度季节性
noise = np.random.normal(0, 1, len(dates)) # 随机噪声
values = trend + seasonality + noise + 20 # 基线值为 20# 创建 DataFrame
df_generated = pd.DataFrame({'Value': values}, index=dates)print("生成的示例数据概览:")
print(df_generated.head())
print("\n索引类型:")
print(type(df_generated.index))# 2. 可视化
sns.set_style("whitegrid")
plt.figure(figsize=(14, 7))# 绘制折线图
sns.lineplot(data=df_generated, x=df_generated.index, y='Value')# 添加标题和标签
plt.title('Generated Time Series with Trend and Seasonality')
plt.xlabel('Date')
plt.ylabel('Value')# 优化日期显示
plt.xticks(rotation=30)
plt.tight_layout()# 显示图形
plt.show()# 3. 初步解读
print("\n观察上图:")
print("- 整体看,数据是不是有一个向上的大方向?(趋势)")
print("- 数据是不是每年都在重复相似的上下波动模式?(季节性)")

通过观察生成的图,你应该能比较清晰地看到我们定义的“趋势”(整体向上)和“季节性”(每年重复的波浪形)。

下一篇预告

现在我们对时间序列有了直观感受,也知道了它可能包含哪些成分。那么,如何更精确地把这些成分分离出来呢?下一篇,我们将深入探讨时间序列分解 (Time Series Decomposition) 技术,学习如何量化地识别和提取趋势与季节性。

敬请期待!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux服务器配置Anaconda环境、Pytorch库(图文并茂的教程)

引言:为了方便后续新进组的 师弟/师妹 使用课题组的服务器,特此编文(ps:我导从教至今四年,还未招师妹) ✅ NLP 研 2 选手的学习笔记 笔者简介:Wang Linyong,NPU,2023级&a…

Spring-AOP分析

Spring分析-AOP 1.案例引入 在上一篇文章中,【Spring–IOC】【https://www.cnblogs.com/jackjavacpp/p/18829545】,我们了解到了IOC容器的创建过程,在文末也提到了AOP相关,但是没有作细致分析,这篇文章就结合示例&am…

【Python网络爬虫开发】从基础到实战的完整指南

目录 前言:技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现(10个案例)案例1:基础静态页面抓取案例2:动…

服务器监控软件推荐

以下是几款常用的服务器监控软件推荐,涵盖开源和商业方案,适用于不同规模和需求: 一、开源免费方案 Prometheus Grafana 特点:时序数据库 可视化仪表盘,支持多维度监控和告警。适用场景:云原生、Kubernet…

编译原理实验(四)———— LR(1)分析法

一、实验目的 掌握LR(1)分析法的基本原理与实现流程。通过构造LR(1)分析表,验证符号串是否符合给定文法规则。理解LR(1)分析中向前搜索符(Lookahead Symbol)的作用,解决移进-归约冲突。 二、实验题目 1.对下列文法,用…

vue3 主题模式 结合 element-plus的主题

vue3 主题模式 结合 element-plus的主题 npm i element-plus --save-dev在 Vue 3 中,实现主题模式主要有以下几种方式 1.使用 CSS 变量(自定义属性) CSS 变量是一种在 CSS 中定义可重用值的方式。在主题模式中,可以将颜色、字体…

科大讯飞Q1营收46.6亿同比增长27.7%,扣非净利同比增长48.3%

4月21日盘后,AI龙头科大讯飞(002230.SZ)发布2024年报,公司全年实现营业收入233.43亿元,同比增长18.79%,同期归母净利润为5.6亿元。 公司核心赛道业务保持快速增长,消费者、教育、汽车、医疗业务…

Day5-UFS总结

UFS 传输协议的本质:两个收发器件,对需要传输的数据,一层一层的封装和解析,利用封装增加的额外信息,做一些数据处理,完成源地址到目标地址的数据传输功能。 应用协议的本质:基于某种传输协议之…

嵌入式工程师( C / C++ )笔试面试题汇总

注:本文为 “嵌入式工程师笔试面试题” 相关文章合辑。 未整理去重。 如有内容异常,请看原文。 嵌入式必会 C 语言笔试题汇总 Z 沉浮 嵌入式之旅 2021 年 01 月 19 日 00:00 用预处理指令 #define 声明一个常数,用以表明 1 年中有多少秒&a…

29-JavaScript基础语法(函数)

知识目标 理解函数的基本概念;掌握函数的定义和调用;理解函数参数和返回值及作用域;掌握函数高阶用法。 1. 理解函数的基本概念 明确函数在 JavaScript 里是一段可重复使用的代码块,它能接收输入参数,执行特定任务&…

AI答题pk机器人来袭

AI答题PK机器人是一种具备知识问答竞赛功能的人工智能程序。以下为您详细介绍: 一、实时对战:能在答题排位PK升级赛中,与用户进行1V1在线实时PK答题 。比如在一些知识竞赛类APP中,用户可匹配到AI机器人对手,在规定时…

PclSharp ——pcl的c#nuget包

简介: NuGet Gallery | PclSharp 1.8.1.20180820-beta07 下载.NET Framework 4.5.2 Developer Pack: 下载 .NET Framework 4.5.2 Developer Pack Offline Installer 离线安装nupkg: nupkg是visual studio 的NuGet Package的一个包文件 安…

【Unity笔记】Unity音视频播放监听器封装笔记:VideoPlayer + AudioSource事件触发与编辑器扩展

关键点 Unity VideoPlayer 播放结束事件Unity AudioSource 播放检测 Unity音视频播放监听器封装笔记:VideoPlayer AudioSource事件触发与编辑器扩展 在 Unity 的多媒体开发中,我们经常需要监听 VideoPlayer 或 AudioSource 的播放状态,以便…

WPF常用技巧汇总

主要用于记录工作中发现的一些问题和常见的解决方法。 此文会持续更新。 >abp new Evan.MyWpfApp -t wpf --old --framework .net8 1. 解决不同屏幕分辨率下的锯齿问题 UseLayoutRounding"True" <Grid UseLayoutRounding"True"><Border Mar…

分数线降低,25西电马克思主义学院(考研录取情况)

1、马克思主义学院各个方向 2、马克思主义学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、马克思主义理论25年相较于24年下降10分&#xff0c;为355分 3、25vs24推免/统招人数对比 学长、学姐分析 由表可看出&#xff1a; 1、 马克思主义学院25年共接…

【Linux网络】构建UDP服务器与字典翻译系统

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

【项目管理】成本类计算 笔记

项目管理-相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 &#xff08;一&#xff09;知识总览 项目管理知识域 知识点&#xff1a; &#xff08;项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域&#xff09; 对应&…

div(HTML标准元素)和view(微信小程序专用组件)的主要区别体

div&#xff08;HTML标准元素&#xff09;和view&#xff08;微信小程序专用组件&#xff09;的主要区别体现在以下方面&#xff1a; 一、应用场景与开发框架 ‌适用平台不同‌ div是HTML/CSS开发中通用的块级元素&#xff0c;用于Web页面布局‌&#xff1b;view是微信小程序专…

【C++软件实战问题排查经验分享】UI界面卡顿 | CPU占用高 | GDI对象泄漏 | 线程堵塞 系列问题排查总结

目录 1、UI界面卡顿问题排查 2、软件CPU占用高问题排查 3、UI界面显示异常&#xff08;GDI对象泄漏导致窗口绘制异常&#xff09;问题排查 4、软件线程堵塞&#xff08;包含线程死锁&#xff09;问题排查 5、最后 C软件异常排查从入门到精通系列教程&#xff08;核心精品专…

管理杂谈——采石矶大捷的传奇与启示

南宋抗金史上&#xff0c;岳飞与岳家军的铁血传奇家喻户晓&#xff0c;但另一位力挽狂澜的“文官战神”却常被忽视——他从未掌兵&#xff0c;却在南宋存亡之际整合溃军&#xff0c;以少胜多&#xff0c;缔造采石矶大捷。此人正是虞允文。一介书生何以扭转乾坤&#xff1f;他的…