Sunday 3 December 2017

Vb net média móvel


Eu recentemente precisei trabalhar com médias móveis em um conjunto de dados de grande ish (cerca de 10 000 linhas x 10 colunas), e por razões que eu descreverei na próxima publicação, decidiu que uma Função Definida pelo Usuário (UDF) seria útil. Escrever a UDF foi bastante simples, mas devido ao grande número de transferências de dados entre a planilha e a VBA, foi dolorosamente lento. Felizmente, é fácil escrever uma UDF como uma função de matriz, que permite que todos os dados sejam transferidos em um passo, o processamento a ser realizado dentro do VBA e, em seguida, os resultados a serem gravados de volta para a planilha em um único passo. Isso melhora dramaticamente o desempenho para quase instantâneo no caso do meu conjunto de dados de 100.000 células. O procedimento no esquema é: Declare a entrada datarange (s) e a própria função como variáveis ​​Converte o intervalo de entrada de um objeto variantrange para uma matriz de variantes com a instrução: DataRange DataRange. value2 Dimensiona uma matriz do tamanho necessário para os resultados : Dim ResA (1 para numrows, 1 para numcols) como duplo Execute os cálculos necessários e atribua os resultados ao ResA. Atribua a matriz de resultados ao valor de retorno da função: FunctionName ResA That8217s all Se você inserir a função na planilha da maneira usual, ela apenas exibirá o conteúdo da posição da matriz (1,1). Para exibir a matriz completa: Digite a função em uma célula da maneira usual. Selecione um intervalo grande o suficiente para manter toda a matriz, com a função inserida no canto superior esquerdo. Pressione a tecla Editar (F2) Pressione Ctrl-Shift-Enter Os valores da matriz serão transferidos para o intervalo selecionado O código para uma função de matriz móvel média é mostrado abaixo. Isso tem as seguintes vantagens em relação ao uso da função interna (), ou do assistente de média 8220moving8221 no suplemento de análise de dados: o número de valores a serem calculados em média é especificado como uma variável, em vez de exigir que a fórmula seja re - entrou. Ele irá lidar com qualquer número de colunas, até o limite da planilha. Ele pode ser facilmente refinado para fornecer funcionalidades adicionais, por exemplo, médias móveis ponderadas, como será descrito na próxima publicação. Observe que esta é uma função simplificada, sem verificação de erros, E células em branco tratadas como zero. Função MovAv1 (AvData As Variant, Steps As Long) As Variant Dim MovAvA () Como Variant, NumRows As Long, NumCols As Long Dim i As Long, j As Long, MovSum A Double AvData AvData. Value2 NumRows UBound (AvData) NumCols UBound (AvData, 2) ReDim MovAvA (1 Para NumRows, 1 Para NumCols) Para j 1 Para NumCols MovSum 0 Para i 1 para Steps MovSum MovSum AvData (i, j) MovAvA (i, j) CVErr (xlErrNA) Próximo i MovAvA ( I - 1, j) MovSum Passos para i Passos 1 Para NumRows MovSum MovSum (AvData (i, j) - AvData (i - Steps, j)) MovAvA (i, j) (MovSum) Passos Next i Next j MovAv1 MovAvA End Função Função média móvel Muito legal, obrigado por publicar este Doug. Estarei fazendo análises de séries de tempo nas próximas duas semanas, o que será muito útil para o 8211. Isso economizará muito tempo, podendo usar uma função de matriz para cobrir todas as médias que eu preciso criar. Normalmente I8217d fazer isso tudo no SAS, mas it8217s muito mais fácil de criar os pontos de dados no SAS e fazer a análise no Excel. Chees Geoff 8211 prazer que você achou útil, e eu aprecio receber o feedback. I8217Tere adicionando uma opção para médias ponderadas nos próximos dias, bem como ignorando células de texto e em branco, e também, opcionalmente, ignorando zeros. BTW, I8217ve apenas comecei a olhar para o Python no meu tempo livre (se algum venha), então eu estarei olhando o Python em seu site quando entrar nisso. Olá: Eu sou de Guadalajara, México e quero agradecer por todos os seus comentários e arquivos interessantes neste blog, especialmente nesta função vba. Saudações do México. Isso realmente é útil. Btw estou tentando calcular o MA centrado, o que significa que o atraso da metade do número de etapas, existe alguém que possa me ajudar. Ligue: calcula uma média móvel simples usando VB 2010, calcula uma média móvel simples usando VB 2010, meu código produz Uma variável com uma coluna de números como este: o que eu quero fazer é usar VB para me dar a média para cada x número de linhas e, em seguida, armazenar isso em outra var e, em seguida, ter VB imprimir MAX e MIN dessas médias . Por exemplo, se eu quiser calcular a média por cada 10 linhas: 5248 5249 5258 5251 5247 5246 5251 5228 5235 5251 5246,4 5241 5245,7 5240 5244,8 5247 5243,7 5259 5244,5 5261 5245,9 para que você veja que, começando com o 10º registro, calcula-se a média Para os registros 1-10, depois 2-11, depois 3-12, depois 4-13, depois 5-14, depois 6-15 O valor médio de MAX é 5246.4 e o MIN é 5243.7 se eu quisesse obter a média para cada 5 Registros em vez disso (por exemplo), então a primeira média calcularia o valor médio de 1-5, então 2-6, então 3-7 e assim por diante qual é a melhor maneira de codificar isso para obter a média móvel e também encontrar o MAX E MIN dessa média Re: calcule uma média móvel simples de rolamento usando VB 2010 Ele quis dizer exatamente o que ele disse: Ele possui uma única variável de string com todos esses valores separados por caracteres NewLine. Seria possível levar essa variável e dividir a nova linha para dividi-la em uma série de números em uma série de cadeias de caracteres, que poderiam ser convertidas em uma série de números inteiros, mas ainda acho que seria melhor não ter isso Variável para começar. Minha assinatura chata habitual: Nothing Re: calcula uma média móvel simples usando VB 2010 concordando com shaggy, id usa uma lista (de inteiro) em vez de uma variável com múltiplas linhas contendo 1 inteiro por linha. A lista seria mais versátil que funcionaria com o código que publiquei. Re: calcule uma média móvel simples de rolamento usando o VB 2010, eu tenho um loop para construir a seqüência de caracteres com os números que entram à medida que os dados são chamados agora, o código parece assim: o problema com o código é 1) eu não posso conseguir que m60c exista Fora do loop (só mostra o último valor e 2) eu não sei como armazenar esses dados como ele vem como uma série de inteiros se eu inserir valores de entrada manualmente onde o código funciona de outra forma, ele não precisa de mais informações, obrigado pela respostaMoving Cálculo médio Cálculo médio móvel Cálculo médio móvel Estou tentando calcular uma média móvel para uma série de dados. Eu quero gerar a média móvel para cada ponto dentro dos dados, para mostrar em um gráfico. De qualquer forma, abaixo é um exemplo do MS Support. Eu segui para a carta, mas o meu não dá uma média móvel. Ele repete o mesmo ponto de dados repetidamente (o primeiro ponto de dados). Então, eu não acredito que a função é encontrar o início na linha MyRST. Seek, portanto, apenas retornando o primeiro ponto de dados. Finalmente (talvez fará isso realmente fácil) Estou confuso sobre como os índices funcionam. Eu pensei que você só poderia ter uma chave primária, mas, aparentemente, você pode criar várias restrições de campo. Tentei fazer isso com a seguinte consulta de definição de dados: ALTER TABLE Tabela1 ADD CONSTRAINT NoDupes UNIQUE (CurrencyType, TransactionDate) Desculpe o tamanho dessa publicação. Eu aprecio sua ajuda. A seguinte função de exemplo calcula as médias móveis com base em uma tabela com uma chave primária de campo múltiplo. Os valores semanais das moedas estrangeiras são utilizados para este exemplo. Para criar a função de exemplo, siga estas etapas: Crie a seguinte tabela e salve-a como Tabela1: Tabela: Tabela1 --------------------------- -------------- Nome do campo: Tipo de moeda Tipo de dados da chave primária: Tamanho do campo de texto: 25 Nome do campo: Tipo de dados principal do TransactionDate: Formato do DateTime: Data curta Nome do campo: Taxa Tipo de dados: moeda Locais decimais: 4 Veja a tabela na exibição da folha de dados e insira os seguintes valores: Taxa do tipo CurrencyType TransactionDate ------------------------------- ------------- Ien 8693 0.0079 Ien 81393 0.0082 Ien 82093 0.0085 Ien 82793 0.0088 Ien 9393 0.0091 Mark 8693 0.5600 Mark 81393 0.5700 Mark 82093 0.5800 Mark 82793 0.5900 Mark 9393 0.6000 Abra um novo módulo e digite o Seguintes funções: Função MAvgs (Períodos como Inteiro, StartDate, TypeName) Dim MyDB como DATABASE, MyRST Como conjunto de registros, MySum como Double Dim i, x Set MyDB CurrentDb () Definir MyRST MyDB. OpenRecordset (Tabela1) Em Error Resume Next MyRST. Index PrimaryKey x Periods - 1 loja ReDim (x) MySum 0 para i 0 Para x MyRST. MoveFirst MyRST. Seek, TypeName, StartDate Estas duas variáveis ​​devem estar na mesma ordem que os campos da chave primária em sua tabela. Store (i) MyRSTRate Se eu lt x Então StartDate StartDate - 7 O 7 aqui assume dados semanais 1 para dados diários. Se StartDate lt 8693 Então MAvgs Null: Exit Function 8693 é substituído pela data mais antiga dos dados em sua tabela. MySum Store (i) MySum Next I MAvgs Periodos MySum MyRST. Fechar End Function Crie a seguinte consulta com base na tabela Table1: Query: Query1 --------------------- ---------------------------------- Campo: FieldType Campo: TransactionDate Campo: Campo de Taxa: Expr1: MAvgs (3 , TransactionDate, CurrencyType) NOTA: Esta consulta gerará uma média móvel de três semanas dos dados da Taxa. Para calcular uma média móvel mais longa ou mais curta, altere o número 3 na coluna Expr1 de consultas para o valor que deseja calcular. Execute a consulta. Observe que você vê a seguinte média móvel de três semanas para cada moeda. Um valor nulo indica que não havia valores anteriores suficientes para calcular a média da semana. CurrencyType TransactionDate Rate Expr1 Mark 080693 0,5600 Mark 081393 0,5700 Mark 082093 0,5800 0,57 Mark 082793 0,5900 0,58 Mark 090393 0,6000 0,59 Iene 080693 0,0079 Ien 081393 0,0082 Ien 082093 0,0085 0,0082 Ien 082793 0,0088 0,0085 Ien 090393 0,0091 0,0088 RE: Cálculo médio móvel dhookom (Programador) 28 10 de junho 21:15 Quantos anos tem esse código. Não usa explicitamente DAO e não menciona que isso não funcionará com tabelas vinculadas. Dim MyDB como DAO. Database, MyRST como DAO. Recordset. Eu usaria uma subconsulta em vez de um conjunto de registros. Pode parecer algo como: SELECT CurrencyType, TransactionDate, Rate, (SELECT Avg (Rate) FROM Table1 B WHERE A. CurrencyType B. CurrencyType AND A. TransactionDate ENTRE B. TransactionDate - 14 AND B. TransitionDate) FROM Table1 A RE: Moving Cálculo médio que é realmente perfeito. Eu realmente aprecio sua ajuda. No entanto, o código que você deu é calcular a média móvel direta de 14 dias (colocando a média móvel no registro para o dia 1 da média, onde eu queria que ela fosse uma média retroativa, colocada no registro 14). Eu mudei um pouco para o seguinte e parece estar funcionando SELECT A. CurrencyType, A. TransactionDate, A. Rate, (SELECT Avg (Rate) FROM Table1 B WHERE A. CurrencyType B. CurrencyType AND B. TransactionDate ENTRE A. TransactionDate - 14 E A. TransactionDate) AS Expr1 FROM Table1 AS A Você pode ver, tudo o que fiz foi troca A para B na cláusula where. Esta é uma grande ajuda para mim e eu realmente aprecio isso. Eu não vi codificação assim antes, e, honestamente, eu realmente não entendo isso. Não sei como o SQL entende o que B e A são. Eu suponho que eles estão criando algum tipo de referência alternativa ao Table1. Se você pode dar qualquer orientação, eu realmente apreciaria isso. Além disso, talvez alguma referência ao material que eu possa observar Estou sempre muito animado para aprender algo novo sobre o VBASQL, e eu realmente aprecio sua ajuda RE: Cálculo médio móvel PHV (MIS) 29 Jun 10 12:22 entende o que B e A São eles são alias es RE: Cálculo médio móvel Obrigado, PHV. Já faz melhor sentido RE: Cálculo médio em movimento joshery420 (TechnicalUser) 6 Jul 10 15:06 Uau, nunca olhei para o SQL view antes. Supremamente útil. Estou tentando obter esse código para funcionar no meu próprio conjunto de dados e estou preso em uma questão específica. Pd2004, não tenho certeza se o novo código de subconsulta funcionou o mesmo que o seu código VBA antigo ou não, mas com meus dados ainda mostra a média contínua, mesmo que não haja dias suficientes para criar esse tamanho de média. por exemplo. Se eu estiver executando uma média contínua de 7 dias, o dia 1 mostra os mesmos dados na coluna 7DayAvg como faz na coluna diária de dados. O dia 2 mostra a média dos dias 1 e 2, etc. Vocês também sabem como consertar isso por acaso Também, obrigado pela excelente dica de código PHV. RE: Cálculo médio em movimento joshery420 (TechnicalUser) 6 Jul 10 15:08 Woops, obrigado a agradecer a dhookom pela dica de código, não PHV. Mas oi, obrigado a ambos. XD RE: Cálculo médio móvel Eu deixarei as melhores soluções para os profissionais aqui, mas você pode ver na minha publicação original como o exemplo da Ajuda da Microsoft tenta lidar com isso. Aqui está o código: Se StartDate lt 8693 Então MAvgs Null: Exit Function 8693 é substituído pela data mais antiga dos dados em sua tabela. Eles estão apenas saindo da função se a data não corresponder aos critérios. Não sei se você poderia incorporar algo assim no código de alias fornecido pelo dhookem. Eu não gosto da sua maneira de lidar com isso, e eu suspeito que o dhookem fornecerá uma solução muito mais elegante. Para os meus propósitos, o problema que está descrevendo não é uma preocupação, mas estarei interessado em ver quaisquer soluções. RE: cálculo da média móvel dhookom (Programador) 6 Jul 10 17:05 Você pode tentar usar IIf () para testar a contagem do número de registros. Cuidado: o código do bloco de notas não testado segue: SELECT A. CurrencyType, A. TransactionDate, A. Rate, IIF ((SELECT Count (Taxa) FROM Table1 C WHERE A. CurrencyType C. CurrencyType AND C. TransactionDate ENTRE A. TransactionDate - 14 AND A. TransactionDate) 7, (SELECT Média (Taxa) FROM Tabela1 B WHERE A. CurrencyType B. CurrencyType AND B. TransactionDate ENTRE A. TransactionDate - 14 AND A. TransactionDate), Nulo) AS Expr1 FROM Table1 AS A RE: Calculadora média móvel

No comments:

Post a Comment