Reamostrando séries temporais / dados de espectro para reduzir dimensões [Python: SciPy]
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.
- Os pontos adjacentes a um ponto de medição assumem valores próximos
- 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 ( )
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 ()
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 = '.')
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.
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=1
Se sim, está tudo bem.
discussão
Lista de comentários
Ainda não há comentários