每个数据集都有自己的特征,我们使用它们的特征作为特征来深入了解数据。在本文中,我们将讨论一种重要的数据集,即时间序列数据。
什么是时间序列数据
时间序列数据是按连续时间顺序列出的一系列数据点,或者我们可以说时间序列数据是时间上连续等间隔点的序列。时间序列分析包括分析时间序列数据的方法,以提取有意义的见解和数据的其他有价值的特征。
时间序列数据是按连续时间顺序列出的一系列数据点,或者我们可以说时间序列数据是时间上连续等间隔点的序列。时间序列分析包括分析时间序列数据的方法,以提取有意义的见解和数据的其他有价值的特征。
使用Python实现时间序列数据可视化
我们将使用Python库来可视化数据。数据集的链接可以在这里找到。
https://github.com/Neelu-Tiwari/dataset/blob/main/stock_data.csv
我们将像在任何时间序列数据项目中一样一步一步地执行可视化。
导入库
我们将在一个地方导入本文中使用的所有库,这样就不必每次使用时都导入,这将保存我们的时间和精力。
- Numpy -一个用于数值数学计算和处理多维ndarray的Python库,它也有一个非常大的数学函数集合来操作这个数组。
- Pandas -一个构建在NumPy之上的Python库,用于有效的矩阵乘法和矩阵操作,它也用于数据清理,数据合并,数据整形和数据聚合。
- Matplotlib -它用于绘制2D和3D可视化图,它还支持各种输出格式,包括数据图形。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
加载数据集
为了将数据集加载到一个框架中,我们将使用pandas read_csv()函数。我们将使用head()函数打印数据集的前五行。在这里,我们将在read_csv函数中使用’parse_dates’参数将’Date’列转换为DatetimeIndex格式。默认情况下,日期以字符串格式存储,这不是时间序列数据分析的正确格式。
# reading the dataset using read_csv
df = pd.read_csv("stock_data.csv",
parse_dates=True,
index_col="Date")
# displaying the first five rows of dataset
df.head()
输出
Unnamed: 0 Open High Low Close Volume Name
Date
2006-01-03 NaN 39.69 41.22 38.79 40.91 24232729 AABA
2006-01-04 NaN 41.22 41.90 40.77 40.97 20553479 AABA
2006-01-05 NaN 40.93 41.73 40.85 41.53 12829610 AABA
2006-01-06 NaN 42.88 43.57 42.80 43.21 29422828 AABA
2006-01-09 NaN 43.10 43.66 42.82 43.42 16268338 AABA
删除不需要的列
我们将从数据集中删除对我们的可视化不重要的列。
# deleting column
df.drop(columns='Unnamed: 0')
输出
Open High Low Close Volume Name
Date
2006-01-03 39.69 41.22 38.79 40.91 24232729 AABA
2006-01-04 41.22 41.90 40.77 40.97 20553479 AABA
2006-01-05 40.93 41.73 40.85 41.53 12829610 AABA
2006-01-06 42.88 43.57 42.80 43.21 29422828 AABA
2006-01-09 43.10 43.66 42.82 43.42 16268338 AABA
绘制时间序列数据的线图
df['Volume'].plot()
在这里,我们绘制了“Volume”列数据。
现在让我们使用子图绘制所有其他列。
df.plot(subplots=True, figsize=(4, 4))
上面使用的线图很好地显示了季节性。
季节性:在时间序列数据中,季节性是指在小于一年的特定规则时间间隔(如每周、每月或每季度)发生的变化。
重采样:重采样是一种经济地使用数据样本来提高总体参数的准确性和量化总体参数的不确定性的方法。采样几个月或几个星期,制作条形图是另一种非常简单和广泛使用的寻找季节性的方法。在这里,我们将绘制2016年和2017年月份数据的条形图。
重采样并绘制数据
# Resampling the time series data based on monthly 'M' frequency
df_month = df.resample("M").mean()
# using subplot
fig, ax = plt.subplots(figsize=(6, 6))
# plotting bar graph
ax.bar(df_month['2016':].index,
df_month.loc['2016':, "Volume"],
width=25, align='center')
图中有24个条形,每个条形代表一个月。
差分:差分用于计算指定区间的值之间的差异。默认情况下,它是一个,我们可以为图指定不同的值。这是删除数据中趋势的最常用方法。
df.Low.diff(2).plot(figsize=(6, 6))
df.High.diff(2).plot(figsize=(10, 6))
数据集中的趋势
我们可以在数据集中看到趋势的变化,趋势可以帮助我们看到我们正在考虑的数据的价值从长远来看是上升还是下降。
# Finding the trend in the "Open"
# column using moving average method
window_size = 50
rolling_mean = df['Open'].rolling\
(window_size).mean()
rolling_mean.plot()
绘制数据随时间的变化
我们还可以绘制数据随时间发生的变化。有几种方法可以绘制数据的变化。
Shift:Shift函数可用于在指定的时间间隔之前或之后移动数据。我们可以指定时间,默认情况下将数据移动一天。这意味着我们将获得前一天的数据。同时查看前一天的数据和今天的数据是有帮助的。
在这段代码中,.div()函数帮助填充缺少的数据值。如果我们使用df.div(6)它将把df中的每个元素除以6。我们这样做是为了避免’shift()'操作创建的null或缺失值。
在这里,我们使用了.div(df.Close.shift()),它会将df的每个值除以df.Close.shift()以去除空值。
df['Change'] = df.Close.div(df.Close.shift())
df['Change'].plot(figsize=(10, 8), fontsize=16)
我们也可以采取一个特定的时间间隔使图形有一个更清晰的外观。这里我们只绘制了2017年的数据。
df['2017']['Change'].plot(figsize=(10, 6))
时间序列数据集中的箱形图
我们还可以使用箱线图来查看特定列中值的分布。让我们以任务为例。在这里,我们使用datetime获取一个名为Year的新列。然后我们在Y轴上取“Open”列。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# reading the dataset using read_csv
df = pd.read_csv("stock_data.csv", parse_dates=True)
df.drop(columns='Unnamed: 0', inplace=True)
df['Date']= pd.to_datetime(df['Date'])
# extract year from date column
df["Year"] = df["Date"].dt.year
# box plot grouped by year
sns.boxplot(data=df, x="Year", y="Open")