🍠Python燃烧废气排放推断算法模型

宏观能耗场景模型参数化输入数据,分析可视化输出结果,使用场景时间序列数据模型及定量和定性指标;使用线图和箱线图、饼图、散点图、堆积条形图、桑基图等可视化模型输出结果;根据气体排放过程得出其时间序列关系,使用推断模型中计算工具量化气体排放量;推断模型中计算工具使用的数学工具是恒定比率、时间比率、分位数滚动窗口、均方根、线性插补等

🏈指点迷津 | Brief

🍪语言内容分比

🍇Python时间序列分析

时间序列数学模型

时间序列模型是假设多个时间序列或时间序列之间存在关系的模型。简单回归模型就是一个例子:

y(t)=x(t)β+ε(t)(1)y(t)=x(t) \beta+\varepsilon(t)\qquad(1)

其中 y(t)={yt;t=0,±1,±2,}y(t)=\left\{y_t ; t=0, \pm 1, \pm 2, \ldots\right\} 是一个序列,以时间下标 t 为索引,它是可观测信号序列 x(t)={xt}x(t)=\left\{x_t\right\}和不可观测,独立且同分布的随机变量的白噪声序列 ε(t)={εt}\varepsilon(t)=\left\{\varepsilon_t\right\} 的组合。

一种更通用的模型,我们称之为一般时间回归模型,它假设一种关系,其中包含任意数量的 x(t)y(t)x(t)、y(t) ε(t)\varepsilon(t) 的连续元素。该模型可以由方程表示

i=0pαiy(ti)=i=0kβix(ti)+i=0qμiε(ti)(2)\sum_{i=0}^p \alpha_i y(t-i)=\sum_{i=0}^k \beta_i x(t-i)+\sum_{i=0}^q \mu_i \varepsilon(t-i)\qquad(2)

通常认为 α0=1\alpha_0=1 是理所当然的。 左侧前导系数的归一化将 y(t)y(t) 标识为输出序列。方程中的任何和都可以是无限的,但如果模型要可行,则系数序列 {αi},{βi}\left\{\alpha_i\right\},\left\{\beta_i\right\}{μi}\left\{\mu_i\right\} 只能依赖于有限数量的参数。

虽然以(2)的形式写出一般模型很方便,但也通常用以下方程表示

y(t)=i=1pϕiy(ti)+i=0kβix(ti)+i=0qμiε(ti)y(t)=\sum_{i=1}^p \phi_i y(t-i)+\sum_{i=0}^k \beta_i x(t-i)+\sum_{i=0}^q \mu_i \varepsilon(t-i)

其中 ϕi=αi\phi_i=-\alpha_i 表示 i=1,,pi=1, \ldots, p。这会将序列 y(t)y(t) 的滞后版本与输入序列x(t) x(t) 及其滞后一起放置在右侧上。

工程师倾向于将其描述为反馈模型,而经济学家更可能将其描述为具有滞后因变量的模型。

由于包含可观察的解释序列x(t)x(t),上述模型被称为回归模型。当x(t)x(t)被删除时,我们得到一个更简单的无条件线性随机模型:

i=0pαiy(ti)=i=0qμiε(ti)\sum_{i=0}^p \alpha_i y(t-i)=\sum_{i=0}^q \mu_i \varepsilon(t-i)

这是自回归移动平均模型。

Python自回归综合移动平均线

 import numpy as np
 import pandas as pd
 from matplotlib import pyplot as plt
 from statsmodels.tsa.stattools import adfuller
 from statsmodels.tsa.seasonal import seasonal_decompose
 from statsmodels.tsa.arima_model import ARIMA
 from pandas.plotting import register_matplotlib_converters
 register_matplotlib_converters()

我们将使用包含特定日期飞机乘客数量的数据集。

 df = pd.read_csv('air.csv', parse_dates = ['Month'], index_col = ['Month'])
 df.head()
 plt.xlabel('Date')
 plt.ylabel('Number of air passengers')
 plt.plot(df)

在建立模型之前,我们必须确保时间序列是平稳的。有两种主要方法可以确定给定时间序列是否平稳。

  • 滚动统计:绘制滚动平均值和滚动标准差。如果时间序列随时间保持恒定(用肉眼观察线条是否笔直且平行于 x 轴),则时间序列是平稳的。

  • 增强迪基-富勒检验:如果 p 值较低(根据原假设)并且 1%、5%、10% 置信区间的临界值尽可能接近增强迪基-富勒统计,则时间序列被视为平稳。

对于那些不理解平均值和滚动平均值之间区别的人来说,10 天滚动平均值会将前 10 天的收盘价平均作为第一个数据点。下一个数据点会删除最早的价格,加上第 11 天的价格并取平均值,依此类推。

 rolling_mean = df.rolling(window = 12).mean()
 rolling_std = df.rolling(window = 12).std()
 plt.plot(df, color = 'blue', label = 'Original')
 plt.plot(rolling_mean, color = 'red', label = 'Rolling Mean')
 plt.plot(rolling_std, color = 'black', label = 'Rolling Std')
 plt.legend(loc = 'best')
 plt.title('Rolling Mean & Rolling Standard Deviation')
 plt.show()

正如您所看到的,滚动平均值和滚动标准差随着时间的推移而增加。因此,我们可以得出结论,时间序列不是平稳的。

 result = adfuller(df['Passengers'])
 print('ADF Statistic: {}'.format(result[0]))
 print('p-value: {}'.format(result[1]))
 print('Critical Values:')
 for key, value in result[4].items():
     print('\t{}: {}'.format(key, value))

获取因变量的对数是降低滚动平均值增加速率的简单方法。

 df_log = np.log(df)
 plt.plot(df_log)

让我们创建一个函数来运行两个测试,以确定给定的时间序列是否平稳。

 def get_stationarity(timeseries):
     
     rolling_mean = timeseries.rolling(window=12).mean()
     rolling_std = timeseries.rolling(window=12).std()
     
     original = plt.plot(timeseries, color='blue', label='Original')
     mean = plt.plot(rolling_mean, color='red', label='Rolling Mean')
     std = plt.plot(rolling_std, color='black', label='Rolling Std')
     plt.legend(loc='best')
     plt.title('Rolling Mean & Standard Deviation')
     plt.show(block=False)
 ​
     result = adfuller(timeseries['Passengers'])
     print('ADF Statistic: {}'.format(result[0]))
     print('p-value: {}'.format(result[1]))
     print('Critical Values:')
     for key, value in result[4].items():
         print('\t{}: {}'.format(key, value))

Last updated