iwa-panda1

Manage Weather Data by International Weather Agency (Version 1)
Log | Files | Refs

datavalidator.php (2308B)


      1 <?php
      2 /**
      3  * Validates the temperature against the average of the last 30 rows for the given station name.
      4  *
      5  * @param string $station The station name to validate against.
      6  * @param float $temperature The temperature value to validate.
      7  * @param Redis $redis  The Redis connection object.
      8  * @return float Returns the correct temperature.
      9  */
     10 function validate_temperature($station, $temperature, $redis) {
     11     // Return the correct temperature validated with last 30 values.
     12 
     13     //Deze checkt of het de eerste value is en maakt 2 queues aan en knalt de waardes erin.
     14     if(!$redis->exists('values'.$station)) {
     15         $redis->lpush('values'.$station, $temperature);
     16         $redis->lpush('average'.$station, $temperature);
     17         return 0;
     18     }
     19     //Als het aantal values de 30 nog niet bereikt heeft, berekend hij gewoon het gemiddelde en voegt de value toe aan de queue
     20     else {
     21         if($redis->llen('values'.$station) < 3) {
     22             $avg = ($redis->rpop('average'.$station) * $redis->llen('values'.$station) + $temperature) / ($redis->llen('values'.$station) + 1);
     23             $redis->lpush('average'.$station, $avg);
     24             $redis->lpush('values'.$station, $temperature);
     25             return 0;
     26         }
     27         //Bij 30 values zal de volgende value eerst gecheckt worden met het bekende gemiddelde en eventueel aangepast worden.
     28         //Daarna zal deze toegevoegd worden aan de value en average queue. De laatste waarde zal eruit gehaald worden.
     29         else {
     30             $current_avg = $redis->lIndex('average'.$station, 0) ?: 0.000000000000001;
     31             if(abs(($temperature - $current_avg) / $current_avg) > 0.2) {
     32                 $temperature = $current_avg;
     33                 $new_avg = (($redis->rpop('average'.$station) * 3) - $redis->rpop('values'.$station) + $temperature) / 3;
     34                 $redis->lpush('average'.$station, $new_avg);
     35                 $redis->lpush('values'.$station, $temperature);
     36                 return -1;
     37             }
     38             else {
     39                 $new_avg = (($redis->rpop('average'.$station) * 3) - $redis->rpop('values'.$station) + $temperature) / 3;
     40                 $redis->lpush('average'.$station, $new_avg);
     41                 $redis->lpush('values'.$station, $temperature);
     42                 return 1;
     43             }
     44         }
     45     }
     46 }