用于时间序列分析的时间戳特征工程

数据挖掘 Python 时间序列
2022-02-16 21:40:43

遵循 Tensorflow 时间序列分析教程,我遇到了一种将数据时间戳转换为时间周期信号的特殊方法,这可以帮助模型更好地解释数据,而不仅仅是提供时间戳。

timestamp_s = date_time.map(pd.Timestamp.timestamp)

day = 24*60*60
year = (365.2425)*day

df['Day sin'] = np.sin(timestamp_s * (2 * np.pi / day))
df['Day cos'] = np.cos(timestamp_s * (2 * np.pi / day))
df['Year sin'] = np.sin(timestamp_s * (2 * np.pi / year))
df['Year cos'] = np.cos(timestamp_s * (2 * np.pi / year))

plt.plot(np.array(df['Day sin'])[:25])
plt.plot(np.array(df['Day cos'])[:25])
plt.xlabel('Time [h]')
plt.title('Time of day signal')

在此处输入图像描述

我不确定我是否了解如何从时间戳中提取一天中的时间和一年中的一天的周期结构,因此我将不胜感激有关此的任何指示。

最后,一个简单的归一化列time_of_dayday_of_year额外的新列date_time就足够了吗?

1个回答

timestamp_s = date_time.map(pd.Timestamp.timestamp) 获取一列时间戳并将它们转换为 seconds-since-1970格式(也称为 unix 时间戳)。

day设置为 86400 秒。除以的余数timestamp_sday一天中的时间,其中 0 是午夜(在 UTC 时区),34200 是中午,86359 是 23:59:59。

np.sin()以弧度为单位接受输入,所以这就是乘以2 * np.pi所做的。(当然,不需要显式取余数,因为 sine 是循环函数。)

年份计算使用相同的想法,但使用一年中的秒数。所以 0 是 1 月 1 日,00:00:00 UTC,86359 是 1 月 1 日,23:59:59 UTC,呃...... 31557599 是 12 月 31 日 23:59:59 UTC。

嗯,有点。他们使用 365.25 来避免与 2 月 29 日和闰年混淆。但这确实意味着,例如 12 月 25 日上午 10 点,每四年只有一次相同的数字。

另一个常见的方法是用于day * 7查看星期几是否是有用的预测器。例如,如果数据是超市销售数据。

我真的很喜欢他们在那篇文章中展示的傅立叶变换图。这清楚地表明,工作日根本没有用。啊,刚刚看到它正在绘制温度数据。这就说得通了!

最后,一个简单的标准化 time_of_day 和 day_of_year 从 date_time 列额外的新列就足够了吗?

如 00:00:00 的 -1.0 到 23:59:59 的 +1.0。1 月 1 日为 -1.0,12 月 31 日为 +1.0。

正弦波带来的一个很好的特点是你不会在午夜和新年得到那种脱节的感觉。您可以改为从 00:00:00 执行 -1.0 到 12:00:00 执行 +1.0,然后在 23:59:59 恢复到 -1.0(与 6 月 30 日类似)。但是,在这一点上,正弦看起来更平滑且更易于编码。