Como normalizar valores de dados irregulares

1

De uma tabela PHP, recebo os valores representados graficamente. No entanto, alguns dos dados recebidos estão "danificados" ou incorretos, gerando assim uma representação gráfica não sensível.

As horas (eixo y) são acumuladas horas, assim como o odômetro de um carro, exceto por horas e o eixo x é as datas correspondentes. Logicamente, as horas de amanhã serão maiores ou iguais a horas de hoje, isso deve ser uma linha reta ou crescente. Mas, infelizmente, esta é a saída:

Eugostariadenormalizaressesdadosparaqueeletenhaumarepresentaçãoumpoucomais"correta" com algo parecido com:

Eutenholidoalgumasinformaçõessobreanormalizaçãodedados( Processo de normalização do banco de dados , Normalizando um conjunto de dados com intervalos irregulares em Python , Normalização e Padronização de Dados ), mas eu não consigo começar em como realmente normalizar o dados . Estou realmente tendo um momento loiro, ou simplesmente não entendo.

P: Como posso normalizar esse conjunto de dados com o Bash - quais seriam as etapas envolvidas? Eu ficaria grato por um pseudo código ou uma descrição das etapas envolvidas.

    
por 3kstc 05.08.2015 / 03:38

1 resposta

0

A sua ilustração parece não corresponder às suas palavras. Se você quer dizer o que você diz (e se eu estou entendendo suas palavras corretamente), e supondo que você tenha uma lista de valores "Y" (isto é, o número de horas, variando entre 0 e 2400) que você deseja normalizar, você pode fazer o que quiser com esse código awk :

awk '
    NR==1 { prev_good = $1 }
    {
        data = $1
        if (data < prev_good) {
                count++
                next
        }
        if (count > 0) {
                count++
                for (i = 1; i < count; i++) {
                        print prev_good + (data-prev_good) * i / count
                }
                count = 0
        }
        print data
        prev_good = data
}'

Ele assume que o primeiro ponto de dados é válido ( NR==1 { prev_good = $1 } ). Depois disso, se um ponto de dados for menor que o valor bom anterior ( prev_good , qual é o maior valor visto até agora), trate-o como inválido: pule-o ( next ) e conte os pontos que você pulou. Quando tiver um bom valor, teste count - se for positivo, isso significa que pulamos alguns dados, então geramos muitos valores de dados, interpolando linearmente entre o último valor bom e o valor atual. Em seguida, imprima o novo valor válido.

Se a sua entrada contiver "X" e "Y" (data e hora), isso se torna um pouco mais complicado especialmente se os intervalos "X" não forem uniformes.

Você poderia fazer isso como um script de shell puro, mas isso seria bobo. awk , no entanto, parece ser uma boa ferramenta para o trabalho.

    
por 22.10.2015 / 04:51