Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Adicionando pontos em um intervalo de dados conhecidos

Estou trabalhando em análise de dados utilizando Python e para isso estou treinando algoritmos do tipo SVC e K-means. Os dados utilizados para o treinamento contam com um espaçamento fixo entre cada amostra, pois são amostrados por um osciloscópio em períodos fixos de tempo, em contrapartida, tenho dados obtidos também por simulação, que por questões de performance, apresentam espaçamento variado entre as amostras e um número menor de pontos, o que dificulta a utilização destas duas fontes de dados na mesma análise. Existe um método usando numpy ou pandas para realizar esse pré-processamento dos meus dados de simulação?

Um Ex do que deve ser feito:

Array da simulação = [ 1.0, 2.0, 3.0]

Array processada = [ 1.0, 1.5, 2.0, 2.5, 3.0]

6 respostas

Fazer isso nos dados simulados não alteraria o resultado? Dependendo de como foram utilizados esses dados, inserir valores intermediários poderia gerar falsos resultados na sua análise

Os pontos a serem adicionados devem fazer sentido, algo como um valor obtido através de interpolação, só adicionaria mais passos na silhueta que já existe. Eu não conheço profundamente o pandas ou numpy, não sei se existe essa possibilidade.

Eu estou lendo "Python para Análise de Dados - Wes McKinney" - Tratamento de de dados com Pandas, Numpy e Ipython --> https://novatec.com.br/livros/python-para-analise-de-dados/

solução!

O próprio numpy possui uma função chamada "interp" (vale a pena ver a documentação), mas minha preferência é pelo pacote "scipy" que possuiu diversas formas de interpolação, como no exemplo a seguir:

Primeiro importo numpy e scipy

import numpy as np
from scipy import interpolate

Crio agora os dados:

dados_x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
dados_y = [10.0, 20.0, 30.0, 40.0, 50.0, 70.0, 90.0, 100.0, 200.0, 300.0]

Faço agora a interpolação:

interp = interpolate.interp1d(dados_x, dados_y)

tenha em mente que agora a variável interp contém um objeto que é capaz de fazer a interpolação

Por fim, passo para a interpolação novos dados:

new_x = np.arange(1, 10, 0.1)
new_y = interp(new_x)

Agora, a variável new_y contém um array numpy, como esse no caso do exemplo:

array([ 10., 11., 12., 13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24., 25., 26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38., 39., 40., 41., 42., 43., 44., 45., 46., 47., 48., 49., 50., 52., 54., 56., 58., 60., 62., 64., 66., 68., 70., 72., 74., 76., 78., 80., 82., 84., 86., 88., 90., 91., 92., 93., 94., 95., 96., 97., 98., 99., 100., 110., 120., 130., 140., 150., 160., 170., 180., 190., 200., 210., 220., 230., 240., 250., 260., 270., 280., 290.])

Ademais, caso precise interpolar valores em 1D, 2D, 3D, dê uma olhada nas docs:

Função no numpy: https://docs.scipy.org/doc/numpy/reference/generated/numpy.interp.html

Função no scipy: https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.interpolate.interp1d.html

Todas as interpolações: https://docs.scipy.org/doc/scipy-0.19.1/reference/interpolate.html

Espero ter ajudado, Sucesso!

Eduardo Pietre, muito obrigado pela resposta. Funcionou perfeitamente, só resta eu aprender a dar um "smooth" na curva para suavizar os pontos.

Concordo plenamente com o comentário do Juliano, "Os pontos a serem adicionados devem fazer sentido..." sobre a mudança dos dados que você dará como entrada. Porém tb sei que nem sempre temos os dados como precisamos. Seria mais certo talvez fazer um downsampling de um dos dados, reduzindo os erros devido a dados extras devido a interpolacão.

Uma vez dado o warning, o que você quer é uma interpolação!

Para fazer isso, use a funcão interp do numpy

import numpy as np x = np.linspace(0, 2np.pi, 10) y = np.sin(x) xvals = np.linspace(0, 2np.pi, 50) yinterp = np.interp(xvals, x, y) Esse exemplo é o mesmo do manual, que lá explica condicões limites tb, que podem ser relevantes conforme você está aplicando.

np.interp também funciona para downsampling.