Skip to content

Latest commit

 

History

History
201 lines (139 loc) · 9.28 KB

time-series-data-with-numpy.md

File metadata and controls

201 lines (139 loc) · 9.28 KB

使用 NumPy 的时间序列数据

原文:www.kdnuggets.com/time-series-data-with-numpy

NumPy 时间序列数据图片由 creativeart 提供于 Freepik

时间序列数据的独特之处在于它们彼此之间是顺序相关的。这是因为数据是按一致的时间间隔收集的,例如每年、每天甚至每小时。


我们的三大课程推荐

1. Google 网络安全证书 - 快速进入网络安全职业生涯。

2. Google 数据分析专业证书 - 提升你的数据分析技能

3. Google IT 支持专业证书 - 支持你的组织 IT 事务


时间序列数据在许多分析中都很重要,因为它们可以代表业务问题的模式,如数据预测、异常检测、趋势分析等。

在 Python 中,你可以尝试使用 NumPy 分析时间序列数据集。NumPy 是一个强大的数值和统计计算包,但它也可以扩展到时间序列数据。

我们如何做到这一点?让我们尝试一下。

使用 NumPy 的时间序列数据

首先,我们需要在 Python 环境中安装 NumPy。如果你还没有安装,可以使用以下代码进行安装。

pip install numpy 

接下来,让我们尝试用 NumPy 初始化时间序列数据。如我所提到的,时间序列数据具有顺序和时间特性,因此我们将尝试用 NumPy 创建这些数据。

import numpy as np

dates = np.array(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05'], dtype='datetime64')
dates
Output>>
array(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04',
       '2023-01-05'], dtype='datetime64[D]')

如上面的代码所示,我们用 dtype 参数在 NumPy 中设置数据时间序列。如果没有这些参数,数据会被视为字符串数据,但现在它被视为时间序列数据。

我们可以在不逐个编写的情况下创建 NumPy 时间序列数据。我们可以使用 NumPy 的特定方法来完成这项工作。

date_range = np.arange('2023-01-01', '2025-01-01', dtype='datetime64[M]')
date_range
Output>>
array(['2023-01', '2023-02', '2023-03', '2023-04', '2023-05', '2023-06',
       '2023-07', '2023-08', '2023-09', '2023-10', '2023-11', '2023-12',
       '2024-01', '2024-02', '2024-03', '2024-04', '2024-05', '2024-06',
       '2024-07', '2024-08', '2024-09', '2024-10', '2024-11', '2024-12'],
      dtype='datetime64[M]')

我们创建了 2023 到 2024 年的月度数据,每个月的数据作为值。

之后,我们可以尝试基于 NumPy 日期时间系列分析数据。例如,我们可以创建与日期范围相匹配的随机数据。

data = np.random.randn(len(date_range)) * 10 + 100 
Output>>
array([128.85379394,  92.17272879,  81.73341807,  97.68879621,
       116.26500413,  89.83992529,  93.74247891, 115.50965063,
        88.05478692, 106.24013365,  92.84193254,  96.70640287,
        93.67819695, 106.1624716 ,  97.64298602, 115.69882628,
       110.88460629,  97.10538592,  98.57359395, 122.08098289,
       104.55571757, 100.74572336,  98.02508889, 106.47247489])

使用 NumPy 的随机方法,我们可以生成随机值来模拟时间序列分析。

例如,我们可以尝试使用以下代码进行移动平均分析。

def moving_average(data, window):
    return np.convolve(data, np.ones(window), 'valid') / window

ma_12 = moving_average(data, 12)
ma_12
Output>>
array([ 99.97075433,  97.03945458,  98.20526648,  99.53106381,
       101.03189965, 100.58353316, 101.18898821, 101.59158114,
       102.13919216, 103.51426971, 103.05640219, 103.48833188,
       104.30217122])

移动平均是一个简单的时间序列分析方法,其中我们计算系列子集的均值。在上述示例中,我们使用窗口 12 作为子集。这意味着我们取系列的前 12 个作为子集并计算它们的均值。然后,子集滑动一个位置,我们计算下一个均值子集。

首先的子集是我们取均值的这个子集:

[128.85379394,  92.17272879,  81.73341807,  97.68879621,
       116.26500413,  89.83992529,  93.74247891, 115.50965063,
        88.05478692, 106.24013365,  92.84193254,  96.70640287]

下一个子集是我们将窗口滑动一个位置的地方:

[92.17272879,  81.73341807,  97.68879621,
       116.26500413,  89.83992529,  93.74247891, 115.50965063,
        88.05478692, 106.24013365,  92.84193254,  96.70640287,
        93.67819695]

这就是np.convolve的作用,因为该方法会根据np.ones数组的数量移动并求和系列子集。我们仅使用有效选项来返回可以在没有任何填充的情况下计算的数量。

然而,移动平均通常用于分析时间序列数据,以识别潜在模式和信号,例如金融领域的买入/卖出信号。

说到模式,我们可以用 NumPy 模拟时间序列中的趋势。趋势是数据中的长期且持续的方向性运动。基本上,它是时间序列数据的总体方向。

trend = np.polyfit(np.arange(len(data)), data, 1)
trend
Output>>
array([ 0.20421765, 99.78795983])

上述情况发生的是我们为数据拟合了一条线性直线。从结果中,我们得到了直线的斜率(第一个数字)和截距(第二个数字)。斜率表示数据在每一步或时间值上的平均变化量,而截距则是数据的方向(正值表示上升,负值表示下降)。

我们也可以有去趋势的数据,即在从时间序列中移除趋势后的组件。这种数据类型通常用于检测趋势数据中的波动模式和异常。

detrended = data - (trend[0] * np.arange(len(data)) + trend[1])
detrended
Output>>
array([ 29.06583411,  -7.81944869, -18.46297706,  -2.71181657,
        15.66017371, -10.96912278,  -7.2707868 ,  14.29216727,
       -13.36691409,   4.61421499,  -8.98820376,  -5.32795108,
        -8.56037465,   3.71968235,  -5.00402087,  12.84760174,
         7.8291641 ,  -6.15427392,  -4.89028352,  18.41288776,
         0.6834048 ,  -3.33080706,  -6.25565918,   1.98750918])

上述输出中显示了去除趋势后的数据。在实际应用中,我们会分析这些数据,以查看哪个数据点偏离了常见模式。

我们也可以尝试从我们拥有的时间序列数据中分析季节性。季节性是指在特定时间间隔内发生的规律性和可预测模式,例如每 3 个月、每 6 个月等。季节性通常受假期、天气、事件等外部因素的影响。

seasonality = np.mean(data.reshape(-1, 12), axis=0)
seasonal_component = np.tile(seasonality, len(data)//12 + 1)[:len(data)]
Output>>
array([111.26599544,  99.16760019,  89.68820205, 106.69381124,
       113.57480521,  93.4726556 ,  96.15803643, 118.79531676,
        96.30525224, 103.4929285 ,  95.43351072, 101.58943888,
       111.26599544,  99.16760019,  89.68820205, 106.69381124,
       113.57480521,  93.4726556 ,  96.15803643, 118.79531676,
        96.30525224, 103.4929285 ,  95.43351072, 101.58943888])

在上述代码中,我们计算了每个月的平均值,然后将数据扩展以匹配其长度。最终,我们得到两年间每个月的平均值,并尝试分析数据以查看是否有值得提及的季节性。

这就是我们可以用 NumPy 对时间序列数据和分析所做的基本方法。虽然有很多高级方法,但上述方法是基本的。

结论

时间序列数据是一个独特的数据集,因为它以顺序方式表示,并且具有时间特性。使用 NumPy,我们可以设置时间序列数据,同时进行基本的时间序列分析,如移动平均、趋势分析和季节性分析。

Cornellius Yudha Wijaya 是一位数据科学助理经理和数据撰稿人。在全职工作于 Allianz Indonesia 的同时,他喜欢通过社交媒体和写作媒体分享 Python 和数据技巧。Cornellius 撰写了各种人工智能和机器学习主题。

更多相关主题