python - 在将时间序列数据转换为其频域时,如何选择要使用的正确频率?
问题描述
所以我是数据科学的新手,目前正在使用这个发电数据集学习时间序列。我有几个问题要问这个社区有经验的人。这是我到目前为止所做的:
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)
- 该数据集具有每月频率,即从 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) # ????!!!!
- 我调查了年度趋势的数据
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 行。我需要对这个场景提出建议。
- 我将如何建模其绘图是线性但从左到右向下倾斜的数据集?
解决方案
推荐阅读
- python - Pyinstaller python macos在签名后仍然显示代码签名错误
- javascript - 将记分牌添加到“游戏”
- javascript - 错误 webdriver:RequestError:连接 ECONNREFUSED 127.0.0.1:4444
- javascript - 如何在反应渲染中使用事件监听器?
- flutter - 我想从 Firebase Firestore 获取自定义开关的值
- visual-studio-code - 当我在 JSX 代码中输入 {} 时向左移动 - VSCode
- c++ - [VsCode]:有什么方法可以显示微软 VsCode 中 C/C++ 函数的调用层次结构/调用树?
- r - 如果任何列包含 NA,则删除行
- python - 如何使用 Beautiful Soup 检索标签之后的文本?
- node.js - 检查环回 v3 中是否存在 MongoDB 集合。如果不使用自定义属性创建