首页 > 解决方案 > 在将时间序列数据转换为其频域时,如何选择要使用的正确频率?

问题描述

所以我是数据科学的新手,目前正在使用这个发电数据集学习时间序列。我有几个问题要问这个社区有经验的人。这是我到目前为止所做的:

import numpy as np
from matplotlib import pyplot as plt
from scipy.fft import fft, fftfreq, rfft, rfftfreq
import pandas as pd

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

# data
df = pd.read_csv('C:/Users/NH.DESKTOP-D3QHQEL/Documents/data_bank/Electric_Production.csv')
df['DATE'] = pd.to_datetime(df['DATE'])          # convertion to pd date
df['YEAR'] = pd.DatetimeIndex(df['DATE']).year   # create 'year' column

# coverts date to float 8-)
def dt64_to_float(dt64):
    year = dt64.astype('M8[Y]')
    # print('year:', year)
    days = (dt64 - year).astype('timedelta64[D]')
    # print('days:', days)
    year_next = year + np.timedelta64(1, 'Y')
    # print('year_next:', year_next)
    days_of_year = (year_next.astype('M8[D]') - year.astype('M8[D]')
                    ).astype('timedelta64[D]')
    # print('days_of_year:', days_of_year)
    dt_float = 1970 + year.astype(float) + days / (days_of_year)
    # print('dt_float:', dt_float)
    return dt_float

df['date_decimal'] = dt64_to_float(df['DATE'].values)  # create floating date column
df = df.set_index('date_decimal')                      # set df's new index

# create time consistent data split
X = df.index.values.reshape(-1,1)
y = df['IPG2211A2N'].values

X_train, X_test, y_train, y_test = train_test_split(df.index.values.reshape(-1, 1),
                                                    df['IPG2211A2N'].values, 
                                                    shuffle=False, 
                                                    random_state=0, 
                                                    test_size=0.2)
  1. 该数据集具有每月频率,即从 1985-01 到 2018-01(33 年)每月输入数据行;总共 397 行(每年大约 12 行)。我想调查频域中的月度和年度变化。如何选择年和月变化的频率范围?我尝试将每年的数据点除以 12,将每月频率保留为 1,因为这是数据的自然频率。频率不是指每秒的周期数还是每时间的离散点数?
N = df.shape[0]   # total number of data points/rows
yf = N/12         # yearly frequency ?!
mf = 1            # monthly frequency ?!

y_fft = fft(y)                     # Fourier transformation
yearly_freq = fftfreq(N, y_fft)    # ????!!!!
  1. 我调查了年度趋势的数据df.groupby(['YEAR'])['IPG2211A2N'].mean().plot(),发现它大致是线性的,尽管大约在 2015 年之后数据读数出现了峰值。当线性模型安装在火车上时,这产生了一些有趣的结果(R^2 分数),测试拆分和完整数据:
linear_model.fit(X, y).score(X, y)                         #  0.69
linear_model.fit(X_train, y_train).score(X_test, y_test)   # -1.08
linear_model.fit(X_train, y_train).score(X_train, y_train) #  0.73
linear_model.fit(X_test, y_test).score(X_test, y_test)     #  0.004

很明显,测试拆分是这里的问题,模型无法正确概括。你们会在这里推荐什么?我应该增加测试拆分的大小,还是只使用整个数据来拟合没有拆分的模型。数据集不大,只有 397 行。我需要对这个场景提出建议。

  1. 我将如何建模其绘图是线性但从左到右向下倾斜的数据集?

标签: pythonscikit-learntime-serieslinear-regressionfft

解决方案


推荐阅读