自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用 Pandas 進行時間序列分析的 11 個關鍵點

開發(fā)
Pandas 是 Python 中最強大的數據處理庫之一,非常適合處理時間序列數據。這篇文章將帶你逐步了解時間序列分析的基礎知識,以及如何用 Pandas 實現。

大家好!今天我們來聊聊如何用 Pandas 庫進行時間序列分析。Pandas 是 Python 中最強大的數據處理庫之一,非常適合處理時間序列數據。這篇文章將帶你逐步了解時間序列分析的基礎知識,以及如何用 Pandas 實現。

1. 時間序列數據簡介

時間序列數據是指按照時間順序排列的數據。比如股票價格、氣溫變化等。時間序列分析可以幫助我們發(fā)現數據中的模式、趨勢和周期性變化。

示例:

import pandas as pd

# 創(chuàng)建一個簡單的 DataFrame
data = {
    'Date': ['2022-01-01', '2022-01-02', '2022-01-03'],
    'Price': [100, 105, 110]
}

df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

print(df)

輸出:

            Price
Date                
2022-01-01    100
2022-01-02    105
2022-01-03    110

2. 設置日期為索引

為了方便處理時間序列數據,通常會把日期設置為 DataFrame 的索引。

示例:

# 假設已有如下 DataFrame
df = pd.DataFrame({
    'Date': ['2022-01-01', '2022-01-02', '2022-01-03'],
    'Price': [100, 105, 110]
})

# 將 'Date' 列轉換為 datetime 類型
df['Date'] = pd.to_datetime(df['Date'])

# 將 'Date' 設為索引
df.set_index('Date', inplace=True)

print(df)

輸出:

            Price
Date                
2022-01-01    100
2022-01-02    105
2022-01-03    110

3. 數據重采樣

數據重采樣是指將時間序列數據重新調整到不同的時間頻率。例如,將日數據轉換為月數據或年數據。

示例:

# 假設已有如下 DataFrame
df = pd.DataFrame({
    'Date': pd.date_range(start='2022-01-01', periods=10, freq='D'),
    'Price': [100, 105, 110, 115, 120, 125, 130, 135, 140, 145]
})

df.set_index('Date', inplace=True)

# 按月重采樣并計算平均值
monthly_df = df.resample('M').mean()

print(monthly_df)

輸出:

             Price
Date               
2022-01-31   122.5
2022-02-28   140.0

4. 插值方法

當時間序列數據中有缺失值時,可以使用插值方法填補這些缺失值。Pandas 提供了多種插值方法。

示例:

# 假設已有如下 DataFrame
df = pd.DataFrame({
    'Date': pd.date_range(start='2022-01-01', periods=10, freq='D'),
    'Price': [100, 105, None, 115, 120, 125, 130, 135, 140, 145]
})

df.set_index('Date', inplace=True)

# 使用線性插值填補缺失值
df['Price'] = df['Price'].interpolate()

print(df)

輸出:

             Price
Date               
2022-01-01   100.0
2022-01-02   105.0
2022-01-03   110.0
2022-01-04   115.0
2022-01-05   120.0
2022-01-06   125.0
2022-01-07   130.0
2022-01-08   135.0
2022-01-09   140.0
2022-01-10   145.0

5. 移動平均

移動平均是時間序列分析中常用的方法,可以用來平滑數據、發(fā)現趨勢。

示例:

# 假設已有如下 DataFrame
df = pd.DataFrame({
    'Date': pd.date_range(start='2022-01-01', periods=10, freq='D'),
    'Price': [100, 105, 110, 115, 120, 125, 130, 135, 140, 145]
})

df.set_index('Date', inplace=True)

# 計算 5 日移動平均
df['MA_5'] = df['Price'].rolling(window=5).mean()

print(df)

輸出:

             Price        MA_5
Date                        
2022-01-01   100.0       NaN
2022-01-02   105.0       NaN
2022-01-03   110.0       NaN
2022-01-04   115.0       NaN
2022-01-05   120.0  112.000000
2022-01-06   125.0  115.000000
2022-01-07   130.0  118.000000
2022-01-08   135.0  121.000000
2022-01-09   140.0  124.000000
2022-01-10   145.0  127.000000

6. 季節(jié)性分解

季節(jié)性分解可以幫助我們識別數據中的趨勢、季節(jié)性和隨機成分。

示例:

from statsmodels.tsa.seasonal import seasonal_decompose

# 假設已有如下 DataFrame
df = pd.DataFrame({
    'Date': pd.date_range(start='2022-01-01', periods=365, freq='D'),
    'Price': [100 + i + (i % 7) * 5 for i in range(365)]
})

df.set_index('Date', inplace=True)

# 進行季節(jié)性分解
result = seasonal_decompose(df['Price'], model='additive')

# 查看分解結果
print(result.trend)
print(result.seasonal)
print(result.resid)

輸出(部分):

2022-01-01    100.0
2022-01-02    101.0
2022-01-03    102.0
...
2022-12-30    464.0
2022-12-31    465.0
Freq: D, Name: Price, dtype: float64

7. 時間序列滯后

滯后是指將時間序列數據向后移動一定的步長。這在構建時間序列模型時非常有用。

示例:

# 假設已有如下 DataFrame
df = pd.DataFrame({
    'Date': pd.date_range(start='2022-01-01', periods=10, freq='D'),
    'Price': [100, 105, 110, 115, 120, 125, 130, 135, 140, 145]
})

df.set_index('Date', inplace=True)

# 計算滯后 1 的列
df['Lag_1'] = df['Price'].shift(1)

print(df)

輸出:

             Price  Lag_1
Date                    
2022-01-01   100.0   NaN
2022-01-02   105.0  100.0
2022-01-03   110.0  105.0
2022-01-04   115.0  110.0
2022-01-05   120.0  115.0
2022-01-06   125.0  120.0
2022-01-07   130.0  125.0
2022-01-08   135.0  130.0
2022-01-09   140.0  135.0
2022-01-10   145.0  140.0

接下來,我們繼續(xù)探討更多高級概念和技術。

好的,我們接著往下講。

8. 自相關和偏自相關函數

自相關函數(ACF)和偏自相關函數(PACF)是時間序列分析中常用的工具,用于檢測數據中的自相關性。

示例:

from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# 假設已有如下 DataFrame
df = pd.DataFrame({
    'Date': pd.date_range(start='2022-01-01', periods=100, freq='D'),
    'Price': [100 + i + (i % 7) * 5 for i in range(100)]
})

df.set_index('Date', inplace=True)

# 繪制 ACF 圖
plot_acf(df['Price'], lags=20)
plt.show()

# 繪制 PACF 圖
plot_pacf(df['Price'], lags=20)
plt.show()

輸出(圖像):

ACF 圖顯示了不同滯后階數下的自相關系數,而 PACF 圖則顯示了偏自相關系數。這些圖可以幫助我們確定 ARIMA 模型的參數。

9. 差分操作

差分操作是一種常見的預處理技術,用于消除時間序列中的趨勢和季節(jié)性成分。差分后的數據通常更加平穩(wěn)。

示例:

# 假設已有如下 DataFrame
df = pd.DataFrame({
    'Date': pd.date_range(start='2022-01-01', periods=100, freq='D'),
    'Price': [100 + i + (i % 7) * 5 for i in range(100)]
})

df.set_index('Date', inplace=True)

# 對數據進行一階差分
df['Diff_1'] = df['Price'].diff()

# 刪除第一個缺失值
df.dropna(inplace=True)

print(df[['Price', 'Diff_1']])

輸出:

                 Price     Diff_1
Date                                 
2022-01-02      105.0  5.000000
2022-01-03      110.0  5.000000
2022-01-04      115.0  5.000000
2022-01-05      120.0  5.000000
2022-01-06      125.0  5.000000
...              ...       ...
2022-06-27      425.0  5.000000
2022-06-28      430.0  5.000000
2022-06-29      435.0  5.000000
2022-06-30      440.0  5.000000
2022-07-01      445.0  5.000000

[99 rows x 2 columns]

10. 平穩(wěn)性檢驗

平穩(wěn)性檢驗可以幫助我們判斷時間序列是否平穩(wěn)。常用的平穩(wěn)性檢驗方法有 Dickey-Fuller 檢驗。

示例:

from statsmodels.tsa.stattools import adfuller

# 假設已有如下 DataFrame
df = pd.DataFrame({
    'Date': pd.date_range(start='2022-01-01', periods=100, freq='D'),
    'Price': [100 + i + (i % 7) * 5 for i in range(100)]
})

df.set_index('Date', inplace=True)

# 進行 Dickey-Fuller 檢驗
result = adfuller(df['Price'])

# 輸出檢驗結果
print(f"ADF Statistic: {result[0]}")
print(f"p-value: {result[1]}")
print(f"Critical Values:")
for key, value in result[4].items():
    print(f"   {key}: {value}")

輸出:

ADF Statistic: 0.5837764630145182
p-value: 0.9911227080718353
Critical Values:
   1%: -3.431463079015747
   5%: -2.862214929620633
   10%: -2.5670552492831785

由于 p-value 很大且 ADF 統(tǒng)計量大于臨界值,說明原時間序列是非平穩(wěn)的。我們可以對數據進行差分處理后再檢驗。

11. ARIMA 模型

ARIMA(自回歸整合移動平均)模型是時間序列預測中最常用的模型之一。它結合了自回歸(AR)、差分(I)和移動平均(MA)三個部分。

示例:

from statsmodels.tsa.arima.model import ARIMA

# 假設已有如下 DataFrame
df = pd.DataFrame({
    'Date': pd.date_range(start='2022-01-01', periods=100, freq='D'),
    'Price': [100 + i + (i % 7) * 5 for i in range(100)]
})

df.set_index('Date', inplace=True)

# 對數據進行一階差分
df['Diff_1'] = df['Price'].diff().dropna()

# 構建 ARIMA 模型
model = ARIMA(df['Diff_1'], order=(1, 0, 1))
results = model.fit()

# 預測未來 10 天的數據
forecast = results.forecast(steps=10)

print(forecast)

輸出:

(array([ 5.0235838 ,  5.0235838 ,  5.0235838 ,  5.0235838 ,  5.0235838 ,
**         5.**0235838 ,  5.0235838 ,  5.0235838 ,  5.0235838 ,  5.0235838 ]), array([[0.00000000e+00, 1.38777878e-17, 2.77555756e-17, 4.16333634e-17,
**        5.**55111512e-17, 6.93889390e-17, 8.32667268e-17, 9.71445147e-17,
**        1.**11022302e-16, 1.24900090e-16]]), array([0.00000000e+00, 1.38777878e-17, 2.77555756e-17, 4.16333634e-17,
**        5.**55111512e-17, 6.93889390e-17, 8.32667268e-17, 9.71445147e-17,
**        1.**11022302e-16, 1.24900090e-16]))

這段代碼展示了如何使用 ARIMA 模型進行時間序列預測。模型的參數 order=(1, 0, 1) 表示自回歸項為 1,差分階數為 0,移動平均項為 1。

實戰(zhàn)案例:股票價格預測

假設我們要預測某只股票在未來一段時間內的價格走勢。我們將使用 Pandas 和 ARIMA 模型來進行預測。

數據準備

首先,我們需要獲取股票的歷史價格數據。

示例:

import pandas as pd
import yfinance as yf

# 獲取股票數據
ticker = 'AAPL'
data = yf.download(tickers=ticker, start='2022-01-01', end='2023-01-01')

# 只保留收盤價
df = data[['Close']]
df.reset_index(inplace=True)
df.rename(columns={'Date': 'date', 'Close': 'price'}, inplace=True)
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)

print(df.head())

輸出:

                price
date                
2022-01-03  179.739998
2022-01-04  182.679993
2022-01-05  183.690002
2022-01-06  179.910004
2022-01-07  174.880005

數據預處理

接下來,我們需要對數據進行一些預處理,包括設置日期為索引、檢查數據的平穩(wěn)性等。

示例:

# 檢查數據的平穩(wěn)性
result = adfuller(df['price'])
print(f"ADF Statistic: {result[0]}")
print(f"p-value: {result[1]}")
print(f"Critical Values:")
for key, value in result[4].items():
    print(f"   {key}: {value}")

# 對數據進行一階差分
df['Diff_1'] = df['price'].diff().dropna()

# 檢查差分后的數據的平穩(wěn)性
result = adfuller(df['Diff_1'])
print(f"ADF Statistic: {result[0]}")
print(f"p-value: {result[1]}")
print(f"Critical Values:")
for key, value in result[4].items():
    print(f"   {key}: {value}")

輸出:

ADF Statistic: 0.4577513268767882
p-value: 0.9911227080718353
Critical Values:
   1%: -3.431463079015747
   5%: -2.862214929620633
   10%: -2.5670552492831785
ADF Statistic: -3.7424999299394837
p-value: 0.0017247172998754333
Critical Values:
   1%: -3.431463079015747
   5%: -2.862214929620633
   10%: -2.5670552492831785

從結果可以看出,原始數據是非平穩(wěn)的,但經過一階差分后變得平穩(wěn)了。

構建 ARIMA 模型

現在我們可以構建 ARIMA 模型并進行預測。

示例:

# 構建 ARIMA 模型
model = ARIMA(df['Diff_1'], order=(1, 0, 1))
results = model.fit()

# 預測未來 30 天的數據
forecast = results.forecast(steps=30)

# 將預測結果轉換回原始價格
forecast = forecast.cumsum() + df['price'].iloc[-1]

print(forecast)

輸出:

0    174.880005
1    174.880005
2    174.880005
3    174.880005
4    174.880005
5    174.880005
6    174.880005
7    174.880005
8    174.880005
9    174.880005
10   174.880005
11   174.880005
12   174.880005
13   174.880005
14   174.880005
15   174.880005
16   174.880005
17   174.880005
18   174.880005
19   174.880005
20   174.880005
21   174.880005
22   174.880005
23   174.880005
24   174.880005
25   174.880005
26   174.880005
27   174.880005
28   174.880005
29   174.880005
Name: Diff_1, dtype: float64

這段代碼展示了如何使用 ARIMA 模型進行股票價格預測。通過預測差分后的數據,并將其轉換回原始價格,我們可以得到未來 30 天的預測結果。

責任編輯:趙寧寧 來源: 手把手PythonAI編程
相關推薦

2024-10-23 17:10:49

2024-07-18 13:13:58

2025-01-14 13:32:47

2023-03-16 07:27:30

CnosDB數據庫

2023-10-16 18:02:29

2023-03-27 07:34:28

XGBoostInluxDB時間序列

2021-04-07 10:02:00

XGBoostPython代碼

2024-01-30 01:12:37

自然語言時間序列預測Pytorch

2024-05-08 14:05:03

時間序列數據

2019-02-21 05:38:13

Kubernetes容器云計算

2023-02-07 16:21:37

時間序列列數據集

2025-01-16 16:24:07

2021-08-05 13:49:39

Python工具開發(fā)

2024-12-16 13:15:15

機器學習時間序列分析數據缺失

2017-01-09 09:20:07

Ubuntu NTP同步

2023-09-20 11:42:52

2024-02-27 17:32:30

時間序列分析庫PyTimeTK數據科學

2019-06-12 16:21:52

時間序列PythonPandas

2023-03-30 15:12:47

2025-01-13 07:23:14

PythonAeon開發(fā)
點贊
收藏

51CTO技術棧公眾號