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" }