Interpolando funções em seus dados usando Python [PARTE 2]

Faaaala cientista! Tudo certo?
Vamos falar mais de interpolação hoje. Usaremos funções de base radial, ferramentas mais parrudas para uma era mais civilizada. Vamos lá?

Para usarmos funções de base radial no SciPy chamamos a função Rbf, presente em interpolate.rbf. Da mesma forma que interp1d, Rbf gera uma função. Ela recebe um argumento, ‘function’, que especifica o tipo de interpolação utilizada. O padrão é ‘multiquadric’, que indica que utilizaremos a função multiquadrática.

Os argumentos válidos são ‘multiquadric’ (multiquadrática), ‘inverse’ (inversa), ‘gaussian’ (gaussiana), ‘linear’ (linear), ‘cubic’ (spline cúbica), ‘quintic’ (spline quíntica) e ‘thin_plate’ (spline “prato fino”).
As funções-base são:

  • ‘multiquadric’: sqrt((r/self.epsilon)**2 + 1)
  • ‘inverse’: 1.0/sqrt((r/self.epsilon)**2 + 1)
  • ‘gaussian’: exp(-(r/self.epsilon)**2)
  • ‘linear’: r
  • ‘cubic’: r**3
  • ‘quintic’: r**5
  • ‘thin_plate’: r**2 * log(r)

Para mais informações sobre a função Rbf, veja a documentação do SciPy:
http://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.interpolate.Rbf.html

from scipy.interpolate.rbf import Rbf  # funções de base radial
from urllib.request import urlopen

import matplotlib.pyplot as plt
import numpy as np

url = 'http://real-chart.finance.yahoo.com/table.csv?s=PETR4.SA&d=9&e=17&f=2015&g=d&a=0&b=3&c=2000&ignore=.csv'
petro_csv = urlopen(url)
data_petro = np.genfromtxt(petor_csv, delimiter=',', dtype=None)
data_petro = data_petro[1:,1:]

"""
Repare no post anterior que os dados estão decrescendo
de acordo com o tempo (de 2015 para o primeiro ano).
Então, inverteremos a ordem dos dados.
"""

data_petro = np.flipud(data_petro)
adj_close = np.array(data_petro[:, 5:].flatten(), dtype=float)  # "Achatar" o vetor para 1 dimensão
fim = np.shape(adj_close)[0]

Primeiro importamos os pacotes necessários e a função Rbf. Também obtemos o conjunto de dados e retiramos as primeiras linha e coluna, como descrito no post anterior. Após esses passos invertemos o vetor de dados, de forma que os resultados sejam crescentes.

adj_x = np.linspace(0, fim, fim, endpoint=True)  # Criando eixo X com dias.
rbf_adj = Rbf(adj_x, adj_close)

Aqui criamos um eixo X para servir de suporte à função. Veja que aplicá-la é simples: fornecemos apenas os valores do eixo X e do eixo Y (os pontos de interesse). Como não especificamos o parâmetro ‘function’, Rbf utilizará a função multiquadrática.

# Tomando os primeiros 60 dias. Criando também um eixo X
adj_bimes = adj_close[:60]  
eixo_x = np.linspace(0, 60, 500)

# Interpolando o resultado entre os 60 dias.
plt.figure()

# Plotando os pontos originais.
plot3 = plt.plot(adj_bimes, 'ko', markersize=12)  # os pontos originais.

Da mesma forma que nesse post, definimos um intervalo para verificar a qualidade da interpolação. Dessa vez tomamos um intervalo de 60 dias. Depois, criamos um eixo X de suporte para esse intervalo e plotamos os pontos originais.

# Interpolando.
# function = 'linear':
rbf_adj = Rbf(adj_x, adj_close, function='linear')
lin_bimes = rbf_adj(eixo_x)
plot3 = plt.plot(eixo_x, lin_bimes, '-', label='lin')

Agora usamos a função Rbf. O argumento ‘function’ que escolhemos aqui é ‘linear’. Ela gera uma função (rbf_adj), da qual obteremos o ajuste (lin_bimes). Depois plotaremos o resultado.

Veja que fornecemos o argumento label na função plot. Com esse argumento, podemos informar o rótulo de uma função na legenda do gráfico (com o comando legend).

Vamos testar outra função?

# function = 'cubic':
rbf_adj = Rbf(adj_x, adj_close, function='cubic')
cub_bimes = rbf_adj(eixo_x)
plot3 = plt.plot(eixo_x, cub_bimes, '-', label='cubic')

Dessa vez, o argumento ‘function’ em Rbf é ‘cubic’. Obtemos a função rbf_adj e o ajuste cub_bimes. Depois plotamos o resultado.

leg = plt.legend()
plt.show()

Por fim, colocamos uma legenda e pedimos pra plotar. Como dissemos, ela usa os argumentos em label para rotular cada gráfico. O gráfico resultante é dado abaixo. Veja a diferença entre as duas interpolações:

plot_adjrbf

É isso aí cientista! Nesse post vimos como trabalhar com mais uma função para interpolar dados, a Rbf. Vimos também como rotular funções e colocar legendas em um gráfico a partir delas. Teste a função Rbf com outros parâmetros, e também em outras partes do gráfico! Também modifique cores conforme desejar. Comente suas modificações conosco, ok?

Por hoje é só cientista! Um giga abraço e até a próxima!


Gostou? Curta e compartilhe com seus amigos!
Quer baixar os códigos do Programando Ciência? Corre lá no nosso GitHub!
Faça uma doação pro Programando Ciência!
Curta a gente também no Facebook: www.facebook.com/programandociencia
Estou no Twitter! Siga-me se puder! @alexdesiqueira

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s