Uśrednianie danych i kodowanie do formatu JSON

0

Witam!

Proszę o pomoc w rozwiązaniu następującego problemu. Do bazy MySQL zapisuję co 1 minutę wynik pomiaru wilgotności powietrza. Za pomocą skryptu php pobieram dowolną ilość danych np. 17 i koduję je do formatu JSON. Skrypt, który napisałem działa bardzo dobrze.
[(http://meteososnowiec.pl/data_wilgotnosc_testy.php)]

<?php
	
	$wynik_data = mysql_query("SELECT czas_datetime FROM tab_czujniki_2 ORDER BY czas_datetime DESC LIMIT 1");
	
		if(mysql_num_rows($wynik_data) > 0) {
			$r = mysql_fetch_assoc($wynik_data);
			$datan = $r['czas_datetime'];
			$daten = new DateTime($data);
			$daten->modify('-15 min');
			$minus_data = $daten->format("Y-m-d H:i:00");
		}

	$sth = mysql_query("SELECT czas_unix, wilgotnosc FROM tab_czujniki_2 WHERE czas_datetime >= '$minus_data' ORDER BY czas_datetime ASC") or die('Błąd zapytania');
	
	$rows = array();
	$rows['name'] = 'Wilgotnosc';
	while($r = mysql_fetch_array($sth)){
		
			$rows['data'][] = array(1000*($r['czas_unix']),$r['wilgotnosc']);
	}	

	$result = array();
	array_push($result,$rows);
	print json_encode($result, JSON_NUMERIC_CHECK)
	
?>

Chciałbym jednak zmienić jego działanie, ale nie bardzo wiem jak podejść do tematu.
Założenia algorytmu:

  1. Pobieram z bazy MySQL dowolną ilość rekordów np. 17: (czas1, wil1), (czas2, wil2), (czas3, wil3), (czas4, wil4), (czas5, wil5), ..., (czas17, wil17).
  2. Z każdych pięciu, kolejnych rekordów obliczam średnią wilgotność: (wil1+wil2+wil3+wil4+wil5)/5 itd. Z 17 rekordów powstaną więc 3 średnie.
  3. Średnie mają być wyliczane tak długo jak będzie 5 lub więcej rekordów. Z 17 rekordów pozostaną więc 2 rekordy niepoddane uśrednianiu.
  4. Każdej średniej ma zostać przypisany czas rekordu środkowego w każdej piątce np. średniej z pierwszej piątki przypisany zostanie czas3.
  5. Teraz wyliczone średnie z przypisanym czasem koduję do formatu JSON jak w przedstawionym wyżej skrypcie.

Dziękuję i pozdrawiam

0

Załatwił bym to SQLem.

W MySQL na szybko znalazłem rozwiązanie z podzapytaniem, które w 'selekcie' zawiera kolumnę do agregacji wyliczoną dynamicznie: http://stackoverflow.com/questions/6651688/get-the-average-of-groups-of-n-rows-with-mysql , czyli u Ciebie:

FLOOR(@i/5) AS `datagrp`,

Czas środkowego rekordu możesz sobie wyciągać analogicznie - w podzapytaniu dodaj kolumnę bazującą na liczbie porządkowej w grupie.

0
czesiek napisał(a):

Załatwił bym to SQLem.

W MySQL na szybko znalazłem rozwiązanie z podzapytaniem, które w 'selekcie' zawiera kolumnę do agregacji wyliczoną dynamicznie: http://stackoverflow.com/questions/6651688/get-the-average-of-groups-of-n-rows-with-mysql , czyli u Ciebie:

FLOOR(@i/5) AS `datagrp`,

Czas środkowego rekordu możesz sobie wyciągać analogicznie - w podzapytaniu dodaj kolumnę bazującą na liczbie porządkowej w grupie.

Bardzo dziękuję. Link idealnie pasuje do mojego problemu. Chcę właśnie uzyskać gładki wykres z mniejszej ilości punktów. Napisz proszę, czy zapytanie podane w linku mam umieścić w skrypcie php w miejsce mojego zapytania?

0

Witam!
Poradziłem sobie z problemem uśredniania wartości za pomocą PHP. Mam jednak problem z zakodowaniem wynilu do formatu JSON. Bardzo proszę o pomoc.

Oczekiwany format:
[(http://meteososnowiec.pl/data_wilgotnosc_testy.php)]

Format aktualny:
[http://meteososnowiec.pl/data_wilgotnosc_testy_7.php]

Kod skryptu:

	$wynik_data = mysql_query("SELECT czas_datetime FROM tab_czujniki_2 ORDER BY czas_datetime DESC LIMIT 1");
	
		if(mysql_num_rows($wynik_data) > 0) {
			$r = mysql_fetch_assoc($wynik_data);
			$datan = $r['czas_datetime'];
			$daten = new DateTime($data);
			$daten->modify('-10min');
			$minus_data = $daten->format("Y-m-d H:i:00");
		}

	$sth = mysql_query("SELECT czas_unix, wilgotnosc FROM tab_czujniki_2 WHERE czas_datetime >= '$minus_data' ORDER BY czas_datetime ASC") or die('Błąd zapytania');
	
	while($r = mysql_fetch_array($sth)){
		
			$rows[] = array(1000*($r['czas_unix']),$r['wilgotnosc']);
	}	
	
	$sets = array_chunk($rows, 5);
	//var_dump($sets);
	
	foreach($sets as $key => $set) {
		
		if(count($set) !== 5) {
		continue;
	}
	
	$wynik['name'] = 'Wilgotnosc';
	$wynik[$key][] = $sets[$key][2][0];
	$wynik[$key][] = (float) array_sum(array_column($sets[$key], 1))/5;
		
	}
	
	print json_encode($wynik, JSON_NUMERIC_CHECK);

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1