時間序列數據是一種按照時間順序排列的觀測值集合,每個觀測值對應于一個特定的時間點。這種數據在許多領域中都具有重要的應用價值,如金融、經濟、氣候科學等。通過分析時間序列數據,可以幫助我們掌握潛在的模式、發現趨勢和季節性波動等重要信息。
時間序列分析是一種技術,用于評估時間序列數據,旨在確定相關的統計數據和其他數據屬性。其主要目標是研究市場趨勢和經濟周期的關鍵思想,任何受到影響的具有重復模式的時間序列都可能受到影響。
可視化對于從時間序列數據中獲取有洞察力的信息至關重要,它可以幫助我們理解復雜的關系并做出明智的決策。本文將介紹如何使用Python繪制幾種常見的時序分析圖。
數據集
數據集地址:https://github.com/jbrownlee/Datasets/blob/master/monthly-sunspots.csv
數據集變量:數據集由 2 列組成 - 從 1749 年到 1983 年的“月份”和“太陽黑子”。它基本上描述了該數據集中記錄的每個月在太陽上看到的太陽黑子的數量。
1、Statsmodels庫
本次用到了Statsmodels,Statsmodels庫是Python中一個強大的統計分析庫,包含假設檢驗、回歸分析、時間序列分析等功能,能夠很好的和Numpy和Pandas等庫結合起來,提高工作效率。支持Python3.8、3.9和3.10。
安裝方法
Anaconda
conda install -c conda-forge statsmodels
PyPI (pip)
pip install statsmodels
如果不能下載,則加上國內源,命令如下:
pip install statsmodels -i https://pypi.tuna.tsinghua.edu.cn/simple
從源代碼安裝
您需要安裝C編譯器來構建統計模型。如果您是從github源代碼而不是源代碼版本構建的,那么您還需要Cython。您可以按照下面的說明獲得Windows的C編譯器設置。
如果你的系統已經安裝了pip、編譯器和git,你可以試試:
pip install git+https://github.com/statsmodels/statsmodels
依賴庫
Python >= 3.8NumPy >= 1.18SciPy >= 1.4Pandas >= 1.0Patsy >= 0.5.2
例子
import statsmodels.formula.api as smf
import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdata = pd.DataFrame({"X":np.arange(10,100,0.5)})
data["Y"] = 2 * data["X"] + 1 + np.random.randn(180)
mod = smf.ols("Y ~ X", data).fit()
print(mod.summary())data.plot(x="X", y="Y",kind="scatter",figsize=(8,5))
plt.plot(data["X"], mod.params[0] + mod.params[1]*data["X"],"r")
plt.text(10, 38, "y="+str(round(mod.params[1],4)) + "*x" + str(round(mod.params[0],4)))
plt.title("linear regression")
plt.show()
print(mod.summary())的輸出結果:
OLS Regression Results
==============================================================================
Dep. Variable: Y R-squared: 1.000
Model: OLS Adj. R-squared: 1.000
Method: Least Squares F-statistic: 4.744e+05
Date: Mon, 13 Nov 2023 Prob (F-statistic): 7.49e-307
Time: 11:25:51 Log-Likelihood: -256.52
No. Observations: 180 AIC: 517.0
Df Residuals: 178 BIC: 523.4
Df Model: 1
Covariance Type: nonrobust
==============================================================================coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 1.0831 0.176 6.157 0.000 0.736 1.430
X 1.9993 0.003 688.746 0.000 1.994 2.005
==============================================================================
Omnibus: 0.781 Durbin-Watson: 2.104
Prob(Omnibus): 0.677 Jarque-Bera (JB): 0.462
Skew: 0.075 Prob(JB): 0.794
Kurtosis: 3.198 Cond. No. 141.
==============================================================================
時間圖
代碼如下:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf# 加載每月太陽黑子數據集
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/monthly-sunspots.csv"
data = pd.read_csv(url, parse_dates=['Month'], index_col='Month')
print(data)
# 時間圖
plt.figure(figsize=(7, 5))
plt.plot(data.index, data['Sunspots'], marker='o', linestyle='-', markersize=5)
plt.xlabel('Date')
plt.ylabel('Number of Sunspots')
plt.title('Monthly Sunspots Time Plot')
plt.grid(True)
plt.show()
折線圖
折線圖是一種常見的數據可視化方式,它通過連接一系列數據點形成一條或多條線段來展示數據隨時間或其他變量的變化趨勢。折線圖通常用于展示時間序列數據或其他有序數據的變化情況,例如股票價格、氣溫變化、銷售數據等。
在折線圖中,每個數據點通常表示為一個標記(如圓點、方塊等),并通過直線段連接相鄰的數據點。折線圖的x軸通常表示時間或其他有序變量,而y軸則表示要展示的數據值。通過觀察折線圖的形狀、趨勢和波動情況,我們可以得出一些有用的信息和結論。
例如,在股票市場分析中,折線圖可以用來展示股票價格的走勢,幫助投資者判斷股票的趨勢和買賣時機;在氣象學中,折線圖可以用來展示氣溫、降雨量等氣象數據的變化趨勢,幫助人們更好地了解氣候變化和預測天氣情況。此外,折線圖還可以通過添加多條折線來展示不同變量之間的關系和對比情況,例如展示不同地區的銷售數據或不同產品的受歡迎程度等。
折線圖是一種直觀、簡單的數據可視化方式,可以幫助我們更好地了解數據的變化趨勢和規律,從而做出更明智的決策。
代碼如下:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf# 加載每月太陽黑子數據集
data = pd.read_csv("monthly-sunspots.csv", parse_dates=['Month'], index_col='Month')
print(data)
# 折線圖
import matplotlib.pyplot as plt
plt.figure(figsize=(7, 5))
plt.plot(data)
plt.xlabel('Date')
plt.ylabel('Number of Sunspots')
plt.title('Monthly Sunspots Line Plot')
plt.grid(True)
plt.show()
季節性圖
季節性圖是一種可視化時間序列數據的方式,它能夠展示在特定時間間隔(如年、月、日等)內數據的重復模式。這種圖通常用于觀察和分析時間序列數據中的季節性變化,例如氣候、銷售、人口動態等。
季節性圖通常以時間序列數據為x軸,以表現數值為y軸,將數據點在圖上表示出來。為了更清晰地展示季節性變化,可以使用不同顏色或標記來表示每個季節的數據點。此外,可以使用趨勢線或平滑曲線來擬合數據點,以幫助識別季節性模式的長期趨勢。
季節性圖可以用于各種領域,例如氣候學、銷售分析、人口統計學等。例如,在氣候學中,季節性圖可以用來展示氣溫、降雨量等氣象數據的季節性變化;在銷售分析中,季節性圖可以用來觀察商品銷售在不同季節內的變化情況;在人口統計學中,季節性圖可以用來展示人口數量在不同時間點的變化情況。
季節性圖是一種強大的可視化工具,可以幫助我們更好地理解和分析時間序列數據中的季節性變化。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf# 加載每月太陽黑子數據集
data = pd.read_csv("monthly-sunspots.csv", parse_dates=['Month'], index_col='Month')
print(data)# 季節性圖
plt.figure(figsize=(7, 5))
sns.lineplot(x=data.index.month, y=data['Sunspots'], ci=None)
plt.xlabel('Month')
plt.ylabel('Number of Sunspots')
plt.title('Seasonal Plot')
plt.xticks(range(1, 13), labels=['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])
plt.grid(True)
plt.show()
直方圖和密度圖
直方圖和密度圖是兩種用于可視化數據分布的圖形。
直方圖是一種條形圖,它顯示了數據分布的頻率。每個條形的高度表示數據值出現的次數,條形的寬度表示數據值的范圍。通過觀察直方圖,我們可以了解數據的集中趨勢、離散程度以及可能存在的異常值。在繪制直方圖時,可以選擇不同的顏色和柱狀寬度以增強視覺效果。
密度圖則是一種用于顯示數據分布密度的圖形。與直方圖不同,密度圖顯示的是數據點在某個范圍內的密集程度,而不是具體的數值。密度圖通常用于展示數據的概率密度,特別是在大數據集或連續變量的情況下。通過觀察密度圖,我們可以了解數據的分布情況以及是否存在集中或離散的趨勢。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf# 加載每月太陽黑子數據集
data = pd.read_csv("monthly-sunspots.csv", parse_dates=['Month'], index_col='Month')
print(data)# 直方圖和密度圖
plt.figure(figsize=(7, 5))
sns.histplot(data['Sunspots'], kde=True)
plt.xlabel('Number of Sunspots')
plt.ylabel('Frequency')
plt.title('Histogram and Density Plot')
plt.grid(True)
plt.show()
自相關圖
自相關圖是一個平面二維坐標懸垂線圖。橫坐標表示延遲階數,縱坐標表示自相關系數。它是一個重要的統計工具,用于分析時間序列數據的重復模式和周期性趨勢。通過觀察自相關圖,我們可以確定數據之間的相似性如何隨時間變化,并以此為基礎進行預測或解釋。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf# 加載每月太陽黑子數據集
data = pd.read_csv("monthly-sunspots.csv", parse_dates=['Month'], index_col='Month')
print(data)# 自相關圖
# plt.figure(figsize=(7,5))
plot_acf(data['Sunspots'], lags=50)
plt.xlabel('Lags')
plt.ylabel('Autocorrelation')
plt.title('Autocorrelation Plot')
plt.grid(True)
plt.show()
PACF圖
PACF圖是指偏自相關函數圖,它衡量的是任意時間點與該時間點前的一段時間內的觀測值的相關程度,并消除了其他滯后值的影響。偏自相關函數(PACF)衡量的是在控制了所有更短滯后的影響后,一個時間序列和它自身滯后版本之間的相關性。
在PACF圖中,x軸代表滯后數,y軸代表偏自相關系數。與ACF圖類似,PACF圖中的每一個滯后數都有一個代表偏自相關系數的垂直線,同時還有兩條水平藍線表示置信區間。
通過對ACF圖和PACF圖的分析,可以得出數據可能適合的模型。例如,如果ACF圖在某個點上截尾,而PACF圖在該點后呈現出拖尾的形式,那么數據可能適合AR模型。如果ACF圖在某個點后呈現出拖尾的形式,而PACF圖在該點上截尾,那么數據可能適合MA模型。如果ACF圖和PACF圖都呈現出拖尾的形式,那么數據可能適合ARMA模型。
PACF圖是一種分析時間序列數據的重要工具,可以幫助我們更好地理解數據的內在結構和關系。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf# 加載每月太陽黑子數據集
data = pd.read_csv("monthly-sunspots.csv", parse_dates=['Month'], index_col='Month')
print(data)# PACF圖
# plt.figure(figsize=(7, 5))
plot_pacf(data['Sunspots'], lags=50)
plt.xlabel('Lags')
plt.ylabel('Partial Autocorrelation')
plt.title('Partial Autocorrelation Function (PACF) Plot')
plt.grid(True)
plt.show()
極坐標圖
極坐標圖是一種用于表示方向性和距離信息的圖形,常用于表示地理信息系統中的數據。在極坐標圖中,每個點都有一個相對于極點的距離和角度信息,可以用來表示地理信息中的經緯度、方向和高度等數據。
在極坐標圖中,角度通常以正北方向為0度,順時針方向增加角度值。距離則通常以極點為原點,向各個方向延伸,單位可以根據需要進行設定。
極坐標圖可以用于各種領域,例如物理學、工程學、地球物理學等。在地球物理學中,極坐標圖可以用于表示地震數據、地磁數據等,以便更好地分析和研究地球的物理性質。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf# 加載每月太陽黑子數據集
data = pd.read_csv("monthly-sunspots.csv", parse_dates=['Month'], index_col='Month')
print(data)# 從上述數據集“Monthly Sunspots”的索引中提取月份和年份
data['Month_Num'] = data.index.month# 按月份對數據進行分組,計算每個月的平均太陽黑子數
monthly_average = data.groupby('Month_Num')['Sunspots'].mean()# 極坐標圖θ(角度)和半徑(長度)設置
theta = np.linspace(0, 2 * np.pi, len(monthly_average))
radii = monthly_average.values# 極坐標圖
plt.figure(figsize=(7, 5))
plt.polar(theta, radii)
plt.title('Polar Plot of Monthly Average Sunspots')
plt.xticks(theta, ['Jan', 'Feb', 'Mar', 'Apr', 'May','Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])# 設置y軸限制以適應數據
plt.ylim(0, radii.max() + 10)
plt.show()
移動平均線圖
移動平均線圖是一種常用的技術分析工具,它通過計算一系列連續價格數據的平均值,以反映市場趨勢和價格波動情況。在移動平均線圖中,通常會繪制一組不同周期的移動平均線,以反映市場在不同時間段內的平均成本和趨勢。
移動平均線圖可以用于股票、期貨、外匯等交易市場,以幫助交易者更好地把握市場趨勢和價格波動情況。在移動平均線圖中,不同周期的移動平均線會以不同顏色的線條表示,以方便交易者進行比較和分析。
通過觀察移動平均線圖,交易者可以發現市場中的趨勢和轉折點,以及價格波動的情況。例如,當短期移動平均線向上穿過長期移動平均線時,可能預示著市場即將上漲;而當短期移動平均線向下穿過長期移動平均線時,可能預示著市場即將下跌。此外,交易者還可以通過觀察不同周期的移動平均線來分析市場的支撐和壓力位,以及趨勢的持續時間和強度。
移動平均線圖是一種重要的技術分析工具,可以幫助交易者更好地理解市場趨勢和價格波動情況,從而做出更明智的交易決策。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf# 加載每月太陽黑子數據集
data = pd.read_csv("monthly-sunspots.csv", parse_dates=['Month'], index_col='Month')
print(data)# 移動平均線圖
plt.figure(figsize=(7, 5))
values = data['Sunspots']# 7天移動平均線
rolling_mean = values.rolling(window=7).mean()
plt.plot(values, label='Original')
plt.plot(rolling_mean, label='7-day Moving Average', color='red')
plt.xlabel('Date')
plt.ylabel('Value')
plt.title('Moving Average Plot')
plt.legend()
plt.grid(True)
plt.show()
參考文章:https://mp.weixin.qq.com/s/4tZan5-1X94oITmCCLshOw