AI con Python: analisi dei dati delle serie temporali

La previsione del successivo in una determinata sequenza di input è un altro concetto importante nell'apprendimento automatico. Questo capitolo fornisce una spiegazione dettagliata sull'analisi dei dati delle serie temporali.

introduzione

Per dati di serie temporali si intendono i dati che si trovano in una serie di intervalli di tempo particolari. Se vogliamo costruire la previsione della sequenza nell'apprendimento automatico, dobbiamo occuparci di dati e tempo sequenziali. I dati di serie sono un abstract di dati sequenziali. L'ordinamento dei dati è una caratteristica importante dei dati sequenziali.

Concetto di base di analisi di sequenze o analisi di serie temporali

L'analisi della sequenza o analisi delle serie temporali consiste nel prevedere il successivo in una data sequenza di input in base a quanto osservato in precedenza. La previsione può riguardare qualsiasi cosa possa venire dopo: un simbolo, un numero, il tempo del giorno successivo, il termine successivo nel discorso ecc. L'analisi delle sequenze può essere molto utile in applicazioni quali analisi del mercato azionario, previsioni del tempo e consigli sui prodotti.

Example

Considera il seguente esempio per comprendere la previsione della sequenza. QuiA,B,C,D sono i valori dati e devi prevederne il valore E utilizzando un modello di previsione della sequenza.

Installazione di pacchetti utili

Per l'analisi dei dati delle serie temporali utilizzando Python, è necessario installare i seguenti pacchetti:

Panda

Pandas è una libreria con licenza BSD open source che fornisce alte prestazioni, facilità d'uso della struttura dei dati e strumenti di analisi dei dati per Python. Puoi installare Pandas con l'aiuto del seguente comando:

pip install pandas

Se stai usando Anaconda e vuoi installare usando il conda gestore di pacchetti, quindi puoi utilizzare il seguente comando:

conda install -c anaconda pandas

hmmlearn

È una libreria con licenza BSD open source che consiste in semplici algoritmi e modelli per apprendere Hidden Markov Models (HMM) in Python. Puoi installarlo con l'aiuto del seguente comando:

pip install hmmlearn

Se stai usando Anaconda e vuoi installare usando il conda gestore di pacchetti, quindi puoi utilizzare il seguente comando:

conda install -c omnia hmmlearn

PyStruct

È una libreria strutturata di apprendimento e previsione. Gli algoritmi di apprendimento implementati in PyStruct hanno nomi come campi casuali condizionali (CRF), reti casuali di Markov a margine massimo (M3N) o macchine vettoriali di supporto strutturale. Puoi installarlo con l'aiuto del seguente comando:

pip install pystruct

CVXOPT

Viene utilizzato per l'ottimizzazione convessa basata sul linguaggio di programmazione Python. È anche un pacchetto software gratuito. Puoi installarlo con l'aiuto del seguente comando:

pip install cvxopt

Se stai usando Anaconda e vuoi installare usando il conda gestore di pacchetti, quindi puoi utilizzare il seguente comando:

conda install -c anaconda cvdoxt

Panda: gestione, sezionamento ed estrazione di statistiche dai dati di serie temporali

Pandas è uno strumento molto utile se devi lavorare con i dati delle serie temporali. Con l'aiuto di Panda, puoi eseguire quanto segue:

  • Crea un intervallo di date utilizzando il pd.date_range pacchetto

  • Indicizza i panda con le date utilizzando l'estensione pd.Series pacchetto

  • Eseguire il ricampionamento utilizzando il ts.resample pacchetto

  • Cambia la frequenza

Esempio

L'esempio seguente mostra come gestire e affettare i dati delle serie temporali utilizzando Pandas. Si noti che qui stiamo utilizzando i dati sull'oscillazione artica mensile, che possono essere scaricati da Monthly.ao.index.b50.current.ascii e possono essere convertiti in formato testo per il nostro uso.

Gestione dei dati di serie temporali

Per gestire i dati delle serie temporali, dovrai eseguire i seguenti passaggi:

Il primo passaggio prevede l'importazione dei seguenti pacchetti:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

Quindi, definire una funzione che leggerà i dati dal file di input, come mostrato nel codice riportato di seguito -

def read_data(input_file):
   input_data = np.loadtxt(input_file, delimiter = None)

Ora converti questi dati in serie temporali. Per questo, crea l'intervallo di date delle nostre serie temporali. In questo esempio, manteniamo un mese come frequenza dei dati. Il nostro file contiene i dati che iniziano dal gennaio 1950.

dates = pd.date_range('1950-01', periods = input_data.shape[0], freq = 'M')

In questo passaggio, creiamo i dati delle serie temporali con l'aiuto di Pandas Series, come mostrato di seguito:

output = pd.Series(input_data[:, index], index = dates)	
return output
	
if __name__=='__main__':

Immettere il percorso del file di input come mostrato qui -

input_file = "/Users/admin/AO.txt"

Ora converti la colonna in formato serie temporale, come mostrato qui -

timeseries = read_data(input_file)

Infine, traccia e visualizza i dati, utilizzando i comandi mostrati -

plt.figure()
timeseries.plot()
plt.show()

Osserverai le trame come mostrato nelle immagini seguenti:

Sezionamento dei dati di serie temporali

Il sezionamento implica il recupero solo di una parte dei dati delle serie temporali. Come parte dell'esempio, stiamo suddividendo i dati solo dal 1980 al 1990. Osserva il seguente codice che esegue questa operazione:

timeseries['1980':'1990'].plot()
   <matplotlib.axes._subplots.AxesSubplot at 0xa0e4b00>

plt.show()

Quando si esegue il codice per affettare i dati delle serie temporali, è possibile osservare il grafico seguente come mostrato nell'immagine qui:

Estrazione di statistiche dai dati delle serie storiche

Dovrai estrarre alcune statistiche da un dato dato, nei casi in cui devi trarre qualche conclusione importante. Media, varianza, correlazione, valore massimo e valore minimo sono alcune di queste statistiche. È possibile utilizzare il codice seguente se si desidera estrarre tali statistiche da una determinata serie temporale di dati:

Significare

Puoi usare il file mean() funzione, per trovare la media, come mostrato qui -

timeseries.mean()

Quindi l'output che osserverai per l'esempio discusso è:

-0.11143128165238671

Massimo

Puoi usare il file max() funzione, per trovare il massimo, come mostrato qui -

timeseries.max()

Quindi l'output che osserverai per l'esempio discusso è:

3.4952999999999999

Minimo

Puoi usare la funzione min (), per trovare il minimo, come mostrato qui -

timeseries.min()

Quindi l'output che osserverai per l'esempio discusso è:

-4.2656999999999998

Ottenere tutto in una volta

Se vuoi calcolare tutte le statistiche contemporaneamente, puoi usare il describe() funzione come mostrato qui -

timeseries.describe()

Quindi l'output che osserverai per l'esempio discusso è:

count   817.000000
mean     -0.111431
std       1.003151
min      -4.265700
25%      -0.649430
50%      -0.042744
75%       0.475720
max       3.495300
dtype: float64

Ricampionamento

È possibile ricampionare i dati a una diversa frequenza temporale. I due parametri per eseguire il ricampionamento sono:

  • Periodo di tempo
  • Method

Ricampionamento con media ()

È possibile utilizzare il codice seguente per ricampionare i dati con il metodo mean (), che è il metodo predefinito:

timeseries_mm = timeseries.resample("A").mean()
timeseries_mm.plot(style = 'g--')
plt.show()

Quindi, puoi osservare il grafico seguente come output del ricampionamento usando mean () -

Ricampionamento con mediana ()

È possibile utilizzare il codice seguente per ricampionare i dati utilizzando il median()metodo -

timeseries_mm = timeseries.resample("A").median()
timeseries_mm.plot()
plt.show()

Quindi, puoi osservare il grafico seguente come output del ricampionamento con median () -

Media rotolante

È possibile utilizzare il codice seguente per calcolare la media mobile (mobile):

timeseries.rolling(window = 12, center = False).mean().plot(style = '-g')
plt.show()

Quindi, puoi osservare il grafico seguente come output della media mobile (mobile):

Analisi dei dati sequenziali tramite Hidden Markov Model (HMM)

HMM è un modello statistico ampiamente utilizzato per dati con continuazione ed estensibilità come analisi del mercato azionario di serie temporali, controllo dello stato di salute e riconoscimento vocale. Questa sezione tratta in dettaglio l'analisi dei dati sequenziali utilizzando Hidden Markov Model (HMM).

Modello Markov nascosto (HMM)

HMM è un modello stocastico che si basa sul concetto di catena di Markov basato sull'assunto che la probabilità di statistiche future dipenda solo dallo stato del processo corrente piuttosto che da qualsiasi stato che lo ha preceduto. Ad esempio, quando si lancia una moneta, non possiamo dire che il risultato del quinto lancio sarà una testa. Questo perché una moneta non ha memoria e il risultato successivo non dipende dal risultato precedente.

Matematicamente, HMM è costituito dalle seguenti variabili:

Stati (S)

È un insieme di stati nascosti o latenti presenti in un HMM. È indicato da S.

Simboli di uscita (O)

È un insieme di possibili simboli di output presenti in un HMM. È indicato con O.

Matrice delle probabilità di transizione di stato (A)

È la probabilità di effettuare la transizione da uno stato a ciascuno degli altri stati. È indicato con A.

Matrice delle probabilità di emissione di osservazione (B)

È la probabilità di emettere / osservare un simbolo in uno stato particolare. È indicato con B.

Matrice delle probabilità a priori (Π)

È la probabilità di partire da uno stato particolare da vari stati del sistema. È indicato con Π.

Quindi, un HMM può essere definito come = (S,O,A,B,),

dove,

  • S = {s1,s2,…,sN} è un insieme di N possibili stati,
  • O = {o1,o2,…,oM} è un insieme di M possibili simboli di osservazione,
  • A è un file NN stato Transition Probability Matrix (TPM),
  • B è un NM osservazione o matrice delle probabilità di emissione (EPM),
  • π è un vettore di distribuzione di probabilità dello stato iniziale N dimensionale.

Esempio: analisi dei dati del mercato azionario

In questo esempio, analizzeremo i dati del mercato azionario, passo dopo passo, per avere un'idea di come l'HMM lavora con dati sequenziali o di serie temporali. Tieni presente che stiamo implementando questo esempio in Python.

Importa i pacchetti necessari come mostrato di seguito:

import datetime
import warnings

Ora, usa i dati del mercato azionario del file matpotlib.finance pacchetto, come mostrato qui -

import numpy as np
from matplotlib import cm, pyplot as plt
from matplotlib.dates import YearLocator, MonthLocator
try:
   from matplotlib.finance import quotes_historical_yahoo_och1
except ImportError:
   from matplotlib.finance import (
      quotes_historical_yahoo as quotes_historical_yahoo_och1)

from hmmlearn.hmm import GaussianHMM

Carica i dati da una data di inizio e una data di fine, ovvero tra due date specifiche come mostrato qui -

start_date = datetime.date(1995, 10, 10)
end_date = datetime.date(2015, 4, 25)
quotes = quotes_historical_yahoo_och1('INTC', start_date, end_date)

In questo passaggio, estrarremo ogni giorno le virgolette di chiusura. Per questo, usa il seguente comando:

closing_quotes = np.array([quote[2] for quote in quotes])

Ora, estraiamo il volume di azioni scambiate ogni giorno. Per questo, usa il seguente comando:

volumes = np.array([quote[5] for quote in quotes])[1:]

Qui, prendi la differenza percentuale dei prezzi di chiusura delle azioni, utilizzando il codice mostrato di seguito -

diff_percentages = 100.0 * np.diff(closing_quotes) / closing_quotes[:-]
dates = np.array([quote[0] for quote in quotes], dtype = np.int)[1:]
training_data = np.column_stack([diff_percentages, volumes])

In questo passaggio, crea e addestra l'HMM gaussiano. Per questo, usa il codice seguente:

hmm = GaussianHMM(n_components = 7, covariance_type = 'diag', n_iter = 1000)
with warnings.catch_warnings():
   warnings.simplefilter('ignore')
   hmm.fit(training_data)

Ora, genera i dati usando il modello HMM, usando i comandi mostrati -

num_samples = 300
samples, _ = hmm.sample(num_samples)

Infine, in questo passaggio, tracciamo e visualizziamo la differenza percentuale e il volume delle azioni scambiate come output sotto forma di grafico.

Usa il codice seguente per tracciare e visualizzare le percentuali di differenza:

plt.figure()
plt.title('Difference percentages')
plt.plot(np.arange(num_samples), samples[:, 0], c = 'black')

Usa il seguente codice per tracciare e visualizzare il volume di azioni scambiate -

plt.figure()
plt.title('Volume of shares')
plt.plot(np.arange(num_samples), samples[:, 1], c = 'black')
plt.ylim(ymin = 0)
plt.show()