乐趣区

关于机器学习:超长时间序列数据可视化的6个技巧

工夫序列是由示意工夫的 x 轴和示意数据值的 y 轴组成,应用折线图在显示数据随时间推移的停顿时很常见。它在提取诸如趋势和季节性影响等信息方面有一些益处。

然而在解决超长的时间轴时有一个问题。只管应用数据可视化工具能够很容易地将长时间序列数据拟合到绘图区域中,但后果可能会很凌乱。让咱们比拟一下上面的两个示例。

上图显示了 2021 年的每日温度数据

上图像显示了 1990-2021 年的每日温度数据

尽管咱们能够在第一张图上看到细节,但第二张图因为蕴含了很长的工夫序列数据,所以无奈看到细节,一些有重要的数据点可能会被暗藏。

为了解决这个问题,本文将介绍 6 种简略的技巧,帮忙更无效地出现长时间序列数据。

获取数据

本文将应用都柏林机场每日数据,蕴含自 1942 年以来在都柏林机场测量的气象数据。数据集蕴含每日天气信息,如温度、风速、气压等。

导入必要的库

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 文件

df = pd.read_csv('location/file name.csv')
df['date'] = pd.to_datetime(df['date'])
df.tail()
df.info()

一个好消息是数据集没有缺失值。

筹备数据

这里应用最高和最低温度数据。所用的工夫是从 1990 年到 2021 年,总共 32 年。如果想抉择其余变量或范畴,请随便批改上面的代码。

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()

创立一些当前应用的日期特色。

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 绘制一个根本的工夫序列图。稍后能够将后果与本文中的其余可视化后果进行比拟。

plt.figure(figsize=(16,9))
sns.set_style('darkgrid')
sns.lineplot(data=df_temp, y='meantp', x ='date')
plt.show()

能够看到的图表过于密集,让咱们看看如何解决这个问题。

解决超长工夫序列数据的可视化

咱们用 6 个简略的技巧来出现一个长时间序列:

1、放大和放大

咱们能够创立一个交互式图表,后果能够放大或放大以查看更多细节。所以 Plotly 是一个很有用的库,能够帮忙咱们创立交互式图表。

用一行代码间接绘制一个简略的交互式工夫序列图。

px.line(df_temp, x='date', y='meantp')

从后果中,咱们能够看到整体数据,同时可能放大咱们想要扩大的区域,这可能是 Plotly 惟一一个比 matplotlib 强的中央😁

2、突出显示数据点

如果须要留神某些值,能够用标记突出显示数据点。在交互式图中增加散点有助于标记要害的数据点,这时就能够针对性的放大查看更多细节。

当初让咱们在之前的交互图中增加散点。例如,咱们将别离关注高于 20.5°C 和低于 -5°C 的平均温度。

df_dot = df_temp[(df_temp['meantp']>=20.5)|(df_temp['meantp']<=-5)]

fig = px.line(df_temp, x='date', y='meantp')
fig.add_trace(go.Scatter(x =df_dot.date, y=df_dot.meantp,
                         mode='markers',
                         marker=dict(color='red', size=6)))
fig.update_layout(showlegend=False)

3、增加分割线

如果须要关注某些畛域,绘制分割线能够分隔特定的数据值。例如,增加两条线来查看平均温度高于和低于 20.5°C 和 -5°C 的一天。

fig = px.line(df_temp, x='date', y='meantp')
fig.add_hline(y=20, line_width=1.5,
              line_dash='dash', line_color='red')
fig.add_hline(y=-5, line_width=1.5,
              line_dash='dash', line_color='red')
fig.update_layout(showlegend=False)

咱们能够更加关注线下面或线上面的数据点。

4、查看数据分布

箱形图是一种通过四分位数展现数据分布的办法。箱形图上的信息显示了局部性、扩散性和偏度,它还有助于辨别异样值,即从其余察看中显著突出的数据点。咱们只需一行代码就能够间接绘箱形图。

px.box(df_temp, x='month_year', y='meantp')

5、分组并显示比例

这种办法能够将工夫序列图转换为热图,后果将显示总体均匀月温度,并且能够应用色彩标度来比拟数据的大小。

为了便于绘图,须要将数据帧转换为二维。首先按年和月对 DataFrame 进行分组。

df_mean = df_temp.groupby(['year','month']).mean().reset_index()
df_mean.head()
df_cross = df_mean.set_index(['year','month'])['meantp'].unstack()
df_cross

应用 Plotly 绘制热图也只须要一行代码。

px.imshow(df_cross, height=700, aspect='auto',
          color_continuous_scale='viridis')

6、应用雷达图比拟月份

在可视化工夫序列数据时,通常会思考随工夫挪动的间断线。咱们能够扭转一下观测形式,将这些线画在圆形中,就像在时钟上挪动它们一样。雷达图能够用于比拟同一类别数据的可视化图。咱们能够通过在圆上绘制月份来比拟年份同期的数据值。

首先筹备一份月份、年份和色彩的列表

months = [str(i) for i in list(set(df_mean.month))] + ['1']
years = list(set(df_mean.year))

pal = list(sns.color_palette(palette='viridis',
                             n_colors=len(years)).as_hex())

应用 for 循环函数在雷达图上绘制直线。

fig = go.Figure()
for i,c in zip(years,pal):
    df = df_mean[df_mean['year']==i]
    val = list(df.meantp)*2
    fig.add_trace(go.Scatterpolar(r=val, theta=months,
                                  name=i, marker=dict(color=c)))
fig.update_layout(height=800)

创立交互式雷达图容许对后果进行过滤,并且能够通过将光标悬停在数据点上来显示信息。

总结

对工夫序列进行可视化能够提取趋势或节令效应等信息。应用简略的工夫序列图显示超长工夫序列数据可能会因为重叠区域而导致图表凌乱。

本文展现了 6 种用于绘制长时间序列数据的可视化办法,通过应用交互函数和扭转视角,我能够使后果变得敌对并且可能帮忙咱们更加关注重要的数据点。

最初这些办法只是一些想法。我置信还有其余可视化办法也能够用来解决这个问题。如果有任何倡议,请随时留言。

https://avoid.overfit.cn/post/dc059f34ae074a0ba09a63109bdfdf60

作者:Boriharn K

退出移动版