点击上方“Deephub Imba”,关注公众号,好文章不错过 !
时间序列是由表示时间的x轴和表示数据值的y轴组成,使用折线图在显示数据随时间推移的进展时很常见。它在提取诸如趋势和季节性影响等信息方面有一些好处。
但是在处理超长的时间轴时有一个问题。尽管使用数据可视化工具可以很容易地将长时间序列数据拟合到绘图区域中,但结果可能会很混乱。让我们比较一下下面的两个示例。
上图显示了2021年的每日温度数据
上图像显示了1990-2021年的每日温度数据
虽然我们可以在第一张图上看到细节,但第二张图由于包含了很长的时间序列数据,所以无法看到细节,一些有重要的数据点可能会被隐藏。
为了解决这个问题,本文将介绍6种简单的技巧,帮助更有效地呈现长时间序列数据。
获取数据
本文将使用都柏林机场每日数据,包含自1942年以来在都柏林机场测量的气象数据。数据集包含每日天气信息,如温度、风速、气压等。
导入必要的库
代码语言:javascript复制 import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go
%matplotlib inline
读取CSV文件
代码语言:javascript复制 df = pd.read_csv('location/file name.csv')
df['date'] = pd.to_datetime(df['date'])
df.tail()
代码语言:javascript复制 df.info()
一个好消息是数据集没有缺失值。
准备数据
这里使用最高和最低温度数据。所用的时间是从1990年到2021年,总共32年。如果想选择其他变量或范围,请随意修改下面的代码。
代码语言:javascript复制 start = pd.Timestamp('1990-01-01')
end = pd.Timestamp('2021-12-31')
df_temp = df[(df['date']>=start)&(df['date']<=end)][['date','maxtp','mintp']]
df_temp.reset_index(drop=True, inplace=True)
#create an average temperature column
df_temp['meantp'] = [(i j)/2 for i,j in zip(df_temp.maxtp, df_temp.mintp)]
df_temp.head()
创建一些以后使用的日期特征。
代码语言:javascript复制 df_temp['month'] = pd.DatetimeIndex(df_temp['date']).month
df_temp['year'] = pd.DatetimeIndex(df_temp['date']).year
df_temp['month_year'] = [str(i) '-' str(j) for i,j in zip(df_temp.year, df_temp.month)]
df_temp.head()
绘制时间序列图
下面的代码展示了如何从DataFrame绘制一个基本的时间序列图。稍后可以将结果与本文中的其他可视化结果进行比较。
代码语言:javascript复制 plt.figure(figsize=(16,9))
sns.set_style('darkgrid')
sns.lineplot(data=df_temp, y='meantp', x ='date')
plt.show()
可以看到的图表过于密集,让我们看看如何处理这个问题。
处理超长时间序列数据的可视化
我们用6个简单的技巧来呈现一个长时间序列:
1、放大和缩小
我们可以创建一个交互式图表,结果可以放大或缩小以查看更多细节。所以Plotly是一个很有用的库,可以帮助我们创建交互式图表。
用一行代码直接绘制一个简单的交互式时间序列图。
代码语言:javascript复制 px.line(df_temp, x='date', y='meantp')
从结果中,我们可以看到整体数据,同时能够放大我们想要扩展的区域,这可能是Plotly唯一一个比matplotlib强的地方