StatisticsCalculator.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. import java.util.ArrayList;
  2. import java.util.Calendar;
  3. import java.util.Collections;
  4. import java.util.Map;
  5. import java.util.HashMap;
  6. /**
  7. * Berekent allerlei statistische waarden voor de gegeven data
  8. *
  9. * @author Projectgroep B5
  10. */
  11. public class StatisticsCalculator {
  12. /**
  13. * Berekent de maximale waarde
  14. *
  15. * @param array Een ArrayList met alle waarden
  16. *
  17. * @return De gevonden maximale waarde
  18. */
  19. public static double max(ArrayList<Double> array)
  20. {
  21. double max = 0;
  22. for(double waarde : array){
  23. if(waarde > max){
  24. max = waarde;
  25. }
  26. }
  27. return max;
  28. }
  29. /**
  30. * Berekent de minimale waarde
  31. *
  32. * @param array Een ArrayList met alle waarden
  33. *
  34. * @return De gevonden minimale waarde
  35. */
  36. public static double min(ArrayList<Double> array)
  37. {
  38. double min = array.get(0);
  39. for(double waarde : array){
  40. if(waarde < min){
  41. min = waarde;
  42. }
  43. }
  44. return min;
  45. }
  46. /**
  47. * Berekent de gemiddelde waarde
  48. *
  49. * @param array Een ArrayList met alle waarden
  50. *
  51. * @return De gevonden gemiddelde waarde
  52. */
  53. public static double avg(ArrayList<Double> array)
  54. {
  55. double avg = 0;
  56. for(double waarde : array){
  57. avg += waarde;
  58. }
  59. avg /= array.size();
  60. return avg;
  61. }
  62. /**
  63. * Berekent de mediaan
  64. *
  65. * @param array Een ArrayList met alle waarden
  66. *
  67. * @return De gevonden mediaan
  68. */
  69. public static double median(ArrayList<Double> array2){
  70. ArrayList<Double> array = new ArrayList<Double>();
  71. for(double db : array2)
  72. {
  73. array.add(db);
  74. }
  75. Collections.sort(array); //sort the array
  76. double median = 0;
  77. int middle = array.size()/2; //calculate the middle of the array
  78. if (array.size()%2 == 1) { //check if the array is even or uneven
  79. median = array.get(middle);
  80. } else {
  81. median = (array.get(middle-1) + array.get(middle+1)) / 2;
  82. }
  83. return median;
  84. }
  85. /**
  86. * Berekent de modus
  87. *
  88. * @param array Een ArrayList met alle waarden
  89. *
  90. * @return De gevonden modus
  91. */
  92. public static double modus(ArrayList<Double> array){
  93. Map<Double,Integer> map = new HashMap<Double,Integer>();
  94. for(double number : array)
  95. {
  96. if(map.containsKey(number)){
  97. map.put(number,(int)map.get(number)+1);
  98. }else{
  99. map.put(number, 1);
  100. }
  101. }
  102. double maxVal = 0;
  103. double maxKey = 0;
  104. for (Map.Entry<Double, Integer> entry : map.entrySet()) {
  105. if (entry.getValue() > maxVal) {
  106. maxVal = entry.getValue();
  107. maxKey = entry.getKey();
  108. }
  109. }
  110. return maxKey;
  111. }
  112. /**
  113. * Berekent de afwijking
  114. *
  115. * @param array Een ArrayList met alle waarden
  116. *
  117. * @return De gevonden afwijking
  118. */
  119. public static double afwijking(ArrayList<Double> array){
  120. double mediaan = StatisticsCalculator.median(array);
  121. double afwijking = 0;
  122. for(double m :array){
  123. afwijking += (mediaan-m)*(mediaan-m);
  124. }
  125. afwijking /= array.size();
  126. afwijking = Math.sqrt(afwijking);
  127. return afwijking;
  128. }
  129. public static double graadDagen(ArrayList<Double> array)
  130. {
  131. ArrayList<Double> avgTempDag = new ArrayList<Double>();
  132. int i = 0;
  133. double avgTemp = 0;
  134. //Breken de gemiddelde temperatuur per dag.
  135. for(double db : array)
  136. {
  137. i++;
  138. if(i%1440==0)
  139. {
  140. avgTempDag.add(avgTemp);
  141. avgTemp = 0;
  142. }
  143. avgTemp += db;
  144. }
  145. avgTemp /= array.size();
  146. int graaddagen = 0;
  147. int periodeBegin = 0;
  148. int periodeEind = 1439;
  149. for(int j = 0; j < avgTempDag.size(); j++)
  150. {
  151. if(avgTemp < 18)
  152. {
  153. graaddagen += 18 - avgTemp;
  154. }
  155. }
  156. periodeBegin += 1400;
  157. periodeEind += 1400;
  158. //graaddagen afronden
  159. return graaddagen;
  160. }
  161. public static int[] langsteDroogstePeriode(ArrayList<Double> array)
  162. {
  163. return langsteDroogstePeriodeMetMax(array, 0);
  164. }
  165. public static int[] langsteDroogstePeriodeMetMax(ArrayList<Double> array, int maxNeerslag)
  166. {
  167. int[] index = new int[2];
  168. int index1 = 0;
  169. int index2 = 0;
  170. //Code
  171. index[0] = index1;
  172. index[1] = index2;
  173. return index;
  174. }
  175. public static int[] langsteRegenPeriode(ArrayList<Double> array)
  176. {
  177. ArrayList<Double> rainday = new ArrayList<Double>();
  178. int i = 0;
  179. double longRainday = 0;
  180. // Bereken de Rainrate per dag
  181. for(double rain : array)
  182. {
  183. i++;
  184. if (i% 1440 ==0)
  185. {
  186. rainday.add(longRainday);
  187. longRainday = 0;
  188. }
  189. if (rain > longRainday)
  190. {
  191. longRainday = rain;
  192. }
  193. }
  194. int[] index = new int[2];
  195. int index1 = 0;
  196. int index2 = 0;
  197. int index1_1 = 0;
  198. boolean regen = false;
  199. int p = 0;
  200. int maxDays = 0;
  201. for(int t = 0; t < rainday.size(); t++)
  202. {
  203. if (rainday.get(t) > 0 )
  204. {
  205. p++;
  206. if(!regen)
  207. {
  208. regen = true;
  209. index1_1 = t;
  210. }
  211. else
  212. {
  213. if(p > maxDays)
  214. {
  215. maxDays = p;
  216. index1 = index1_1;
  217. index2 = t-1;
  218. regen=false;
  219. }
  220. p = 0;
  221. }
  222. }
  223. }
  224. index[0] = index1*1440;
  225. if(index2<0)
  226. {
  227. index2 =0;
  228. }
  229. index[1] = index2*1440;
  230. return index;
  231. }
  232. /**
  233. * Berekent de totale regenval
  234. *
  235. * @param array Een ArrayList met alle waarden
  236. *
  237. * @return De gevonden totale regenval
  238. */
  239. public static short maximaleRegenPeriode(ArrayList<Double> array)
  240. {
  241. short regen = 0;
  242. ArrayList<Short> regenPerUur = new ArrayList<Short>();
  243. for(int i=0; i<array.size();i++)
  244. {
  245. if(i%60==0)
  246. {
  247. regen /= 60;
  248. regenPerUur.add(regen);
  249. regen = 0;
  250. }
  251. regen += array.get(i);
  252. }
  253. short totaleRegen = 0;
  254. for(short sh : regenPerUur)
  255. {
  256. totaleRegen += sh;
  257. }
  258. return totaleRegen;
  259. }
  260. /**
  261. * Berekent de langste periode waarin het boven 25 graden celcius is geweest
  262. *
  263. * @param array Een ArrayList met alle waarden
  264. *
  265. * @return De posities van de begin en eindtijd in de array van de periode
  266. */
  267. public static int[] langsteZomersePeriode(ArrayList<Double> array)
  268. {
  269. ArrayList<Double> maxTempDag = new ArrayList<Double>();
  270. int i = 0;
  271. double maxTemp = 0;
  272. //Bereken de maximale temperatuur per dag.
  273. for(double db : array)
  274. {
  275. i++;
  276. if(i%1440==0)
  277. {
  278. maxTempDag.add( (double) maxTemp);
  279. maxTemp = 0;
  280. }
  281. if(db > maxTemp)
  282. {
  283. maxTemp = db;
  284. }
  285. }
  286. //Creer een array met twee indexen
  287. int[] index = new int[2];
  288. int index1 = 0;
  289. int index2 = 0;
  290. //Een tijdelijke index om bij te houden wat de index was in het geval dat de vorige groter was.
  291. int index1_1 = 0;
  292. //Een boolean
  293. boolean zomers = false;
  294. int p = 0;
  295. int maxDays = 0;
  296. //Doorloop je maximale temperaturen en zoek de langste periode
  297. for(int t=0; t<maxTempDag.size(); t++) {
  298. if(maxTempDag.get(t) > 770) {
  299. p++;
  300. if(!zomers)
  301. {
  302. zomers = true;
  303. index1_1 = t;
  304. }
  305. }
  306. else {
  307. if(p > maxDays) {
  308. maxDays = p;
  309. index1 = index1_1;
  310. index2 = t-1;
  311. zomers=false;
  312. }
  313. p=0;
  314. }
  315. }
  316. //Het terugsturen van de gevonden indexen. Je doet ze keer 1440 omdat je bij het berekenen van
  317. //de temperatuur per dag je het in stukken van 1440 samenvoegde.
  318. index[0] = index1*1440;
  319. if(index2<0){index2=0;}
  320. index[1] = index2*1440;
  321. return index;
  322. }
  323. public static Periode langsteHittegolfPeriode(ArrayList<Measurement> array){
  324. double maxDay = 0;
  325. ArrayList<Double> maxTempPerDay = new ArrayList<Double>();
  326. //calculate the max for every day
  327. for(int i = 0; i < array.size(); i++){
  328. if((i % 1440) == 0){
  329. maxTempPerDay.add(maxDay);
  330. maxDay = 0;
  331. }
  332. if(array.get(i).getRawOutsideTemp() > maxDay){
  333. maxDay = array.get(i).getRawOutsideTemp();
  334. }
  335. }
  336. int periodLength = 0;
  337. int maxPeriodLength = 5;
  338. int numberOfTropicalDays = 0;
  339. Calendar begin = Calendar.getInstance();
  340. Calendar eind = Calendar.getInstance();
  341. Periode periode = new Periode(begin, eind, "Geen hittegolfperiode gevonden");
  342. for(int i = 0; i < maxTempPerDay.size(); i++){
  343. if( maxTempPerDay.get(i) >= 770){ // If the temperature is bigger then 25 degree Celcius (770 degree Fahrenheit) the summer period will start
  344. periodLength++;
  345. if (maxTempPerDay.get(i) >= 860){ // If the temperature is bigger then 30 degree Celcius (860 degree Fahrenheit) it will add a tropical day
  346. numberOfTropicalDays++;
  347. }
  348. }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
  349. maxPeriodLength = periodLength;
  350. periodLength = 0;
  351. numberOfTropicalDays = 0;
  352. eind.setTimeInMillis(array.get((i-1)*1440).getDateStamp().getTime());
  353. periode = new Periode(eind, begin, "Langste hittegolf periode");
  354. }else{
  355. numberOfTropicalDays = 0;
  356. periodLength = 0;
  357. }
  358. if(periodLength == 5){
  359. begin.setTimeInMillis(array.get((i-5)*1440).getDateStamp().getTime());
  360. }
  361. }
  362. return periode;
  363. }
  364. public static int[] langsteTempStijgingPeriode(ArrayList<Double> array)
  365. {
  366. ArrayList<Double> maxTempDag = new ArrayList<Double>();
  367. ArrayList<Integer> periodeLengteList = new ArrayList<Integer>();
  368. ArrayList<Integer> periodeStartList = new ArrayList<Integer>();
  369. int[] index = new int[2];
  370. int index1 = 0;
  371. int index2 = 0;
  372. int indexStart = 0;
  373. int indexEind = 1;
  374. int periodeLengte = 0;
  375. int i = 0;
  376. double maxTemp = 0;
  377. //berekent maximale temp. per dag
  378. for(double db : array)
  379. {
  380. i ++;
  381. if(i % 1440 == 0)
  382. {
  383. maxTempDag.add(maxTemp);
  384. maxTemp = 0;
  385. }
  386. if(db > maxTemp)
  387. {
  388. maxTemp = db;
  389. }
  390. }
  391. for(int t = 1; t < maxTempDag.size(); t ++) //zoekt naar periodes van temp.stijgingen
  392. {
  393. if (maxTempDag.get(t) > maxTempDag.get(t - 1))
  394. {
  395. indexEind ++;
  396. }
  397. if (maxTempDag.get(t) <= maxTempDag.get(t - 1))
  398. {
  399. periodeLengte = indexEind - indexStart;
  400. periodeLengteList.add(periodeLengte);
  401. periodeStartList.add(indexStart);
  402. indexStart = indexEind;
  403. }
  404. }
  405. Integer tempMax = Collections.max(periodeLengteList); //onthoudt de grootste periode van een temp.stijging
  406. for (int u = 0; u < periodeLengteList.size(); u ++) //pakt de index van de grootste periode
  407. {
  408. if (tempMax == periodeLengteList.get(u))
  409. {
  410. index1 = u;
  411. index2 = tempMax - u;
  412. }
  413. }
  414. index[0] = index1 * 1440;
  415. index[1] = index2 * 1440;
  416. return index;
  417. }
  418. }