Vou separa os dados por ciclos (quantidade de vezes que o arco elétrico passou pelos eletrodos) para poder filtrar os melhores dados descartando as vezes que o arco não correu totalmente os eletrodos.
Para isto, pretendo calcular a distância entre todos os pontos e, sendo esta distância maior ou menor do que o comprimento dos eletrodos, vou classificar como sendo um novo ciclo ou não.
Porém, primeiramente quero determinar qual a melhor distância para utilizar como critério de seleção (ou seja, qual a distância média percorrida pelo arco elétrico nos eletrodos). Então, vou calcular as distâncias entre os pontos e fazer histogramas para visualizar a frequencia de distribuição dessas distâncias.
In [8]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import os
#Mudar a localização da pasta
#os.chdir('/home/glauffer/Dropbox/Research/Plasma/')
#Ler os dados como arrays
teste1 = np.array(np.loadtxt('/home/glauffer/Dropbox/Research/Plasma/dados/tempo_posicao/1teste_b17a45_manual_completo.txt'))
teste2 = np.array(np.loadtxt('/home/glauffer/Dropbox/Research/Plasma/dados/tempo_posicao/2teste_b22a45_manual_completo.txt'))
teste3 = np.array(np.loadtxt('/home/glauffer/Dropbox/Research/Plasma/dados/tempo_posicao/3teste_b17a55_manual_completo.txt'))
teste4 = np.array(np.loadtxt('/home/glauffer/Dropbox/Research/Plasma/dados/tempo_posicao/4teste_b22a55_manual_completo.txt'))
teste5 = np.array(np.loadtxt('/home/glauffer/Dropbox/Research/Plasma/dados/tempo_posicao/5teste_b17a45_manual_completo.txt'))
#plt.plot(teste2.T[0], teste2.T[1])
In [9]:
#Funcao para calcular o modulo da distancia entre os pontos
def dist_module(data):
'''
Calcula o modulo da distancia entre os pontos
'''
pos_y = data.T[1] #utiliza apenas os dados em Y (posicao)
delta = np.zeros(pos_y.size-1)
for i in range(delta.size):
delta[i] = abs(pos_y[i+1]-pos_y[i])
#offset = meann*delta.mean() + stdd*delta.std()
#delta_max = np.zeros(delta.size)
#for i in range(delta.size):
#if delta[i] > offset:
#delta_max[i] = delta[i]
#masked_delta_max = np.ma.masked_equal(delta_max, 0.0, copy=False)
return delta
In [45]:
#Calcular as distancias entre os pontos para todos os dados
dist1 = dist_module(teste1)
dist2 = dist_module(teste2)
dist3 = dist_module(teste3)
dist4 = dist_module(teste4)
dist5 = dist_module(teste5)
#Vou plotar as distancias de um dos dados para fazer uma analise
dist1_std = np.std(dist1)*np.ones(dist1.size)
plt.plot(dist1, 'bo', dist1_std, 'r--', dist1, 'b-', ms=3)
Out[45]:
Podemos perceber pelo grafico acima que quando ocorre um pico no modulo da distancia significa que ocorre um novo ciclo. A faixa tracejada em vermelho é o desvio padrão dos dados. Existem alguns pontos acima da linha que estão muito perto do desvio padrão, então nao podemos utiliza o desvio como criterio. Vou subtrair os dados pelo desvio para analisar o grafico
In [46]:
res1 = dist1 - dist1_std
plt.plot(res1, 'ko', dist1_std, 'r--', res1, 'k-', ms=3)
Out[46]:
Agora podemos perceber que há uma maior distancia entre os pontos acima da linha tracejada. Vou utilizar como critério este residuo (dados - desvio padrao), sendo que se a distancia entre os pontos for menor que este residuo, continua como o mesmo ciclo, porem, se a distancia for maior que o residuo, temos um ciclo novo.
Vou fazer gráfico para os residuos e desvio padrao para os outros dados para confirmar essa ideia.
In [43]:
dist2_std = np.std(dist2)*np.ones(dist2.size)
dist3_std = np.std(dist3)*np.ones(dist3.size)
dist4_std = np.std(dist4)*np.ones(dist4.size)
dist5_std = np.std(dist5)*np.ones(dist5.size)
res2 = dist2 - dist2_std
res3 = dist3 - dist3_std
res4 = dist4 - dist4_std
res5 = dist5 - dist5_std
f, axarr = plt.subplots(2, 2)
axarr[0, 0].plot(res2, 'k-', res2, 'ko', dist2_std, 'r--', ms=3)
axarr[0, 0].set_title('2')
axarr[0, 1].plot(res3, 'k-', res3, 'ko', dist3_std, 'r--', ms=3)
axarr[0, 1].set_title('3')
axarr[1, 0].plot(res4, 'k-', res4, 'ko', dist4_std, 'r--', ms=3)
axarr[1, 0].set_title('4')
axarr[1, 1].plot(res5, 'k-', res5, 'ko', dist5_std, 'r--', ms=3)
axarr[1, 1].set_title('5')
Out[43]:
COnforme o gráfico acima, os pico importantes estão acima da linha tracejada. Então, vou utilizar os residuos como meu critério de separação dos dados.
In [90]:
def split_data(data):
'''
Separando os dados por ciclos, utilizando o residuo (dado - desvio_padrao)
como critério de seleção. Se a distância for maior que o desvio padrão, temos um novo ciclo
'''
delta = dist_module(data)
desvio = np.std(delta)
residuo = delta - desvio
ciclo = np.zeros((data.T[1].size,2))
k = 0
j = 0
indices = []
for i in range(len(data.T[1])):
try:
if residuo[i] < desvio:
ciclo[i] = data[i]
elif residuo[i] >= desvio:
ciclo[i] = data[i]
k = k+1
j = i + 1
indices.append(j)
except IndexError:
ciclo[i] = data[i]
k = k + 1
return ciclo, indices
split1, ind1 = split_data(teste1)
split2, ind2 = split_data(teste2)
split3, ind3 = split_data(teste3)
split4, ind4 = split_data(teste4)
split5, ind5 = split_data(teste5)
In [93]:
#Teste de plot para verificar se deu certo a separação
for i in range(len(ind5)):
try:
plt.plot(teste5.T[0][ind5[i]:ind5[i+1]], teste5.T[1][ind5[i]:ind5[i+1]])
except IndexError:
plt.plot(teste5.T[0][ind5[i]:], teste5.T[1][ind5[i]:])
#Deu certo!
Vou escrever um codigo para separar os dados me baseando nesta ideia. O código esta nesta mesma pasta sob o nome split_data.py
In [ ]:
In [89]:
In [ ]: