数据导入与预处理-拓展-pandas时间数据处理03(上)

简介: 数据导入与预处理-拓展-pandas时间数据处理03Pandas时序数据系列博客1. 时间序列数据1. 1 时间序列概述

1. 时间序列数据

1. 1 时间序列概述

百科中关于时间序列的描述为:


时间序列(或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。时间序列分析的主要目的是根据已有的历史数据对未来进行预测。经济数据中大多数以时间序列的形式给出。根据观察时间的不同,时间序列中的时间可以是年份、季度、月份或其他任何时间形式


时间序列的构成要素:


构成要素:长期趋势,季节变动,循环变动,不规则变动。

1)长期趋势(T)现象在较长时期内受某种根本性因素作用而形成的总的变动趋势。

2)季节变动(S)现象在一年内随着季节的变化而发生的有规律的周期性变动。

3)循环变动(C)现象以若干年为周期所呈现出的波浪起伏形态的有规律的变动。

4)不规则变动(I)是一种无规律可循的变动,包括严格的随机变动和不规则的突发性影响很大的变动两种类型。


金融市场中,时序数据十分常见,我们购买股票,虚拟货币,一定会获得收益吗?实际上我们没法保证一定会有很好的收益,但可以根据之前的股票/虚拟货币价格估算出近似价值。时序模型就是预测这些值的一种方式。



除此之外在很多重要的领域,比如预测太阳活动和海洋潮汐、预测某公司接下来一年的销售额,工业领域预测下个月的能源消耗等,都是根据之前每年、每月和每天的数据,预测接下来的值,这些都是可以用时间序列的应用。

2. 时序数据分析

本文使用案例为高铁服务商 JetRail 旗下高铁的乘客数量。数据下载地址:

训练集为2012 年 8 月至 2014 年 8月的数据,需要用这些数据预测接下来 7 个月的乘客数量。

实现内容如下:


安装程序库(statsmodels)

方法1——先以朴素法开始

方法2——简单平均数

方法3——移动平均数

方法4——指数平滑法

方法5——霍尔特线性趋势预测

方法6——Holt-Winters季节性预测模型

方法7——自回归移动平均模型

1.2 数据集导入与处理

1. 查看数据

读取训练集数据

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
#Importing data
df = pd.read_csv('train.csv')
df

输出为:



如上面的输出语句所示,我们获得了 2012-2014 年两年每个小时的乘客数量,然后需要预测未来的乘客数量。

读取测试集数据

df_test = pd.read_csv('Test.csv')
df_test

输出为:


查看训练集类型

df.info()

输出为:


可以看到空缺值,类型信息,

2. 数据处理

把Datetime一列转变为时间戳类型

df['Timestamp'] = pd.to_datetime(df['Datetime'],format='%d-%m-%Y %H:%M') 
df

输出为:



3. 切分数据集

取部分数据作为数据集,前 14 个月( 2012 年 8 月- 2013 年 10 月)用作训练数据,后两个月(2013 年 11 月 - 2013 年 12 月)用作测试数据。


为了解释每种方法的不同之处,我以每天为单位构造和聚合了一个数据集。

从 2012 年 8 月- 2013 年 12 月的数据中构造一个数据集。


确定( 2012 年 8 月- 2013 年 10 月)范围

df[df['Timestamp'] < "2013-10-31 23:59:59 "]

输出为:



一共0-10391共10392条数据,10392/24 = 433天


确定( 2013 年 11 月- 2013 年 12 月)范围


df[(df['Timestamp'] > "2013-10-31 23:59:59 ") & (df['Timestamp'] < "2013-12-31 23:59:59 ")]

输出为:



一共10392-11855共1462条数据,1464/24 = 61天

切分训练集和测试集

train = df[df['Timestamp'] < "2013-10-31 23:59:59 "]
print(train.iloc[10391,:])
test = df[(df['Timestamp'] > "2013-10-31 23:59:59 ") & (df['Timestamp'] < "2013-12-31 23:59:59 ")]
test

输出为:


训练集降采样

# 把时间戳列 设置为索引 并按照天为单位进行降采样
train.index = train.Timestamp 
train = train.resample('D').mean() 
train

输出为:


测试集降采样

# 把时间戳列 设置为索引 并按照天为单位进行降采样
test.index = test.Timestamp 
test = test.resample('D').mean() 
test

输出为:



4. 数据分析

将数据可视化(训练数据和测试数据一起),从而得知在一段时间内数据是如何变化的。

# 可视化数据
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams["axes.unicode_minus"]=False # 显示负号
train['Count'].plot(figsize=(15,8), title= 'Daily Ridership', fontsize=14)
test['Count'].plot(figsize=(15,8), title= 'Daily Ridership', fontsize=14)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y')) # 设置坐标轴格式
plt.gca().xaxis.set_major_locator(mdates.MonthLocator())  # 设置坐标轴间隔
plt.gcf().autofmt_xdate()  # 自动旋转日期标记
plt.show()

输出为:


1.3 时间序列分析

1. 安装程序库(statsmodels)

安装:

pip install statsmodels -i https://pypi.tuna.tsinghua.edu.cn/simple

测试:

from statsmodels.tsa.api import ExponentialSmoothing 
• 1

不报错,即为安装正常

2. 方法1:先以朴素法开始

一般来说,短时间内的数据往往是平稳的,我们往往可以根据昨天的数据去预测预测第二天的值,即把明天的数据当成与今天是相同的。这种假设第一个预测点和上一个观察点相等的预测方法就叫朴素法。

用朴素法预测:

dd= np.asarray(train.Count)
y_hat = test.copy()
y_hat['naive'] = dd[len(dd)-1]
plt.figure(figsize=(12,8))
plt.plot(train.index, train['Count'], label='Train')
plt.plot(test.index,test['Count'], label='Test')
plt.plot(y_hat.index,y_hat['naive'], label='Naive Forecast')
plt.legend(loc='best')
plt.title("Naive Forecast")
plt.show()
y_hat

输出为:




我们下面计算均方根误差,检查模型在测试数据集上的准确率。

from sklearn.metrics import mean_squared_error
from math import sqrt
rms = sqrt(mean_squared_error(test.Count, y_hat.naive))
rms

输出为:


从均方根误差值以及上面的图表可以看出,朴素法并不适合变化很大的数据集,最适合稳定性很高的数据集。我们还可以用不同的方法优化结果。下面我们试试其它方法。


3. 方法2:简单平均法

将预期值等同于之前所有观测点的平均值的预测方法就叫简单平均法.

image.png


y_hat_avg = test.copy()
y_hat_avg['avg_forecast'] = train['Count'].mean()
plt.figure(figsize=(12,8))
plt.plot(train['Count'], label='Train')
plt.plot(test['Count'], label='Test')
plt.plot(y_hat_avg['avg_forecast'], label='Average Forecast')
plt.legend(loc='best')
plt.show()
y_hat_avg

输出为:



计算均方根误差值,检查模型的准确率。

rms = sqrt(mean_squared_error(test['Count'], y_hat_avg['avg_forecast']))
rms

输出为:


4. 方法3——移动平均法

之前的简单平均法,使用所有先前数据的平均值,这有些不合理,如果基于某窗口期的平均值预测下一段的值,这就是移动平均法。假设"滑动窗口"的大小值p,使用简单的移动平均模型,我们可以根据之前数值的固定有限数p的平均值预测某个时序中的下一个值。这样,对于所有的 i > p

image.png


y_hat_avg = test.copy()
y_hat_avg['moving_avg_forecast'] = train['Count'].rolling(60).mean().iloc[-1] # 窗口为60 求均值 最后一个 131.761111
plt.figure(figsize=(16,8))
plt.plot(train['Count'], label='Train')
plt.plot(test['Count'], label='Test')
plt.plot(y_hat_avg['moving_avg_forecast'], label='Moving Average Forecast')
plt.legend(loc='best')
plt.show()

输出为:


只选择过去两个月的数据。现在计算均方根误差值,检查模型的准确度。

rms = sqrt(mean_squared_error(test['Count'], y_hat_avg['moving_avg_forecast']))
rms

输出为:


在移动平均法中,各个时间的权重是一致的,如果考虑到不同时间的观察值有着不同的权重,就叫做加权移动平均法。

加权移动平均法其实还是一种移动平均法,只是“滑动窗口期”内的值被赋予不同的权重,通常来讲,最近时间点的值发挥的作用更大了。

相关文章
|
6月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
452 0
|
6月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
637 0
|
8月前
|
存储 数据采集 数据处理
Pandas与NumPy:Python数据处理的双剑合璧
Pandas与NumPy是Python数据科学的核心工具。NumPy以高效的多维数组支持数值计算,适用于大规模矩阵运算;Pandas则提供灵活的DataFrame结构,擅长处理表格型数据与缺失值。二者在性能与功能上各具优势,协同构建现代数据分析的技术基石。
631 0
|
10月前
|
运维 数据挖掘 数据处理
Pandas时间数据处理:从基础到进阶的实战指南
Pandas时间数据处理涵盖了从基础到高级的全面功能。其核心由Timestamp、DatetimeIndex、Period和Timedelta四个类构建,支持精准的时间点与区间操作。内容包括时间数据生成(字符串解析与序列生成)、时间索引与切片、高级运算(偏移重采样与窗口计算)、时区处理、周期性数据分析及实战案例(如智能电表数据)。此外,还涉及性能优化技巧和未来展望,帮助用户高效处理时间序列数据并应用于预测分析等场景。
430 1
|
10月前
|
传感器 安全 数据处理
Pandas时间数据处理:从基础到进阶的实战指南
本文深入讲解Pandas时间数据处理技巧,从时间对象转换到高性能计算全面覆盖。通过真实案例拆解,掌握Timestamp与Period的核心概念、时间序列生成、重采样方法及窗口函数应用。同时剖析时区处理、性能优化策略及常见陷阱解决方案,并展望Pandas 2.0的时间处理新特性。内容强调“时间索引优先”原则,助你高效分析股票K线、用户行为等时间序列数据。
325 0
|
缓存 数据可视化 BI
Pandas高级数据处理:数据仪表板制作
在数据分析中,面对庞大、多维度的数据集(如销售记录、用户行为日志),直接查看原始数据难以快速抓住重点。传统展示方式(如Excel表格)缺乏交互性和动态性,影响决策效率。为此,我们利用Python的Pandas库构建数据仪表板,具备数据聚合筛选、可视化图表生成和性能优化功能,帮助业务人员直观分析不同品类商品销量分布、省份销售额排名及日均订单量变化趋势,提升数据洞察力与决策效率。
300 12
|
数据可视化 数据挖掘 数据处理
Pandas高级数据处理:数据可视化进阶
Pandas是数据分析的强大工具,能高效处理数据并与Matplotlib、Seaborn等库集成,实现数据可视化。本文介绍Pandas在绘制基础图表(如折线图)和进阶图表(如分组柱状图、热力图)时的常见问题及解决方案,涵盖数据准备、报错处理、图表优化等内容,并通过代码案例详细解释,帮助读者掌握数据可视化的技巧。
317 13
|
数据采集 SQL 数据可视化
Pandas高级数据处理:交互式数据探索
Pandas是Python中流行的数据分析库,提供丰富的数据结构和函数,简化数据操作。本文从基础到高级介绍Pandas的使用,涵盖安装、读取CSV/Excel文件、数据查看与清洗、类型转换、条件筛选、分组聚合及可视化等内容。掌握这些技能,能高效进行交互式数据探索和预处理。
219 6
|
数据采集 存储 数据可视化
Pandas高级数据处理:数据报告生成
Pandas 是数据分析领域不可或缺的工具,支持多种文件格式的数据读取与写入、数据清洗、筛选与过滤。本文从基础到高级,介绍如何使用 Pandas 进行数据处理,并解决常见问题和报错,如数据类型不一致、时间格式解析错误、内存不足等。最后,通过数据汇总、可视化和报告导出,生成专业的数据报告,帮助你在实际工作中更加高效地处理数据。
389 8
|
存储 数据挖掘 数据处理
Pandas高级数据处理:数据安全与隐私保护
在数字化时代,数据安全与隐私保护至关重要。本文介绍使用Pandas进行数据分析时常见的安全问题及解决方案,包括数据泄露风险、权限报错、数据类型转换错误等,并结合代码案例详细讲解如何避免和解决这些问题。同时,探讨高级策略如访问控制、匿名化、差分隐私及加密传输存储,确保数据分析合法合规。
405 7

热门文章

最新文章