| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434 |
- package weerstation1;
- import java.util.ArrayList;
- import java.util.Calendar;
- import java.util.Collections;
- public class StatisticsCalculator {
-
- public static double max(ArrayList<Double> array)
- {
- double max = 0;
-
- for(double waarde : array){
- if(waarde > max){
- max = waarde;
- }
- }
-
- return max;
- }
-
- public static double min(ArrayList<Double> array)
- {
- double min = array.get(0);
-
- for(double waarde : array){
- if(waarde < min){
- min = waarde;
- }
- }
-
- return min;
- }
-
- public static double avg(ArrayList<Double> array)
- {
- double avg = 0;
-
- for(double waarde : array){
- avg += waarde;
- }
- avg /= array.size();
- return avg;
- }
-
- public static double median(ArrayList<Double> array2){
- ArrayList<Double> array = new ArrayList<Double>();
-
- for(double db : array2)
- {
- array.add(db);
- }
-
- Collections.sort(array); //sort the array
-
- double median = 0;
- int middle = array.size()/2; //calculate the middle of the array
- if (array.size()%2 == 1) { //check if the array is even or uneven
- median = array.get(middle);
- } else {
- median = (array.get(middle-1) + array.get(middle+1)) / 2;
- }
- return median;
- }
-
- public static double modus(ArrayList<Double> array){
- double maxValue = 0;
- int maxCount = 0;
-
- for (int i = 0; i < array.size(); ++i){ //cycle through every number in the array
- int count = 0;
- for (int j = 0; j < array.size(); ++j) {
- if (array.get(j) == array.get(i)){
- ++count;
- }
- }
- if (count > maxCount) { //if the count is bigger then the max count, it will be the temporary modus
- maxCount = count;
- maxValue = array.get(i);
- }
- }
- return maxValue;
- }
-
- public static double afwijking(ArrayList<Double> array){
- double mediaan = StatisticsCalculator.median(array);
- double afwijking = 0;
- for(double m :array){
- afwijking += (mediaan-m)*(mediaan-m);
- }
- afwijking /= array.size();
- afwijking = Math.sqrt(afwijking);
- return afwijking;
- }
-
- public static double graadDagen(ArrayList<Double> array)
- {
- ArrayList<Double> avgTempDag = new ArrayList<Double>();
- int i = 0;
- double avgTemp = 0;
-
- //Breken de gemiddelde temperatuur per dag.
- for(double db : array)
- {
- i++;
- if(i%1440==0)
- {
- avgTempDag.add(avgTemp);
- avgTemp = 0;
- }
- avgTemp += db;
- }
- avgTemp /= array.size();
-
-
- int graaddagen = 0;
- int periodeBegin = 0;
- int periodeEind = 1439;
-
- for(int j = 0; j < avgTempDag.size(); j++)
- {
- if(avgTemp < 18)
- {
- graaddagen += 18 - avgTemp;
- }
- }
-
- periodeBegin += 1400;
- periodeEind += 1400;
-
- //graaddagen afronden
-
- return graaddagen;
- }
-
- public static int[] langsteDroogstePeriode(ArrayList<Double> array)
- {
- return langsteDroogstePeriodeMetMax(array, 0);
- }
-
- public static int[] langsteDroogstePeriodeMetMax(ArrayList<Double> array, int maxNeerslag)
- {
- int[] index = new int[2];
- int index1 = 0;
- int index2 = 0;
-
- //Code
-
- index[0] = index1;
- index[1] = index2;
- return index;
- }
-
- public static int[] langsteRegenPeriode(ArrayList<Double> array)
- {
- ArrayList<Double> rainday = new ArrayList<Double>();
-
- int i = 0;
- double longRainday = 0;
-
- // Bereken de Rainrate per dag
- for(double rain : array)
- {
- i++;
- if (i% 1440 ==0)
- {
- rainday.add(longRainday);
- longRainday = 0;
- }
-
- if (rain > longRainday)
- {
- longRainday = rain;
- }
- }
- int[] index = new int[2];
- int index1 = 0;
- int index2 = 0;
-
- int index1_1 = 0;
-
- boolean regen = false;
-
- int p = 0;
- int maxDays = 0;
-
- for(int t = 0; t < rainday.size(); t++)
- {
- if (rainday.get(t) > 0 )
- {
- p++;
-
- if(!regen)
- {
- regen = true;
- index1_1 = t;
- }
- else
- {
- if(p > maxDays)
- {
- maxDays = p;
- index1 = index1_1;
- index2 = t-1;
- regen=false;
- }
- p = 0;
- }
- }
- }
-
- index[0] = index1*1440;
- if(index2<0)
- {
- index2 =0;
- }
- index[1] = index2*1440;
- return index;
- }
-
- public static short maximaleRegenPeriode(ArrayList<Double> array)
- {
- short regen = 0;
- ArrayList<Short> regenPerUur = new ArrayList<Short>();
-
- for(int i=0; i<array.size();i++)
- {
- if(i%60==0)
- {
- regen /= 60;
- regenPerUur.add(regen);
- regen = 0;
- }
-
- regen += array.get(i);
- }
-
-
- short totaleRegen = 0;
-
- for(short sh : regenPerUur)
- {
- totaleRegen += sh;
- }
-
- return totaleRegen;
- }
-
- public static int[] langsteZomersePeriode(ArrayList<Double> array)
- {
-
- ArrayList<Double> maxTempDag = new ArrayList<Double>();
- int i = 0;
- double maxTemp = 0;
-
- //Bereken de maximale temperatuur per dag.
- for(double db : array)
- {
- i++;
- if(i%1440==0)
- {
- maxTempDag.add( (double) maxTemp);
- maxTemp = 0;
- }
-
- if(db > maxTemp)
- {
- maxTemp = db;
- }
- }
- //Creer een array met twee indexen
- int[] index = new int[2];
- int index1 = 0;
- int index2 = 0;
-
- //Een tijdelijke index om bij te houden wat de index was in het geval dat de vorige groter was.
- int index1_1 = 0;
-
- //Een boolean
- boolean zomers = false;
-
- int p = 0;
- int maxDays = 0;
-
- //Doorloop je maximale temperaturen en zoek de langste periode
- for(int t=0; t<maxTempDag.size(); t++) {
- if(maxTempDag.get(t) > 770) {
- p++;
- if(!zomers)
- {
- zomers = true;
- index1_1 = t;
- }
- }
- else {
- if(p > maxDays) {
- maxDays = p;
- index1 = index1_1;
- index2 = t-1;
- zomers=false;
- }
- p=0;
- }
- }
- //Het terugsturen van de gevonden indexen. Je doet ze keer 1440 omdat je bij het berekenen van
- //de temperatuur per dag je het in stukken van 1440 samenvoegde.
- index[0] = index1*1440;
- if(index2<0){index2=0;}
- index[1] = index2*1440;
-
- return index;
- }
-
-
- public static Periode langsteHittegolfPeriode(ArrayList<Measurement> array){
- double maxDay = 0;
- ArrayList<Double> maxTempPerDay = new ArrayList<Double>();
-
- //calculate the max for every day
- for(int i = 0; i < array.size(); i++){
- if((i % 1440) == 0){
- maxTempPerDay.add(maxDay);
- maxDay = 0;
- }
- if(array.get(i).getRawOutsideTemp() > maxDay){
- maxDay = array.get(i).getRawOutsideTemp();
- }
- }
-
- int periodLength = 0;
- int maxPeriodLength = 5;
- int numberOfTropicalDays = 0;
-
- Calendar begin = Calendar.getInstance();
- Calendar eind = Calendar.getInstance();
- Periode periode = new Periode(begin, eind, "Geen hittegolfperiode gevonden");
-
- for(int i = 0; i < maxTempPerDay.size(); i++){
- if( maxTempPerDay.get(i) >= 770){ // If the temperature is bigger then 25 degree Celcius (770 degree Fahrenheit) the summer period will start
- periodLength++;
- if (maxTempPerDay.get(i) >= 860){ // If the temperature is bigger then 30 degree Celcius (860 degree Fahrenheit) it will add a tropical day
- numberOfTropicalDays++;
- }
- }else if(periodLength > maxPeriodLength && numberOfTropicalDays >= 3){ //period has ended. If it is bigger then 5 days AND there are 3 or more tropical days, the period is a heat wave
- maxPeriodLength = periodLength;
- periodLength = 0;
- numberOfTropicalDays = 0;
- eind.setTimeInMillis(array.get((i-1)*1440).getDateStamp().getTime());
- periode = new Periode(eind, begin, "Langste hittegolf periode");
- }else{
- numberOfTropicalDays = 0;
- periodLength = 0;
- }
- if(periodLength == 5){
- begin.setTimeInMillis(array.get((i-5)*1440).getDateStamp().getTime());
- }
- }
- return periode;
- }
-
-
- public static int[] langsteTempStijgingPeriode(ArrayList<Double> array)
- {
- ArrayList<Double> maxTempDag = new ArrayList<Double>();
- ArrayList<Integer> periodeLengteList = new ArrayList<Integer>();
- ArrayList<Integer> periodeStartList = new ArrayList<Integer>();
-
- int[] index = new int[2];
- int index1 = 0;
- int index2 = 0;
- int indexStart = 0;
- int indexEind = 1;
- int periodeLengte = 0;
- int i = 0;
- double maxTemp = 0;
-
- //berekent maximale temp. per dag
- for(double db : array)
- {
- i ++;
- if(i % 1440 == 0)
- {
- maxTempDag.add(maxTemp);
- maxTemp = 0;
- }
-
- if(db > maxTemp)
- {
- maxTemp = db;
- }
- }
-
- for(int t = 1; t < maxTempDag.size(); t ++) //zoekt naar periodes van temp.stijgingen
- {
- if (maxTempDag.get(t) > maxTempDag.get(t - 1))
- {
- indexEind ++;
- }
-
- if (maxTempDag.get(t) <= maxTempDag.get(t - 1))
- {
- periodeLengte = indexEind - indexStart;
- periodeLengteList.add(periodeLengte);
- periodeStartList.add(indexStart);
- indexStart = indexEind;
- }
- }
-
-
- Integer tempMax = Collections.max(periodeLengteList); //onthoudt de grootste periode van een temp.stijging
-
- for (int u = 0; u < periodeLengteList.size(); u ++) //pakt de index van de grootste periode
- {
- if (tempMax == periodeLengteList.get(u))
- {
- index1 = u;
- index2 = tempMax - u;
- }
- }
-
- index[0] = index1 * 1440;
- index[1] = index2 * 1440;
- return index;
- }
- }
-
-
|