Reamostrando séries temporais / dados de espectro para reduzir dimensões [Python: SciPy]

2019 ano 3 mês 26 dia

Este é um método quando você deseja diminuir os dados de série / espectro de tempo no DataFrame em Python.

Com "pandas.DataFrame.resample", você deve definir a hora como D (diário) e W (semanal) com o argumento.Se quiser diminuir os dados da série temporal ou dados do espectro que não têm uma coluna de data e hora, você pode usar o método a seguir.

O que são séries temporais / dados de espectro?

Dados de série temporal / espectrais são observados em intervalos regulares ao longo de um determinado eixo.A série de dados se aplica.Por exemplo, mudanças nos preços das ações e espectros de absorção.

Exemplo de dados de série temporal Exemplo de dados espectrais
・ Transição das condições de temperatura e precipitação
・ Mudanças nas condições de tráfego
· Vendas diárias
・ Mudanças nos preços das ações
・ Mudanças nos preços do Bitcoin
・ Dados de voz
- Espectro de absorção composto (IR, UV)
・ Espectro de corpos celestes

Embora cada classificação seja diferente, os dados têm as seguintes características semelhantes.

  1. Os pontos adjacentes a um ponto de medição assumem valores próximos
  2. O ruído está incluído no longo prazo (ampla gama)

参照: https://kotobank.jp/word/%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF-1329677 https://datachemeng.com/preprocessspectratimeseriesdata/

Reamostragem de séries temporais / dados espectrais

Ao criar um modelo de previsão com base em séries temporais / dados espectrais, se forem usados ​​dados em todos os pontos de medição, um grande número de recursos será criado.Uma vez que isso leva ao sobreajuste, a redução da dimensão por redução da resolução é eficaz para melhorar o desempenho de generalização.

O que usar: SciPy (scipy.signal)

Software de código aberto para matemática, ciências e engenhariaEcossistema Ware (uma variedade de bibliotecas de computação científica avançada).

Ele pode realizar processamento aritmético numérico mais avançado do que NumPy e pode facilmente executar integração numérica, processamento de sinal, otimização, estatísticas, etc. a partir de constantes físicas, matrizes esparsas e distribuições de probabilidade.

scipy.signal é um módulo relacionado ao processamento de formas de onda em scipy.

  • scipy.signal.decimate

importar numpy como np do sinal de importação scipy # Criar os dados de forma de onda de 40 pontos subjacentes x = np.linspace (0, 10, 40, endpoint = False) y = np.cos (-x ** 2/6) # Reduzir a resolução para 20 pontos com base nos dados x_down = np.linspace (0, 10, 20, endpoint = False) y_down = signal.decimate (y, 2) #Downsampling to 2/1 #Plot o resultado em um gráfico% matplotlib inline plt.plot (x, y, '.-', label = 'data') plt.plot (x_down, y_down, 'rs-', label = 'down-sampled', alpha = 0.5) plt.legend () plt.show ( )
Reduzir a resolução com scipy.signal.decimate
Reduzir a resolução com scipy.signal.decimate

scipy.signal.decimate executa o processamento de anti-aliasing e reduz a resolução (o processamento de anti-aliasing é o processamento para eliminar a distorção durante a amostragem de dados contínuos em intervalos regulares).É reamostrado em uma forma semelhante àquela com os pontos de dados reduzidos como estão.

Referência:https://docs.scipy.org/doc/scipy-1.2.1/reference/generated/scipy.signal.decimate.html

  • scipy.sinal.reamostra

#Criar dados de forma de onda de 40 base x = np.linspace (0, 10, 40, endpoint = False) y = np.cos (-x ** 2/6) # 2.5 vezes com base nos dados Amostragem para 100 pontos x_up = np .linspace (0, 10, 100, endpoint = False) y_up = signal.resample (y, 100) # Reduzir a resolução para metade 20 pontos com base nos dados x_down = np.linspace (0, 10, 20, endpoint = False) y_down = signal.resample (y, 20) #Plote o resultado em um gráfico importe matplotlib.pyplot as plt% matplotlib inline plt.plot (x, y, '.-', label = 'data') plt.plot (x_up, y_up , 'go-', label = 'up-sample', alpha = 0.3) plt.legend () plt.show () plt.plot (x, y, '.-', label = 'data') plt.plot (x_down, y_down, 'rs-', label = 'down-sampled', alpha = 0.5) plt.legend () plt.show ()
Dados de forma de onda processados ​​por scipy.signal.resample
Dados de forma de onda processados ​​por scipy.signal.resample

Como scipy.signal.resample está reamostrando usando a transformada de Fourier, isso se baseia na suposição de que o sinal é periódico.Se a periodicidade não for satisfeita, como no final dos dados acima, o valor sofrerá um desvio significativo.

A propósito, scipy.signal.resample também pode ser up-sampling.
A linha azul é o ponto de dados original, a verde é o gráfico após o aumento da resolução e o vermelho é o gráfico após a redução da resolução.

 

competição de análise de voz kaggleHá também um exemplo de uso em, portanto, será útil.

Referência:https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.signal.resample.html

Aplicar ao DataFrame

As linhas são para cada ponto de medição e as colunas são para cada quadro de dados de amostra.

import pandas as pd # Cria dados a serem armazenados no quadro de dados y1 = np.cos (-x ** 2/6) * 1/2 y2 = np.cos (x) * 1/3 df1 = pd.DataFrame ( {{'y': y, 'y1': y1, 'y2': y2}) # Redução da resolução df1_down = signal.decimate (df1, 2, axis = 0) df1_down = pd.DataFrame (df1_down, columns = ['y_down ',' y1_down ',' y2_down '], index = np.linspace (0, 10, 20, endpoint = False)) # Exibir dados de amostragem reduzida e imprimir plot (df1.head (10)) print (df1_down.head) ( 10)) df1.plot (kind = 'linha', marcador = '.') Df1_down.plot (tipo = 'linha', marcador = '.')
df1.head (10) df1_down.head (10)
 df1.head (10) df1_down.head (10)
Pontos de dados antes e depois da redução da resolução
Antes da redução da resolução Após a redução da resolução

Mesmo se você reduzir a amostragem dos 40 pontos originais para 1 pontos, que é 2/20, a forma de onda é mantida com alta precisão e parece que há pouca perda de informação, mesmo se for usada como um recurso.

Um exemplo de um quadro de dados com linhas para cada amostra e colunas para cada ponto de medição
Quando a linha é cada amostra e a coluna é cada ponto de medição

Se a linha acima for cada amostra e a coluna for um quadro de dados de cada ponto de medição (os chamados dados ordenados), o argumentoaxis=1Se sim, está tudo bem.