日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

时间序列分析之:函数分解decompose

發布時間:2023/12/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 时间序列分析之:函数分解decompose 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

時間序列分析——函數分解

第一篇 函數分解
函數分解decompose


文章目錄

  • 時間序列分析——函數分解
  • 前言
  • 一、函數分解是什么?
  • 二、建立分解函數
    • 1.功能
    • 2.測試函數
  • 總結


前言

這幾天一直在深思,如何建立一個和實際比較貼切的金融模型,能反映現實生活?比如我們聽到國家又放水了,我們可以預期物價又得上漲了,但是如何通過模型來反映這種相關關系呢?
伙伴楊RC說用EXCEL建了個模型來預測本期深圳車牌競價,以達到最小的成本拍到車牌,這個想法不錯,Good lucky to my brother。
簡單的模型可以用EXCEL,復雜的模型就得使用python。
隨著人工智能的不斷發展,機器學習越來越重要,我們的目標是讓機器進行數據分析,發現一些特性和趨勢。本文就介紹時間序列分析的基礎。


一、函數分解是什么?

說白了就是拆分信號。剛好函數分解和我們想要建立的模型有點吻合:environment大趨勢 + company的周期性波動 + market的高斯擾動。
當然后續我們會引入相關性分析、情感分析等要素。

二、建立分解函數

1.功能

分解函數成三部分:趨勢、周期、和剩余部分(一般指噪聲,均值為0)
分解就是將時序數據分離成不同的成分,分解有:長期趨勢Trend、季節性seasonality和隨機殘差residuals
返回包含三個部分 trend(趨勢部分) , seasonal(季節性部分) 和residual (殘留部分)
傳入:一個序列,可以是時間序列
輸出:趨勢、周期、和剩余部分 三部分
函數詳解地址:鏈接
所以,我們建立一個python文件,命名為compose.py ,方便后續函數進行調用。
代碼如下:

# 功能:分解函數成三部分:趨勢、周期、和剩余部分(一般指噪聲) # 分解就是將時序數據分離成不同的成分,分解有:長期趨勢Trend、季節性seasonality和隨機殘差residuals # 返回包含三個部分 trend(趨勢部分) , seasonal(季節性部分) 和residual (殘留部分) # 創建時間:2021-01-15 # 傳入:一個序列 # 輸出:趨勢、周期、和剩余部分 三部分 # 函數詳解地址:https://machinelearningmastery.com/decompose-time-series-data-trend-seasonality/ from statsmodels.tsa.seasonal import seasonal_decompose import matplotlib.pyplot as pltdef decompose(timeseries,frequence):# 傳入數列和頻率數# 返回包含三個部分 trend(趨勢部分) , seasonal(季節性部分) 和residual (殘留部分)# statsmodels也支持兩類分解模型,加法模型和乘法模型,model的參數設置為"additive"(加法模型)和"multiplicative"(乘法模型)。# period:int, optional,系列的時期。如果x不是pandas對象或x的索引沒有頻率,則必須使用。如果x是具有時間序列索引的pandas對象,則覆蓋x的默認周期性# decomposition = seasonal_decompose(timeseries,model='multiplicative',freq=frequence)decomposition = seasonal_decompose(timeseries, model='additive', freq=frequence)trend = decomposition.trendseasonal = decomposition.seasonalresidual = decomposition.resid# 畫圖參數fig = plt.figure()ax1 = fig.add_subplot(411)ax1.plot(timeseries, label='Original')ax1.legend(loc='best')ax2 = fig.add_subplot(412)ax2.plot(trend, label='Trend')ax2.legend(loc='best')ax3 = fig.add_subplot(413)ax3.plot(seasonal, label='Seasonality')ax3.legend(loc='best')ax4 = fig.add_subplot(414)ax4.plot(residual, label='Residuals')ax4.legend(loc='best')fig.tight_layout()plt.show(block=False)return trend, seasonal, residual

2.測試函數

我們先合成一個:趨勢 + 周期性波動 + 高斯擾動的函數,測試我們的compose函數能否成功分解。
測試函數如下:

import matplotlib.pyplot as plt import numpy as np import math from math import * import pandas as pd from decompose import *plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 plt.rcParams['axes.unicode_minus'] = Falsextime = np.arange(1,1000,1) xnorm = xtime/len(xtime)queshi = 2*xnorm +1 fig1 = plt.figure() ax1 = fig1.add_subplot(412) ax1.plot(xtime,queshi, label='趨勢') ax1.legend(loc='best')zouqi = [sin(x*20*math.pi) for x in xnorm] ax2 = fig1.add_subplot(413) ax2.plot(zouqi, label='周期') ax2.legend(loc='best')noize = 0.02*np.random.normal(size=xtime.size) ax3 = fig1.add_subplot(414) ax3.plot(noize, label='噪聲') ax3.legend(loc='best')signal = queshi+zouqi+noize ax4 = fig1.add_subplot(411) ax4.plot(signal, label='合成信號') ax4.legend(loc='best')fig1.tight_layout() plt.show(block=False)signal = pd.Series(signal).astype('float') trend , seasonal, residual = decompose(signal,frequence = 200) plt.show()

生成合成函數如下:

分解函數結果如下:

可以看出完全分解還原了我們模擬的信號。
這里需要注意的是:我們提前知道了輸入序列的周期,所以可以完美拆分,如果我們把周期信號填錯了,那么結果又會出現非常大的偏差。
比如本次合成信號的周期是100的整數倍,如果我們輸成了150,那會是怎么樣?

signal = pd.Series(signal).astype('float') trend , seasonal, residual = decompose(signal,frequence = 150)

分解結果:

可以看到,此時趨勢不同了,周期函數的權重降低了,本該是噪音的信號,現在變得很強。模型已經開始失真。
如果我們用33這個周期去測試,結果會是怎樣?

trend , seasonal, residual = decompose(signal,frequence = 33)


結果如下:周期信號基本成了噪音,趨勢信號已經糅合和其他信號,市場擾動也不明顯了。
因此對信號的周期的確定,有至關重要的作用。
下篇我們將探尋如何尋找時間序列的周期。


總結

每個G民都覺得自己是G神,實際上只是布朗運動中的一份子,高斯白噪聲中的一個噪點而已。
沒有誰能預測未來。未來是屬于未來的。

總結

以上是生活随笔為你收集整理的时间序列分析之:函数分解decompose的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。