Thursday 28 December 2017

Calcular mover média em sas


Neste post, eu mostro um truque para fazer cálculo de média móvel (pode ser estendido para outras operações que exigem funções de janelas) que é super rápido. Muitas vezes, os analistas SAS precisam realizar cálculos de média móvel e existem várias opções pela ordem de preferência: 1. PROC EXPAND 2. DADOS PASSO 3. PROC SQL Mas muitos sites podem não licenciados SASETS para usar PROC EXPAND e fazer média móvel em dados STEP requer alguma codificação e é propenso a erros. PROC SQL é uma escolha natural para programadores júnior e em muitos casos de negócios a única solução, mas o SAS SQL PROC não possui funções de janelas que estão disponíveis em muitos DBs para facilitar o cálculo da média móvel. Uma técnica que as pessoas costumam usar é CROSS JOIN, que é muito cara e não é uma solução viável para um conjunto de dados de tamanho médio. Neste post, eu mostro um truque para fazer cálculo de média móvel (pode ser estendido para outras operações que exigem funções de janelas) que é super rápido. Considere o cálculo da média móvel mais simples onde as observações K de arrasto estão incluídas no cálculo, a saber MA (K), aqui nós ajustamos K5. Primeiro, geramos um dado de 20 obs, onde a variável ID deve ser usada para o windowing ea variável X deve ser usada no cálculo do MA, e então aplicamos o CROSS JOIN padrão para examinar primeiro os dados resultantes, Non-Grouped, apenas Para entender como alavancar a estrutura de dados. A partir do conjunto de dados resultante, é difícil encontrar uma pista, agora vamos classificar por quotbidquot coluna neste conjunto de dados: A partir desta triada dados, é claro que nós realmente don39t tem CROSS JOIN todo o conjunto de dados originais, mas em vez disso, Podemos gerar um conjunto de dados de quotoperationquot que contém o valor de diferença e deixar o conjunto de dados original CROSS JOIN com este conjunto de dados de quotoperationquot muito menor e todos os dados que precisamos usar para o cálculo de MA estarão lá. Agora vamos fazer isso: CROSS JOIN dados originais com quotoperationquot dados, classificar por (a. idops), que é realmente quotbid39 no conjunto de dados classificados Note que no código acima, é necessário ter ax multiplicar por b. weight para que os dados Pode ser inter-leaved, caso contrário o mesmo valor X da tabela original será saída e MA cálculo será falha. A variável de peso explícito realmente acrescenta mais flexibilidade ao cálculo de MA inteiro. Ao configurá-lo para ser 1 para todos obs resultam em um simples cálculo de MA, atribuir pesos diferentes ajudará a resolver MA mais complexa computação, tais como dar outras observações menos peso para um MA decaído. Se for necessário um parâmetro K diferente nos cálculos de MA (K), somente o conjunto de dados de operação precisa ser atualizado, o que é um trabalho trivial. Agora, o modelo de código real para o cálculo MA (K) será: Com este novo método, é interessante compará-lo com o auto caro CROSS JOIN, bem como a PROC EXPAND. Na minha estação de trabalho (Intel i5 3.8Ghz, 32GB de memória, 1TB 72K HDD), auto CROSS JOIN é proibitivamente longo em tempo de execução (se os dados são grandes), enquanto o novo método usa apenas 2X tanto tempo como PROC EXPAND, ambos os consumos de tempo são Trivial comparando a auto CROSS JOIN. O consumo de tempo mostrado abaixo está em quotsecondquot. Abaixo está o código leitores podem executar e comparar-se. Postado em 10 de maio de 2017 pela Liang Xie Programação SAS para Data MiningI incluí uma captura de tela para ajudar a esclarecer meu problema: Estou tentando calcular algum tipo de média móvel e desvio padrão em movimento. A coisa é que eu quero calcular os coeficientes de variação (stdevavg) para o valor real. Normalmente isso é feito pelo cálculo da stdev e avg nos últimos 5 anos. No entanto, por vezes, haverá observações na minha base de dados para o qual eu não tenho a informação dos últimos 5 anos (talvez apenas 3, 2, etc). É por isso que eu quero um código que irá calcular o avg e stdev mesmo se não houver nenhuma informação para os 5 anos inteiros. Além disso, como você vê nas observações, às vezes eu tenho informações sobre mais de 5 anos, quando este é o caso eu preciso de algum tipo de média móvel que me permite calcular o avg e stdev para os últimos 5 anos. Então, se uma empresa tem informações por 7 anos eu preciso de algum tipo de código que irá calcular o avg e stdev para, digamos, 1997 (por 1991-1996), 1998 (por 1992-1997) e 1999 (1993-1998). Como eu não estou muito familiarizado com comandos sas deve olhar (muito, muito grosseiramente) como: Ou algo assim, eu realmente não tenho idéia, eu vou tentar e descobrir, mas vale a pena publicá-lo se eu não vou encontrá-lo myself. moving média Com a média de movimento de intervalo de datas com a média de movimento de intervalo de datas com o intervalo de datas Im novo para o SAS, e estou tendo alguns problemas com o cálculo da média móvel com base em datas e agrupamentos dentro do conjunto de dados. Basicamente, estou tentando calcular a média móvel para cada observação com base nos últimos 90 dias. Cada observação tem uma data. Eu também preciso agrupá-los para que a média móvel é apenas com base no grupo. Em outras palavras, se eu fosse agrupá-lo por frutas, maçãs teria sua única média móvel e orages, etc Eu sei que vou precisar classificar o conjunto de dados primeiro, em seguida, use uma declaração de retenção. Eu estava realmente pensando em fazer uma macro também. Eu comecei isso, mas não consigo obter qualquer parte dela para o trabalho. Alguém pode me ajudar, eu sei como fazer a classificação, mas eu também sei como obter a média, mas não está agrupando corretamente. É só me dar o valor da observação. Eu tentei fazê-lo com SQL, mas não está funcionando. Este é o que eu vim acima com. Proc sql create table data. movingavg como selecionar a., Mean (basis) como mover de xx onde o grupo datado por produto RE: a média móvel com intervalo de datas isso não funciona. Data new set old por id reter base if date90 then avg mean (basis) run RE: média móvel com intervalo de datas Aqui está um exemplo do meu conjunto de dados. Produto data base maçã may20 4 laranja march2 3 maçã abril 3 banana jan31 33 maçã feb13 88 maçã dec2 12 o que eu preciso é uma corrida média móvel dos últimos 90 dias por produto com base no montante base. Desculpe a postagem múltipla, mas depois de reler meu post anterior, parecia confuso quanto ao que estou tentando fazer. Obrigado RE: média móvel com intervalo de datas klaz2002 (Programador) 25 Set 07 16:00 Devo começar por dizer obrigado por esta pergunta. Porque não me deu descanso até que eu pudesse resolvê-lo. Deixe-me afirmar o que eu acredito que é a sua exigência apenas para que você e eu estamos na mesma página. Req 1) Você quer ter uma média móvel dos últimos 90 dias de dados pelo nome do produto. Significado, que para um único produto (ex. Maçã) você só está interessado nos valores de base do produto que volta 90 dias. 2) Eu supus que você tem um (1) registro por produto por dia. Isso significa que você nunca tem mais de um valor de base por produto por dia. (O código não lida mais agora) Para resolver o problema de histórico (valores de volta 90 dias) Eu usei o lagx () e colocar dias 1-90 em variáveis ​​e, em seguida, adicionou-os a um ARRAY. Uma vez que a variável tem de ser incluído na matriz eu criei uma pequena macro que gerou as linhas de código que eu precisava. MACRO QUE CRIA 270 VARIÁVEIS PARA 90 DIAS DE HISTÓRIA macro SetVars do i1 a 90 prodampi lagampi dateampi lagampi (data) baseampi lagampi (base) end endividamento PRIMEIRO ORDENAR POR PRODUTO E DATA proc classificar dados yourdata out datasorted por data do produto data de execução Final conjunto datasorted por produto data comprimento prod1-prod90 7 date1-date90 base1-base90 mysum 8 array atual mysum array prod prod1-prod90 matriz dt data1-date90 matriz bs base1-base90 SetVars SET A DATA 90 DIAS AGO PARA VERIFICAR DateMinus90 data-90 Bctr 1 mysum 0 LOOP ATRAVÉS DE TODOS OS POSSÍVEIS DIAS do i1 a 90 ESCRITA EXCEÇÃO PARA O PRIMEIRO CASO NO GRUPO DE PRODUTOS, NÃO HÁ NENHUM LAG ainda se primeiro. produto, em seguida, base de movingavg VERIFICAR O NOME DE PRODUTO MESMO E DENTRO DE 90 DAYS else if trim (upcase )) E dt dateminus90 então fazer SE ENCONTRAR, ADICIONAR A SUMAR VAR mysum sum (mysum, base, bs) MANTENHA UMA CONTA DE QUANTOS DATAPOINTS ENCONTRADOS bctr 1 end end SE NENHUM ENCONTRADO ENTÃO O VALOR DA BASE ACTUAL DEVE SER USADO Se mysum 0 então myavg base mais myavg mysumbctr executar proc print dataFINAL var data do produto dateminus90 base myavg formato data dateminus90 mmddyy10. Eu espero que isso ajude você. Você realmente deve olhar isso como eu fiz isso realmente sem extensa verificação. O código de exemplo na guia Código Completo ilustra como calcular a média móvel de uma variável através de um conjunto de dados inteiro, sobre as últimas N observações em um conjunto de dados ou sobre o último N Observações dentro de um grupo BY. Esses arquivos de amostra e exemplos de código são fornecidos pelo SAS Institute Inc. como é sem garantia de qualquer tipo, expressa ou implícita, incluindo mas não limitado às garantias implícitas de comercialização e adequação a um propósito específico. Os beneficiários reconhecem e concordam que o SAS Institute não se responsabiliza por quaisquer danos decorrentes da utilização deste material. Além disso, o SAS Institute não fornecerá suporte para os materiais aqui contidos. Esses arquivos de amostra e exemplos de código são fornecidos pelo SAS Institute Inc. como é sem garantia de qualquer tipo, expressa ou implícita, incluindo mas não limitado às garantias implícitas de comercialização e adequação a um propósito específico. Os beneficiários reconhecem e concordam que o SAS Institute não se responsabiliza por quaisquer danos decorrentes da utilização deste material. Além disso, o SAS Institute não fornecerá suporte para os materiais aqui contidos. Calcule a média móvel de uma variável através de um conjunto de dados inteiro, nas últimas N observações em um conjunto de dados ou nas últimas N observações dentro de um grupo BY.

No comments:

Post a Comment