Wednesday, 6 December 2017

Mudança média linq


Meu objetivo é obter uma média ponderada de uma tabela, com base em outra tabela de chave primária. Eu preciso obter uma média ponderada com base no comprimento de um segmento e preciso ignorar valores de -1. Eu sei como fazer isso no SQL, mas meu objetivo é fazer isso no LINQ. Parece algo assim no SQL: ainda sou muito novo para o LINQ e tenho dificuldade em descobrir como eu traduziria isso. A média ponderada do resultado deve chegar a cerca de 55,3. Obrigado. Perguntei 26 de abril 10 às 15:23 Eu faço isso o suficiente para criar um método de extensão para o LINQ. Depois de obter o seu subconjunto de dados, a chamada parece assim. Isso se tornou extremamente útil porque eu posso obter uma média ponderada de qualquer grupo de dados com base em outro campo dentro do mesmo registro. Verifique agora a divisão por zero e lance uma exceção mais detalhada em vez de retornar 0. Permite que o usuário capture a exceção e manipule conforme necessário. Se você está certo de que, para cada chave estrangeira na Tabela 2, há um registro correspondente na Tabela 1, então você pode evitar a junção apenas fazendo um grupo. Nesse caso, a consulta LINQ é assim: é assim que você pode obter a média de uma chave estrangeira específica. O método ToList chamado ao buscar os registros é evitar a execução da consulta duas vezes ao agregar os registros nas duas operações de Soma separadas. Para conseguir um desempenho assintótico de O (n) (como a solução codificada manualmente), você Pode usar a função Agregação como em O valor acumulado (implementado como tipo anônimo) contém dois campos: O resultado contém a compilação da lista de resultados até agora. O trabalho contém os últimos elementos do período 1. A função de agregação adiciona o valor atual à lista de Trabalho, cria a média atual e adiciona-a ao resultado e, em seguida, remove o primeiro valor (ou seja, o mais antigo) da lista de trabalho. A semente (ou seja, o valor inicial para a acumulação) é compilada colocando os primeiros elementos do período 1 em Trabalhando e inicializando o Resultado em uma lista vazia. Consequentemente, a agregação começa com o período do elemento (saltando (período 1) elementos no início) Na programação funcional, este é um padrão de uso típico para a função agravada (ou dobra), btw. A solução não é funcionalmente limpa na medida em que os mesmos objetos de lista (Trabalho e Resultado) são reutilizados em cada etapa. Não tenho certeza se isso possa causar problemas se alguns compiladores futuros tentarem paralelizar a função Agregação automaticamente (por outro lado, eu também não tenho certeza, se isso for possível depois de tudo). Uma solução puramente funcional deve criar novas listas em cada etapa. Observe também que C não possui expressões de lista poderosas. Em algum pseudocódigo hipotético Python-C-mixed pode-se escrever a função de agregação como a qual seria um pouco mais elegante na minha humilde opinião :) Observe o tempo de execução de O (n2). Uma vez que você precisa pular mais e mais elementos em cada etapa (e afaik Skip (i) tem que chamar IEnumerator. MoveNext i times). Veja a minha resposta para uma solução no tempo O (n). (Eu apenas notei o comentário OPs abaixo que heshe possivelmente obterá os valores de um SQL DB no futuro. Neste caso, eu iria desanimar cada uma dessas soluções) ndash MartinStettner Mar 3 11 às 0:53 Para a maneira mais eficiente possível Para calcular uma média móvel com LINQ, você não deve usar o LINQ Em vez disso, proponho criar uma classe auxiliar que calcula uma média móvel da maneira mais eficiente possível (usando um buffer circular e filtro médio causal), então um método de extensão para torná-lo acessível Para LINQ. Primeiro, a média móvel Esta classe fornece uma implementação muito rápida e leve de um filtro MovingAverage. Ele cria um buffer circular de comprimento N e calcula um som, um subtrair e um multiplicar por ponto de dados anexado, em oposição ao N multiplicação por ponto para a implementação de força bruta. Os métodos de extensão acima envolvem a classe MovingAverage e permitem a inserção em um fluxo IEnumerable. Para fazer isso de forma mais funcional, você precisa de um método de varredura que exista no Rx, mas não no LINQ. Vamos olhar como isso pareceria se você tivesse um método de varredura e heres o método de varredura, tomado e ajustado a partir daqui: Este deve ter melhor desempenho do que o método de força bruta, uma vez que estamos usando um total em execução para calcular o SMA. Para começar precisamos calcular o primeiro período que chamamos de semente aqui. Então, cada valor subseqüente calculamos a partir do valor da semente acumulada. Para fazer isso precisamos do valor antigo (isto é, t-delta) e do mais novo valor para o qual fazemos o conjunto da série, uma vez desde o início e uma vez deslocados pelo delta. No final, fazemos uma limpeza adicionando zeros para o comprimento do primeiro período e adicionando o valor de semente inicial. Respondeu 19 de junho às 22: 58 Tenho uma quantidade de 4000 de estoque e tring para calcular a média móvel para todos os valores de dados, mas como a média móvel é baseada em dados anteriores e não consigo calcular o SMA de 15 dias para o primeiro 14 dias, salte os primeiros 14 dias e calcule o SMA no resto dos dados. E tem que estar usando LINQ para realizar. Alguém pode dar uma amostra ou sugerir como usar o LINQ para calcular a média móvel. A saída para os valores médios é de cerca de 500, eu realmente não entendo como é possível obter esse valor alto. Movendo averager com matriz somas: 06072017 562,49 571,72 06082017 565,84 580,32 06112017 568,56 571,17 06122017 569,55 576,16 06132017 570,56 572,16 06142017 570,63 571,53 06152017 571,21 574,13 06182017 572,78 585,78 06192017 573,79 587,41 06202017 574,23 585,74 06212017 574,22 577,67 06222017 575,63 582,10 06252017 576,06 570,77 06262017 576,68 572,03 06272017 576,88 574.50 06282017 576.7 569.05 06292017 576.95 584.00 07022017 578.37 592.52 07032017 579.92 599.41 07032017 581.74 599.41 Leemx 021434 02:59 Lisa Zhu Pessoal contingente Microsoft 051434 07:38 linq relacionado (De: Visual C Geral) Para criar uma média móvel, eu começaria por criar Um intervalo de 0 a (comprimento da lista de dados - comprimento do período de movimento), então, para cada valor no intervalo, selecione os elementos x a x 43, o comprimento do período de movimento e calcule a média. Tudo em uma boa declaração LINQ: Observe que isso não é extremamente eficiente, já que você basicamente itera sobre a lista de dados para cada valor no intervalo .. Ei, olha Este sistema permite assinaturas de mais de 60 cha Arno Brouwer 091434 04:42 Alexander Dom 231434 02:44 091434 04:41 Uma amostra da sua instrução LINQ ajudaria. Otimização do tempo é a raiz de todo o mal. Knuth 021434 03:35 o que você quer dizer com a instrução LINQ 021434 03:49 A Microsoft forneceu um recurso agradável para aprender LINQ. Se você quer algo que nunca teve, você precisa fazer algo que você nunca fez. Todos (não apenas o iniciador do segmento) devem aproveitar o tempo para marcar postagens úteis, propor respostas e marcar respostas para perguntas. 021434 05:51 Da sua descrição, gostaria de mover esta publicação para o fórum mais relacionado. Há mais especialistas neste aspecto, para que você obtenha um melhor suporte e possa ter mais sorte obtendo respostas. Obrigado pela sua compreensão. 051434 07:37 Procurei um pouco e encontrei algumas discussões sobre o seu problema. Dê uma olhada, talvez ele possa ajudar. Por favor marque como resposta se for ajudado. Também visite meu blog msguy. net Alexander Sun 071434 01:42 Alexander Sun 231434 02:44 051434 12:47 Para criar uma média móvel, eu começaria criando um intervalo de 0 a (comprimento da lista de dados - comprimento do período de movimento) , Então, para cada valor no intervalo, selecione os elementos x a x 43, o comprimento do período de movimento e calcule a média. Tudo em uma boa declaração LINQ: Observe que isso não é extremamente eficiente, já que você basicamente itera sobre a lista de dados para cada valor no intervalo .. Ei, olha Este sistema permite assinaturas de mais de 60 cha Arno Brouwer 091434 04:42 Alexander Sol 231434 02:44 091434 04:41

No comments:

Post a Comment