Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Obliczanie średniej i odchylenia standardowego
damianprz
post
Post #1





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 26.08.2009
Skąd: Zamojsce

Ostrzeżenie: (0%)
-----


(IMG:http://images48.fotosik.pl/188/36eb6354103b063bm.jpg)
SCREEN

Na screenie widać prosty schemat tabeli w bazie danych
Na dole struktura a na górze rekordy
Mamy 8 dni i 4 produkty dla których trzeba policzyć Popyt średni i Odchylenie Standardowe

Kolega proponuje tak obliczać Pśr i OS
Cytat("Norbert")
$pytanko="SELECT popyt_klej FROM popyt";
$rezultat = mysql_query($pytanko)
or die("Błąd zapytania");


$tablica = mysql_fetch_array($rezultat);
$n=count($tablica);
$srednia=0;

for($i=0;$i<=$n;$i++)
{
$srednia=$srednia+$tablica[$i];
}

$srednia=$srednia/$n;

for($i=0;$i<=$n;$i++)
{
$wyraz_srednia=$tablica[$i]-$srednia; // tutaj do zmiennej $wyraz_srednia przypisujesz roznice danej liczby i sredniej wszystkich liczb

$tablica2[$i]= $wyraz_srednia * $wyraz_srednia;
}

for($i=0;$i<=$n;$i++)
{
$wynik=$wynik+$tablica2[$i]; //dostajesz sume tych wszystkich kwadratow roznicy wyrazu i sredniej;
}
$wynik=sqrt($wynik);

echo "<h1>Srednia: ".$srednia."</h1><P>";
echo "<h1>Odchylenie: ".$wynik."</h1><P>";


Kod daje takie wyniki dla popyt_klej i popyt_srubki
Srednia: 10
Odchylenie: 17.320508075689

Kod daje takie wyniki dla popyt_farba i popyt_drewno
Srednia: 5
Odchylenie: 8.6602540378444

Powinna wyjść średnia dla popyt_klej:
160/8 czyli 20

Mam takie pytanie: Czy da radę napisać tak kod aby później była możliwość dodawania kolejnych wierszy Id=9, data, popyty dla poszczególnych towarów itd... oraz możliwość dodawania towarów, czyli chodzi mi o taki kod który by liczył Pśr i OS nawet gdy tabela będzie się rozrastać w 2 wymiarach

Chyba nie ma sensu dla każdego towaru robić osobną tabelę w bazie danych. Takie rozwiązanie jakie prezentuje screen, że w jednej tabeli są wszystkie towary i wszystkie wartości popytu jest chyba najlepszy. Tylko problem z tym ciężkim do wymyślenia kodem.

Jakby ktoś był w stanie coś wymyśleć to proszę o jakieś pomysły lub kontakt
GG 3257134
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Problemy które poruszasz w poście zaznaczyłem po obliczeniach. Stąd właśnie pisałem by wtedy zmodyfikować to do potrzeb. Kompletnie jednak zapomniałem, że przecież MySQL ma własne funkcje statystyczne (IMG:style_emoticons/default/smile.gif) Wtedy liczenie niemal kompletnie Ci odpada. Jeśli masz wszystkie rekordy zapełnione to robisz tylko
  1. SELECT AVG(popyt_drewno), AVG(popyt_srubki), AVG(popyt_klej), AVG(popyt_farba) FROM tabela

  1. SELECT STD(popyt_drewno), STD(popyt_srubki), STD(popyt_klej), STD(popyt_farba) FROM tabela

A w pętli for tylko byś te dane wyświetlał i nic więcej.

Gdy mowa o wyeliminowaniu pustych, lepiej "obrócić zapytania" i wywoływać dla konkretnych kategorii popytu, wyrzucając z zapytania wszystkie będące NULLami
Trzymając się Twojego układu tabel dla kolumny drewno jest to:
  1. SELECT AVG(popyt_drewno) AS srednia, STD(popyt_drewno) AS odchylenie FROM tabela WHERE popyt_drewno IS NOT NULL

W przypadku jednak bardzo dużej elastyczności rozwiązania warto pomyśleć o przebudowie tabeli i pomysł zaproponowany na tamtejszym forum jest jak najbardziej poprawny.
Jeśli przyjmiemy więc, że baza wygląda jak z innego forum to możemy zrobić automatykę (IMG:style_emoticons/default/smile.gif)
  1. SELECT towary_id, avg(popyt) AS srednia, std(popyt) AS odchylenie FROM tabela GROUP BY towary_id

Grupujesz po towarach i dla tych zgrupowanych liczysz średnią oraz odchylenie.

Ja się dostosowywałem do Twojej bazy danych, ale jak widzisz odpowiednie zaprojektowanie tabeli potrafi przynieść lepsze efekty. Jako przyspieszacz ustawiłbym index na towary_id, a samo id można w zasadzie wyrzucić. Nazwy towarów możesz dorzucić jako osobną tabelę (z polami nazwa i id), które łączysz z towary_id by uzyskać nazwę towaru. Datę mimo wszystko bym zostawił wewnątrz dopóki jest mało produktów. Gdy będzie ich wiele dorzuciłbym pole wskazujące na datę z tabeli z datami (IMG:style_emoticons/default/smile.gif)

Czyli w maksymalnie rozwiniętej wersji mamy:
Tabela Data:
id(int), data(date)

Tabela Towar:
id(int), nazwa(varchar)

Tabela Produkty:
id_daty(int), id_towaru(int), popyt(double)

Teraz wyświetlanie wyników to:
  1. SELECT t.nazwa, p.towary_id, avg(p.popyt) AS srednia, std(p.popyt) AS odchylenie FROM Produkty p LEFT JOIN Towar t GROUP BY p.towary_id


Ten post edytował thek 27.08.2009, 13:17:06
Go to the top of the page
+Quote Post

Posty w temacie
- damianprz   Obliczanie średniej i odchylenia standardowego   26.08.2009, 17:47:27
- - *OuTSideR*   przy obliczaniu sredniej zmien znak <= na < ...   26.08.2009, 18:22:25
- - damianprz   I co to da? Próbowałem i nic Powyższy kod bierze ...   26.08.2009, 21:20:22
- - thek   Wartość średnia to prosta sprawa, robisz bowiem su...   26.08.2009, 22:09:38
- - damianprz   Tylko jak zrobić sumowanie wszystkich wartości w k...   26.08.2009, 22:19:13
- - thek   Sumowanie wszystkiego w kolumnie: [SQL] pobierz, p...   26.08.2009, 22:47:41
- - damianprz   [PHP] pobierz, plaintext Średnia wynosi: 10.625, a...   27.08.2009, 11:59:54
- - thek   Problemy które poruszasz w poście zaznaczyłem po o...   27.08.2009, 13:01:53
- - damianprz   Na screenie widać 3 tabelki które zrobiłem wg twoj...   27.08.2009, 15:06:49
- - thek   Bo z rozpędu nie dopisałem warunku łączenia [SQL]...   27.08.2009, 15:59:16
- - damianprz   Możesz mi sprawdzić czy to jest OK? Do wyświetlani...   27.08.2009, 16:04:56
- - thek   Kod wygląda poprawnie. W sumie chyba jedynie nie m...   27.08.2009, 20:02:28
- - damianprz   Dzięki stary za pomoc Powyższe obliczenia stosuje ...   27.08.2009, 21:46:24
- - thek   No jasne. Zauważ, że grupujesz dane po id_towaru. ...   27.08.2009, 23:38:49
- - damianprz   Oj kolego thek, co ja bym bez Ciebie zrobił Dzięk...   28.08.2009, 00:00:18
- - thek   A ja życzę powodzenia w kodzie php/html i analizie...   28.08.2009, 00:54:52
- - damianprz   Ponoć ma być raczej pod koniec września tak żeby j...   28.08.2009, 18:21:36
- - thek   Zapytanie sypie Ci błąd bo nie nadałeś aliasu dla ...   28.08.2009, 21:37:08
- - damianprz   Już wcześniej ustawiłem wartości na double z obawy...   28.08.2009, 21:53:30
- - thek   Nie dublujmy może tematów i skupmy się w jednym U...   28.08.2009, 23:31:14
- - damianprz   [PHP] pobierz, plaintext UPDATE zapasy z LEFT JOIN...   29.08.2009, 11:40:41
- - thek   Owszem Mam na laptopie swoim wszystko co potrzebn...   29.08.2009, 13:21:54
- - damianprz   Już wszystko działa! Instalka Vertrigo pomogła   29.08.2009, 13:28:35
- - thek   Widzę, ze sugestia o fatalnym wpływie MySQL 3.X na...   29.08.2009, 16:20:12
- - MMaro   Witam odkopuje temat - ponieważ mam problem z ob...   21.06.2012, 17:50:42
- - thek   Pytanie... Po co obliczać odchylenie samemu, skoro...   21.06.2012, 19:20:41


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 01:33