Peço desculpas pela falta de clareza, ela é em razão do pouco
conhecimento sobre o R.
Entretanto, a indicação do laço while foi suficiente para resolver a
questão da seguinte forma:
obs.: talvez ainda haja maneira mais rápida: #Loop 2 n = nrow(y)
while (any ( (diff(y[,5]) == 0 & y[(-n), 13] == 'NC' &
y[-1, 13] !='NC' )))
{
y[-1, 13] = ifelse(diff(y[,5]) == 0 & y[-n, 13] == 'NC', 'NC',
y[-1, 13])
}
})
#Loop 3:
dy = diff(y[,5])
y[-1, 13] = ifelse(y[-1, 13] == 'C' & dy < 0,
'DOWNTICK', y[-1, 13])
y[-1, 13] = ifelse(y[-1, 13] == 'C' & dy > 0,
'UPTICK', y[-1, 13])
while (any(y[,13]=="C"))
{
y[-1, 13] = ifelse(y[-1, 13] == 'C' & dy == 0 & y[-n,
13]
%in% c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 13])
y[-1, 13] = ifelse(y[-1, 13] == 'C' & dy == 0 & y[-n,
13]
%in% c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1,
13])
}
})
Muito agradecido,
Luciano.
Em 6/20/2011 9:16 PM, Benilton Carvalho escreveu:
Luciano,
por gentileza, de uma descricao precisa e um exemplo
reproduzivel do codigo ao qual vc se refere como lento para que
possamos tentar ajudar.
O exemplo que te dei reproduz exatamente o codigo que voce
passou... mas entendo que, alem da eficiencia do codigo, vc se
refere a um outro problema, que me parece poder ser resolvido
com a execucao do codigo que passei em um laco while (no qual vc
armazena o estado anterior da sua tabela e suspende a execucao
quando voce obtiver duas tabelas identicas).
Dito isso, passe-nos um exemplo detalhado das condicoes
necessarias para cada caso possivel, incluindo uma tabela
inicial (que possa ser preferencialmente lida sem maiores
trabalhos por quem se propoe a te ajudar) e a tabela final
correta, a ser obtida no fim da execucao da rotina.
adicionalmente, os resultados que agora passo
batem com aqueles providos pelo seu codigo
original.
sobre o primeiro item nao ser classificado no
loop 2, e' um reflexo do que o seu codigo faz,
pois ele comeca a classificar em y[i+1,4] com
'i' comecando em 1...
Fiz uns
testes e realmente ficou muito mais rápido.
Apenas três problemas apareceram, todos com
a mesma provável resolução.
No loop 2:
O primeiro negócio não é classificado, e os
próximos, digamos, 6, mantém o mesmo preço,
logo, todos estes deveriam ser não
classificados. O código apenas desclassifica
o subsequente. Para que estivesse ok, teria
que ser repetido.
No loop 3:
Acontece algo semelhante. Se havia um
Zero.DOWNTICK, e o próximo negócio também
não mudou este tb deveria ser ZERO.DOWNTICK,
mas o código está mantendo "C".
Grato,
Luciano.
Em 6/20/2011 5:34 PM, Benilton Carvalho
escreveu:
abaixo, nao testado, deve estar
bem proximo do q vc precisa. b
Colaboradores
do grupo, realizei um
teste de financas em R,
conhecido como TICKTEST,
porém meu código ficou
muito lento. Talvez alguém
possa ajudar a torná-lo
mais ágil.
Grato,
Luciano
Resumidamente:
1 - Prentende-se
classificar mudanças de
preço em uma ação.
2 - O primeiro negócio do
dia não é classificado. Os
negócios subsequentes em
que haja estabilidade no
preço tb não são
classificados.
3 - Classifica-se as
restantes conforme o
movimento do preço. Se
sobe, UPTICK. Se desce,
DOWNTICK. Se é estável e a
última variação foi
positiva, ZERO.UPTICK. Se é
estável e a última
variação foi positiva,
ZERO.DOWNTICK.
Um exemplo dos dados:
Data
Operação
Preço
Classificação
1/1/2011
10
$10.00
NC
1/1/2011
20
$9.90
DOWNTICK
1/1/2011
30
$9.90
ZERO.DOWNTICK
1/1/2011
40
$10.10
UPTICK
1/1/2011
50
$10.20
UPTICK
1/2/2011
10
$9.80
NC
1/2/2011
20
$9.80
NC
1/2/2011
30
$9.90
UPTICK
1/2/2011
30
$9.90
ZERO.UPTICK
O CÓDIGO EM SI: # Abre o
arquivo de dados, cria um
novo objeto "y" com uma
coluna vazia.
x <-
read.table("dados.txt",sep=";",header=F,skip=1) y <-
cbind(x,(rep(NA,nrow(x)))) # 1º Loop:
Se a operação foi nº 10
não classifica, o resto
classifica. z
<- 1:nrow(x) for (t
in z) { if
(y[t,2]==10)
y[t,4]<-"NC" else y[t,4]
<-"C" }
# 2º Loop:
Se a operação anterior
não foi classificada e o
preço não mudou na
atual, desclassifica
esta também. w
<- 1:(nrow(x)-1) for (i in w) { if
(y[i,4]=="NC" &
y[i,3]==y[i+1,3])
y[i+1,4]<-"NC" } # 3º Loop:
divide as operações
classificadas em quatro
classes: for (i
in w) { # Se o
preço diminuiu,
DOWNTICK; if
(y[i+1,4]=="C" &
y[i,3]>y[i+1,3])
y[i+1,4]<-"DOWNTICK" # Se o
preço aumentou, UPTICK; if
(y[i+1,4]=="C" &
y[i,3]<y[i+1,3])
y[i+1,4]<-"UPTICK" #
Se o preço permaneceu
constante, mas a ultima
variação foi positiva,
ZERO.UPTICK; if
(y[i+1,4]=="C" &
y[i,3]==y[i+1,3] &
(y[i,4]=="UPTICK" |
y[i,4]=="ZERO.UPTICK"))
y[i+1,4]<-"ZERO.UPTICK" #Se o
preço permaneceu
constante, mas a ultima
variação foi negativa,
ZERO.DOWNTICK; if
(y[i+1,4]=="C" &
y[i,3]==y[i+1,3] &
(y[i,4]=="DOWNTICK" |
y[i,4]=="ZERO.DOWNTICK"))
y[i+1,4]<-"ZERO.DOWNTICK" }