Meteo Learning Machine Project

Meteo Learning Machine Project

4ο Δημοτικό Σχολείο Καλαμαριάς

Meteo Learning Machine Project

Είμαστε μια ομάδα μαθητών του 4ου Δημοτικού Σχολείου Καλαμαριάς και για τον 3ο ΠΑΝΕΛΛΗΝΙΟ ΔΙΑΓΩΝΙΣΜΟ ΑΝΟΙΧΤΩΝ ΤΕΧΝΟΛΟΓΙΩΝ , αποφασίσαμε να υλοποιήσουμε μία εφαρμογή πρόβλεψης του καιρού στην περιοχή της Θεσσαλονίκης. Η Εφαρμογή θα χρησιμοποιεί και θα επεξεργάζεται δεδομένα χρονοσειρών για τον καιρό προηγούμενων χρονικών περιόδων και με την βοήθεια της τεχνολογίας Learning Machine (Artificial Intelligence) θα μπορεί να προβλέψει το καιρό σε κάποια επόμενη χρονική περίοδο. Θα χρησιμοποιηθούν ανοιχτής τεχνολογίας εφαρμογές/πλατφόρμας και υλικά όπως raspberry, python.

Στα χρονικά πλαίσια που είχαμε εντός του διαγωνισμού καταφέραμε να προγραμματίσουμε το μέρος της εφαρμογής που θα διαβάζει και θα επεξεργάζεται τα θερμοκρασιακά δεδομένα 5 ετών για την περιοχή του αεροδρομίου Θεσσαλονίκης με σκοπό να προβλέψει το πρόγραμμα μας την ποσοστό αστοχίας (σε βαθμούς Κελσίου) μεταξύ πρόβλεψης και πραγματικής τιμής της θερμοκρασίας για μία οποιαδήποτε ημέρα εντός των τελευταίων 4 ετών περίπου.

Στα παραδοτέα του project μας θα είναι και η δημιουργία σελίδας εντός του site του σχολείου μας που θα παρουσιάζει αλλά και θα τρέχει την εφαρμογή πρόβλεψης καιρού κάποιος χρήστης για εκπαιδευτικούς σκοπούς.

Η εφαρμογή θα μπορεί μελλοντικά να χρησιμοποιήσει δεδομένα από τον υπό ανάπτυξη μετεωρολογικό σταθμό του σχολείου μας για να ελέγχει την αξιοπιστία των τιμών πρόβλεψης σε σχέση με τα πραγματικά μετεωρολογικά δεδομένα.

ΣΕΝΑΡΙΟ ΔΡΑΣΤΗΡΙΟΤΗΤΑΣ

Αριθμός μαθητών: 3
Αριθμός Ομάδων: 1
Αριθμός ατόμων ανά ομάδα: 3
Είδος δραστηριότητας: Ομαδοσυνεργατική
Ρόλοι: Δεν υπάρχουν διακριτοί ρόλοι στην ομάδα.
Ηλικιακή ομάδα: 11-12

Φάση Προετοιμασίας

Οι μαθητές θα πρέπει να:

  • Αναζητήσουν στο διαδίκτυο για αντίστοιχες εφαρμογές που υλοποιούν διαδικασίες ανάλυσης δεδομένων και πρόβλεψης καιρού.
  • Κατανοήσουν έννοιες όπως: θερμοκρασία, μέσοι όροι τιμών, βιβλιοθήκες python, εγκατάσταση βιβλιοθηκών, συνδεσμολογία sensors.
  • Να διερευνήσουν για το καλύτερο και πιο φιλικού περιβάλλοντος προγραμματισμού Python
  • Να διερευνήσουν στο διαδίκτυο για αρχείο με μετεωρολογικά δεδομένα για την περιοχή της Θεσσαλονίκης

Φάση Σχεδιασμού

Οι μαθητές θα πρέπει να:

  • Αναζητήσουν στο διαδίκτυο για να βρουν πληροφορίες για τον κώδικα που θα γράψουν.
  • Εγκαταστήσουν το απαραίτητο περιβάλλον προγραμματισμού Python
  • Εγκαταστήσουν τις απαραίτητες βιβλιοθηκών προγραμμάτων στο Python περιβάλλον .

 

Φάση Υλοποίησης

Οι μαθητές θα πρέπει να:

  • Συλλέξουν θερμοκρασίες από το 2015-2019. Από το site: https://rpru/Weather_archive_in_Thessaloniki_(airport)
  • Ταξινομήσουν τις θερμοκρασίες στο calc και να βρουν τους μέσους όρους των τιμών της κάθε ημέρας.
  • Προγραμματίσουν στο πρόγραμμα PyCharm2.2 στη γλώσσα python τον κώδικα του προγράμματος .
  • Μαζέψουν όλα τα αρχεία calc και να τα βάλουν στον ίδιο φάκελο με το πρόγραμμα.

Φάση Δοκιμών

Οι μαθητές θα πρέπει να:

  • Δοκιμάσουν το πρόγραμμα και να επιβεβαιώσουν τη σωστή λειτουργία του.

Εισαγωγή

Η ιδέα μας ήταν να φτιάξουμε ένα πρόγραμμα πρόβλεψης καιρού παίρνοντας και ταξινομώντας της καταγραφές από το αρχείο των καιρικών συνθηκών του μετεωρολογικού σταθμού αεροδρομίου Θεσσαλονίκης. Η αρχική μας σκέψη ήταν να δουλέψουμε με Raspberry pi  3B αλλά υπήρχαν προβλήματα με τη συμβατότητα και αποφασίσαμε να χρησιμοποιήσουμε το εργαλείο PyCharm Community Edition 2021.2.2 στα Windows, επειδή έχει πιο απλοποιημένη εργασία εγκατάστασης των πακέτων των βιβλιοθηκών και είναι πιο φιλικά προς αυτά.

ΕΦΑΡΜΟΓΕΣ ΠΟΥ ΧΡΗΣΙΜΟΠΟΙΗΣΑΜΕ:

  • PyCharm Community Edition2.2
  • Libreoffice
  • IDLE (Python 3.10 64-bit)

Υλικά που χρησιμοποιήσαμε

raspberry pi4

Υλικά που θα χρησιμοποιηθούν σε επόμενη φάση του έργου

BME 280, Weather meter kit , raspberry pi4

Ο αισθητήρας BME 280 θα χρησιμοποιηθεί στο μέλλον μόλις εγκατασταθεί ο μετεωρολογικός σταθμός weather meter kit για να καταγράφει τα δεδομένα Θερμοκρασίας, Υγρασίας, Πίεσης της ατμόσφαιρας. Θα λειτουργήσει μαζί με το νέο raspberry pi4. Ο μετεωρολογικός σταθμός θα συλλέγει πληροφορίες όπως τη στάθμη της βροχής , την ταχύτητα και η πορεία του ανέμου.

Ο Κώδικάς μας

Α Μέρος

Change to the data directory

# Change to the data directory
import os
os.chdir('.') # You should change to the corresponding directory in your computer
os.listdir()
# Import numpy, pandas for data manipulation
import numpy as np
import pandas as pd

# Import matplotlib, seaborn for visualization
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)

# Import the data
weather_data = pd.read_csv('weather_data_test.csv',parse_dates=['datetime'], sep=';', decimal=','
                     , infer_datetime_format=True)

Στο πρώτο μέρος του προγράμματος μας εισάγουμε τις απαραίτητες βιβλιοθήκες pandas, numpy για τους υπολογισμούς και τις matplotlib και seaborn για την οπτικοποίηση των υπολογισμών σε γράφημα.

Στο τελευταίο τμήμα εισάγουμε τα δεδομένα από το αρχείο που έχουμε ετοιμάσει με τους μ.ο θερμοκρασίας για μια χρονική περίοδο 4 ετών περίπου.

Β΄Μέρος

# Check the shape of the dataset
print(weather_data.shape)

# Select the datetime and the temperature columns
temp_df = weather_data[["datetime","T_mu"]]
temp_df.head(10)
# Check the shape of the dataset
temp_df.shape
# Select the subset data from 2016 to 2019
mask = (temp_df['datetime'] >= '2015-09-07') & (temp_df['datetime'] <= '2019-05-21')
temp_df = temp_df.loc[mask]

Σε αυτό το τμήμα κώδικά το πρόγραμμα επιλέγει μέσα από τα αρχείο που ανοίξαμε παραπάνω τις 2 πρώτες στήλες και ορίζει το υποσύνολο των τιμών που θα πάρει με ημερομηνίες από 7/9/2015 ως 21/5/2019.

Γ΄ Μέρος  

# Reset the index
temp_df.set_index("datetime", inplace=True)

# Inspect first 5 rows and last 5 rows of the data
from IPython.display import display
display(temp_df.head(5))
display(temp_df.tail(5))
temp_df.describe()
# Output the maximum and minimum temperature date
print(temp_df.loc[temp_df["T_mu"] == temp_df["T_mu"].max()])
print(temp_df.loc[temp_df["T_mu"] == temp_df["T_mu"].min()])
# Plot the daily temperature change
plt.figure(figsize=(16,10), dpi=100)
plt.plot(temp_df.index, temp_df.T_mu, color='tab:red')
plt.gca().set(title="Daily Temperature in Thessaloniki, Greece from 2015 to 2019", xlabel='Date', ylabel="Degree (in Celsius)")
plt.show()

Σε αυτό το τμήμα κώδικά το πρόγραμμα αναζητεί και επεξεργάζεται μέσα από τα αρχείο δεδομένων τις πρώτες και τις τελευταίες πέντε γραμμές του αρχείου.
Υπολογίζει και τυπώνει τους μέσους όρους τιμών και στην συνέχεια τυπώνει την καθημερινή θερμοκρασιακή αλλαγή σε γράφημα.

Δ΄ Μέρος

# Apply the Moving Average function by a subset of size 30 days.
temp_df_mean = temp_df.T_mu.rolling(window=30).mean()
temp_df_mean.plot(figsize=(20,15))
from statsmodels.tsa.seasonal import seasonal_decompose, DecomposeResult

# Additive Decomposition
# result_add: DecomposeResult = seasonal_decompose(temp_df.T_mu, model='additive', extrapolate_trend='freq', freq=365)


# Plot
plt.rcParams.update({'figure.figsize': (10,10)})
# result_add.plot().suptitle('Additive Decomposition', fontsize=22)
plt.show()

# Shift the current temperature to the next day.
predicted_df = temp_df["T_mu"].to_frame().shift(1).rename(columns = {"T_mu": "T_mu_pred" })
actual_df = temp_df["T_mu"].to_frame().rename(columns = {"T_mu": "T_mu_actual" })

# Concatenate the actual and predicted temperature
one_step_df = pd.concat([actual_df,predicted_df],axis=1)

# Select from the second row, because there is no prediction for today due to shifting.
one_step_df = one_step_df[1:]
one_step_df.head(10)

# Shift the current temperature to the next day.
predicted_df = temp_df["T_mu"].to_frame().shift(1).rename(columns = {"T_mu": "T_mu_pred" })
actual_df = temp_df["T_mu"].to_frame().rename(columns = {"T_mu": "T_mu_actual" })

# Concatenate the actual and predicted temperature
one_step_df = pd.concat([actual_df,predicted_df],axis=1)

# Select from the second row, because there is no prediction for today due to shifting.
one_step_df = one_step_df[1:]
one_step_df.head(10)

from sklearn.metrics import mean_squared_error as MSE
from math import sqrt

# Calculate the RMSE
temp_pred_err = MSE(one_step_df.T_mu_actual, one_step_df.T_mu_pred, squared=False)
print("
H Ρίζα μέσου τετραγωνικού σφάλματος είναι",temp_pred_err)

 

Στο τελευταίο μέρος και το πιο σημαντικό του κώδικα , είναι εκεί  που γίνεται η χρήση περίπλοκων μαθηματικών συναρτήσεων, όπως η χρήση του κινητού μέσου όρου τιμών, η αφαίρεση του «θορύβου» τιμών, δηλαδή τιμών που δεν ταιριάζουν με το μοτίβο των χρονοσειρών και οι υπολογισμοί προβλέψεων των τιμών Θερμοκρασίας μιας μέρας σε σχέση με την προηγούμενη της.

Εδώ θα πρέπει να να αναφέρουμε ότι η όλη μελέτη υπολογισμού στηρίζεται στο απλοποιημένο σενάριο ότι ο καιρός της σημερινής ημέρας, εξαρτάται από αυτό της χθεσινής και ο καιρός της αυριανής ,από αυτό της σημερινής.

Τέλος  υπολογίζεται το RMSE (Ρίζα μέσου τετραγωνικού σφάλματος), η οποία μας δείχνει την ποιότητα της πρόβλεψης για το δείγμα δεδομένων που έχουμε χρησιμοποιήσει. Μία τιμή που είναι κοντά στον αριθμό 1, ειδικά και για μετεωρολογική πρόβλεψη, όπου υπάρχουν πολλοί αστάθμιστοι παράγοντες που μπορεί να επηρεάσουν την τιμή της θερμοκρασίας, είναι απολύτως αποδεκτή και ικανή να μας δείξει ότι το μοντέλο πρόβλεψης που προγραμματίσαμε είναι αρκετά κοντά στα πραγματικά δεδομένα.

Οθόνες υπολογισμών προγράμματος

(1353, 2)
datetime     T_mu
2019-05-21 21.7
2019-05-20 21.2
2019-05-19 21.1
2019-05-18 20.3
2019-05-17 19.6

datetime     T_mu
2015-09-11 21.925
2015-09-10 23.800
2015-09-09 27.150
2015-09-08 28.200
2015-09-07 26.550

datetime     T_mu  datetime
2016-06-25 31.425
2017-01-08 -6.15

 

H Ρίζα μέσου τετραγωνικού σφάλματος είναι 1.831628421656742

Process finished with exit code 0

Αρχικό γράφημα μέσων τιμών για την Θεσσαλονίκη, πριν την εξομάλυνση (αφαίρεση θορύβου)

Γράφημα εξομάλυνσης μέσων τιμών Θερμοκρασίας

ΙΣΤΟΣΕΛΙΔΕΣ ΠΟΥ ΕΠΙΣΚΕΦΤΗΚΑΜΕ:

Τα αρχεία μας μπορείτε να τα βρείτε και στο αποθετήριο Github https://github.com/gzaxar/Meteo_Learning_Machine_Project