Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Olá pessoal...
Estou com um problema que tem tirado o sono. É o seguinte:
Trabalho numa empresa em que alguns colaboradores coletam as coordenadas dos pontos visitados uma vês por mês, ou pelo menos deveria ser assim. Só que percebemos que algumas coordenadas estão muito divergentes, tipo, quando ploto todas as coordenadas coletadas até o momento no mapa vejo que uma, ou mais, ficam distantes da maioria; isso é um indício que o colaborador não coletou a coordenada onde deveria. Agora preciso criar um banco de dados com apenas uma coordenada por cliente, só que nem todas condizem com a realidade. Estou tentando desenvolver um algorítimo para fazer com que o QlikView escolha a coordenada que, provavelmente, é a mais correta para cada cliente. E isso está me tirando o sono.
Não posso fazer isso manualmente porque temos mais de cem mil clientes, o que torna o trabalho de escolha manual praticamente impossível.
Desde já muito obrigado pela atenção.
Finalmente encontrei uma solução! É tão do simples que me dá até vergonha!
Conversando com um amigo ele citou a "palavra mágica" que solucionou todos os meus problemas...
Em estatística existe uma função que escolhe o valor localizado no meio de uma lista. Essa função se chama "MEDIANA"; e era exatamente o que estava precisando, mas não sabia de sua existência.
A Solução num script ficou da seguinte forma:
UC_Coord_Mediana:
Load UC,
Median(Latitude) As Latitude, /* A função estatística correspondente no QlikView: "Median" */
Median(Longitude) As Longitude
Resident UC_Coord_Sinal
Group By UC;
Store UC_Coord_Mediana Into UC_Coordenadas_Validas.qvd (qvd);
Drop table UC_Coord_Mediana;
Se a lista contiver uma quantidade par de números o função "Median" retornará a média aritmética dos dois números centrais da lista.
Obrigado pelo interesse Aderlan!
Olá Wellington, tudo bem?
Já resolveu isso? Não vi esse post antes, achei ele por acaso agora.
Se ainda não resolveu, poderia anexar um QVW de exemplo para avaliarmos?
Qual seria o critério de proximidade, ou seja, qual regra determina o ponto mais próximo do real?
A data de cadastro?
A médias das distâncias?
A coordenada mais próxima da coordenada do endereço do cliente?
Todas as alternativas... Rsrsrrsrs...
Abraço.
Boa tarde Aderlan,
Tudo bem?
Eu resolvi em parte, pois usei uma tremenda "gambiarra" para escolher
apenas uma coordenada por UC (Unidade Consumidora). Não tenho como lhe
enviar um QVW porque ele tem mais de 100MB mas vou te enviar alguns prints,
enquanto tento explicar melhor:
Primeira Situação:
Observe que os pontos estão muito próximos. Em casos como esse não há
problema algum. Podemos escolher qualquer um que a coordenada pode ser
considerada válida.
Segunda situação:
Terceira:
Quarta:
Observe que nas três ultimas imagens temos uma coordenada que está
distante das outras, temos casos de ter até mais de uma distante do ponto
que pode ser considerado como "real".
Fazer essa escolha visualizando num mapa é fácil. Mas temos mais de um
milhão de Unidades Consumidoras, com coordenadas sendo coletadas quase
todos os meses. Minha dificuldade está em criar um algoritmo que possa
fazer essa escolha de modo automático e confiável.
A "gambiarra" que fiz foi aplicar a função de MODA para escolher uma
coordenada que se repete mais. As que não puderam ser escolhidas dessa
forma e fiz uma contagem de quantas coordenadas tinha, para cada UC, dividi
por 2 e usei uma função "Max" usando o resultado da divisão por 2 para
escolha da ordem. Mas tudo isso com etapas de tratamento manual, demandando
um tempo que poderia ser aproveitado em outras coisas.
Vou te mostrar o texto do script (incluindo as tentativas que fiz e ainda
não apaguei):
SET ThousandSep='.';
SET DecimalSep=',';
SET MoneyThousandSep='.';
SET MoneyDecimalSep=',';
SET MoneyFormat='R$ #.##0,00;-R$ #.##0,00';
SET TimeFormat='hh:mm:ss';
SET DateFormat='DD/MM/YYYY';
SET TimestampFormat='DD/MM/YYYY hh:mm:ss[.fff]';
SET MonthNames='jan;fev;mar;abr;mai;jun;jul;ago;set;out;nov;dez';
SET DayNames='seg;ter;qua;qui;sex;sáb;dom';
Directory;
LOAD UC,
MES_ANO_FATMTO,
Latitude,
Longitude
FROM
UC_Coordenadas_Geral.qvd
(qvd);
/*
UC_Coordenadas_Validas:
Load UC,
Max(Latitude,$(=Ceil(Count(Latitude)/2,1))) As Latitude_Valida,
Min(Longitude,$(=Ceil(Count(Longitude)/2,1))) As Longitude_Valida
Resident UC_Coordenadas_Geral;
*/
UC_Qtd:
Load Distinct UC,
Div(Count(Latitude),2)+1 As Lat_Qtd,
Div(Count(Longitude),2)+1 As Lon_Qtd
Resident UC_Coordenadas_Geral
Group By UC;
/*
Qtd_Coord:
Load Max(Lat_Qtd) As Max_Lat
// Max(Lon_Qtd) As Max_Lon
Resident UC_Qtd;
*/
/*Let Ord = 6;
Do While Ord>0
Load UC,
Max(Latitude,$(Ord)) As Lat_Val,
Max(Longitude,$(Ord)) As Lon_Val
Resident UC_Coordenadas_Geral
Where Not Exists(UC)
Group By UC;
Let Ord=Ord-1;
Loop;
*/
/*
Coordenadas_Validas:
Load UC,
Max(Latitude,6) As Lat_Val,
Max(Longitude,6) As Lon_Val
Resident UC_Coordenadas_Geral
Where Not Exists(UC)
Group By UC;
*/
A fórmula usada para escolha da coordenada, usada na tabela
"Coordenadas_Validas":
"If(Mode(Latitude)<0,Mode(Latitude),Max (Latitude,$(Ord)))"
E por último a tela do aplicativo:
Por enquanto eu parei de esquentar a cabeça com isso mas logo logo
tenho que voltar a esse problema porque preciso dessas informações
atualizadas.
Espero que você possa me ajudar.
Desde já muito obrigado pela atenção.
Felicidades...
Wellington Regis
Em 12 de novembro de 2014 16:01, Aderlan Rodrigues <qcwebmaster@qlikview.com
escreveu:
Qlik Community <http://community.qlik.com/> Como fazer o QlikView
escolher a Coordenada mais precisa?
reply from Aderlan Rodrigues
<http://community.qlik.com/people/aderlanrm?et=watches.email.thread> in *Education
Services * - View the full discussion
<http://community.qlik.com/message/655239?et=watches.email.thread#655239>
Finalmente encontrei uma solução! É tão do simples que me dá até vergonha!
Conversando com um amigo ele citou a "palavra mágica" que solucionou todos os meus problemas...
Em estatística existe uma função que escolhe o valor localizado no meio de uma lista. Essa função se chama "MEDIANA"; e era exatamente o que estava precisando, mas não sabia de sua existência.
A Solução num script ficou da seguinte forma:
UC_Coord_Mediana:
Load UC,
Median(Latitude) As Latitude, /* A função estatística correspondente no QlikView: "Median" */
Median(Longitude) As Longitude
Resident UC_Coord_Sinal
Group By UC;
Store UC_Coord_Mediana Into UC_Coordenadas_Validas.qvd (qvd);
Drop table UC_Coord_Mediana;
Se a lista contiver uma quantidade par de números o função "Median" retornará a média aritmética dos dois números centrais da lista.
Obrigado pelo interesse Aderlan!