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. b 2011/6/21 Luciano Ramos Gonçalves <[email protected]> > ** > A correção foi acertada. Mas não era o problema que eu havia mencionado. > Por exemplo: > > Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 > $10.00 > NC 1/1/2011 30 $10.00 NC 1/1/2011 40 $10.00 NC 1/1/2011 50 $10.20 > UPTICK 1/1/2011 60 $10.20 ZERO.UPTICK 1/1/2011 70 $10.20 ZERO.UPTICK > 1/1/2011 80 $10.20 ZERO.UPTICK 1/1/2011 90 $10.20 ZERO.UPTICK > Assim é que a seguinte sequencia deveria ser classificada, > Mas o código tem dado essa resposta: > Data Operação Preço Classificação 1/1/2011 10 $10.00 NC 1/1/2011 20 > $10.00 > NC 1/1/2011 30 $10.00 C 1/1/2011 40 $10.00 C 1/1/2011 50 $10.20 UPTICK > 1/1/2011 60 $10.20 ZERO.UPTICK 1/1/2011 70 $10.20 C 1/1/2011 80 $10.20 C > 1/1/2011 90 $10.20 C > O código olha apenas para o imediatamente anterior, o que atrapalha o > resultado. > > Luciano. > > Em 6/20/2011 8:29 PM, Benilton Carvalho escreveu: > > os sinais nos diffs pro loop 3 estavam invertidos (essa era a parte do > 'nao-testado'): > > dy = diff(y[,3]) > y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy < 0, 'DOWNTICK', y[-1, 4]) > y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy > 0, 'UPTICK', y[-1, 4]) > y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('UPTICK', > 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 4]) > y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('DOWNTICK', > 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 4]) > > 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... > > b > > 2011/6/21 Luciano Ramos Gonçalves <[email protected]> > >> 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 >> >> loop 1: >> >> y[,4] = ifelse(y[,2] == 10, 'NC', 'C') >> >> loop 2: >> >> n = nrow(y) >> y[-1, 4] = ifelse(diff(y[,3]) == 0 & y[-n, 4] == 'NC', 'NC', y[-1, 4]) >> >> loop 3: >> >> dy = diff(y[,3]) >> y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy > 0, 'DOWNTICK', y[-1, 4]) >> y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy < 0, 'UPTICK', y[-1, 4]) >> y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% c('UPTICK', >> 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 4]) >> y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% >> c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 4]) >> >> >> 2011/6/20 Luciano Ramos Gonçalves <[email protected]> >> >>> 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" >>> } >>> >>> _______________________________________________ >>> R-br mailing list >>> [email protected] >>> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br >>> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça >>> código mínimo reproduzível. >>> >> >> >> >> -- >> Successful people ask better questions, and as a result, they get better >> answers. (Tony Robbins) >> >> >> _______________________________________________ >> R-br mailing >> [email protected]https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br >> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código >> mínimo reproduzível. >> >> >> >> _______________________________________________ >> R-br mailing list >> [email protected] >> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br >> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça >> código mínimo reproduzível. >> > > > > -- > Successful people ask better questions, and as a result, they get better > answers. (Tony Robbins) > > > _______________________________________________ > R-br mailing > [email protected]https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br > Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código > mínimo reproduzível. > > > > _______________________________________________ > R-br mailing list > [email protected] > https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br > Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça > código mínimo reproduzível. > -- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)
_______________________________________________ R-br mailing list [email protected] https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
