GitLab wurde erfolgreich aktualisiert. Durch regelmäßige Updates bleibt das THM GitLab sicher. Danke für Ihre Geduld.

Commit 7cb01454 authored by Jens Plüddemann's avatar Jens Plüddemann

commenting

parent dd9b5963
......@@ -12,194 +12,322 @@ register_matplotlib_converters()
class AirlinePassengers:
def __init__(self, file_path: str):
# Einlesen der Excel-Datei
self.df = pd.read_excel(file_path)
# Konvertieren der Month Spalte zu einem Datetime-Objekt
self.df['Month'] = pd.to_datetime(self.df['Month'])
# Variablen für Autovervollständigung
self.time = self.df['Month']
self.passengers = self.df['Passengers']
def plot_initial(self):
# Plotten der initialen Werte, x-Achse ist die Zeit, y-Achse die Anzahl der Passagiere
plt.plot(self.time, self.passengers, label='Initial')
# Kosmetische Eigenschaften des Plots
plt.title('Passengers per Month')
plt.xlabel('Time')
plt.ylabel('Passengers')
plt.legend()
# Zeige das Plot
plt.show()
def plot_moving_average_without_pandas(self, windows=None):
# Standardmäßiger Wert des window Parameters ist eine List mit dem Wert 3
if windows is None:
windows = [3]
# Für jeden Wert in window Parameter
for window in windows:
# Initialisieren einer leeren Liste für die berechneten Mittelwerte
moving_averages = []
# Start des gleitenden Durchschnitts
# math.floor sorgt für das Abrunden des Werts
start = math.floor(window / 2)
# Ende des gleitenden Durchschnitts
# Länge der Liste an Passagierdaten - start
end = len(self.passengers) - start
# Von 0 bis zum end Wert
for i in range(end):
# Wenn i größer oder gleich dem Startwert ist
if i >= start:
# Initialisiere value mit dem Wert 0
value = 0
# Von i - start bis i + start + 1
for j in range(i - start, i + start + 1):
value = value + self.passengers[j]
# value nimmt den Wert der Passagieranzahl bei der Stelle j an + sich selbst
value += self.passengers[j]
# Schlussendlich wird der value Wert durch das derzeitige window geteilt und der Liste angefügt
value = value / window
moving_averages.append(value)
# Wenn i kleiner als der Startwert ist
else:
# Füge NaN (not a number) Werte an, damit keine Punkte im Plot gezeichnet werden
moving_averages.append(np.nan)
# Füge erneut NaN Werte hinzu, damit keine Punkte im Plot gezeichnet werden
for i in range(start):
moving_averages.append(np.nan)
# Plotte auf der x-Achse die Zeit und auf der y-Achse die ausgerechneten Mittelwerte
plt.plot(self.time, moving_averages, label=f'Window={window}')
# Plotte die initialen Werte der Passagiere
plt.plot(self.time, self.passengers, label='Initial')
# Kosmetische Eigenschaften des Plots
plt.title('Initial plot vs moving averages')
plt.xlabel('Time')
plt.ylabel('Passengers')
plt.legend()
# Zeige alle Plots
plt.show()
# Alpha ist ein übergebbarer Parameter, mit dem Standardwert 0.3
def plot_exponential_average_without_pandas(self, alpha=0.3):
# initialisiere eine leere Liste für die Mittelwerte
exponential_averages = []
# Für jeden Wert im Bereich von 0 bis zur Länge der Liste an Passagierdaten
for i in range(len(self.passengers)):
# Wenn i 0 ist
if i == 0:
# Füge die Passagierdaten an der Stelle i ein
exponential_averages.append(self.passengers[i])
# Wenn i was anderes als 0 ist
else:
# Füge den errechneten Wert ein
exponential_averages.append(alpha * self.passengers[i] + (1 - alpha) * exponential_averages[i - 1])
# Plotte die initialen Daten (x-Achse Zeit, y-Achse Passagiere)
plt.plot(self.time, self.passengers, label='Initial')
# Plotte die errechneten Daten (x-Achse Zeit, y-Achse die ausgerechneten Werte
plt.plot(self.time, exponential_averages, label=f'Alpha={alpha}')
# Kosmetische Eigenschaften des Plots
plt.title('Initial plot vs exponential averages')
plt.xlabel('Time')
plt.ylabel('Passengers')
plt.legend()
# Zeige alle Plots
plt.show()
def plot_moving_averages_with_pandas(self, windows=None):
# Standardmäßiger Wert des window Parameters ist eine List mit dem Wert 3
if windows is None:
windows = [3]
# Für jeden Wert in der übergebenen Liste (windows) an Werten
for window in windows:
# Errechne die gleitenden Mittelwerte mittels der Bibliothek Pandas
rolling_mean = self.df.rolling(window=window).mean()
# Plotte die Zeit auf der x-Achse und die errechneten Mittelwerte auf der y-Achse
plt.plot(self.time, rolling_mean, label=f'Window={window}')
# Plotte die initialen Daten
plt.plot(self.time, self.passengers, label='Initial')
# Kosmetische Eigenschaften des Plots
plt.title('Initial vs rolling mean pandas')
plt.xlabel('Time')
plt.ylabel('Passengers')
plt.legend()
# Zeige alle Plots
plt.show()
# lags ist ein übergebbarer Parameter, mit dem Standardwert 140
def plot_auto_correlation_hyndman_without_pandas(self, lags=140):
# Mittelwert ausrechnen mittels Bibliothek Numpy
mean = np.mean(self.passengers)
# Varianz ausrechnen mittels der Bibliothek Numpy
variance = np.var(self.passengers)
# Anlegen einer leeren Liste für die errechneten Werte
acf = []
# Definieren des Endes
end = lags - 1
# Für jeden Wert von 0 bis zum Ende
for tau in range(end):
# Initialisieren der Summe der Covarianz mit 0
sum_covariance = 0
# für jeden Wert von tau + 1 bis zur Lände der Liste an Passagierdaten
for i in range(tau + 1, len(self.passengers)):
# Summe der Covarianz ist die Summe der Covarianz + den neu errechneten Wert
sum_covariance += (self.passengers[i] - mean) * (self.passengers[i - tau] - mean)
# Hinzufügen der errechneten Summe geteilt der Varianz * die Länge der Liste an Passagierdaten - 1
acf.append(sum_covariance / (variance * (len(self.passengers) - 1)))
# erstellen eines Stem Plots mit den errechneten Werten (use_line_collection aus Performance Gründen)
plt.stem(acf, use_line_collection=True)
# Zeige alle Plots
plt.show()
def plot_adjacent_values(self):
# Plotten eines Lag-Plots mittels der Bibliothek Pandas
lag_plot(self.passengers, lag=1, label='Passengers')
# Kosmetische Eigenschaften des Plots
plt.title('Compare adjacent values')
plt.legend()
# Zeige alle Plots
plt.show()
def plot_auto_correlation_with_pandas(self):
# Erstellen eines neuen Dataframes (Pandas) mit 2 Datensätzen
# Datensatz 1 ist die Liste an Passagierdaten um 1 verschoben
# Datensatz 2 ist die normale Liste an Passagierdaten
# Axis beschreibt auf welcher Achse (in dem Fall Spalten) verbunden werden soll
# names gibt den Spalten neue Namen
data_frame = pd.concat([self.passengers.shift(1), self.passengers], axis=1, names=['t-1, t+1'])
# Schreibt den Korrelationskoeffizienten in die Konsole
print(f'Correlation: {data_frame.corr()}')
# Plotten der Autokorrelation mittes der Bibliothek Pandas
autocorrelation_plot(self.passengers)
# Zeige alle Plots
plt.show()
# lags ist ein übergebbarer Parameter, mit dem Standardwert 140
def plot_auto_correlation_with_stats_models(self, lags=140):
# Plotten der Autokorrelation mittes der Bibliothek Statsmodels
plot_acf(self.passengers, lags=lags)
# Zeige alle Plots
plt.show()
def plot_naive_forecast(self):
# initialisiere eine Liste mit einem NaN (not a number) Wert
forecast = [math.nan]
# Füge jeden Wert aus dem Passagierdatensatz der Liste hinzu
for value in self.passengers:
forecast.append(value)
# Lösche den letzten Wert
del forecast[-1]
# initialisiere die Fehler mit 0
me = 0
mae = 0
mse = 0
# Für jeden Wert in dem Passagierdatensatz und in der neu erstellten Liste
for value, forecast_value in zip(self.passengers, forecast):
# Wenn der Wert in der neu erstellten Liste NICHT NaN ist
if not math.isnan(forecast_value):
# Differenz zwischen dem eigentlichen Wert und dem vorhergesagtem Wert
diff = value - forecast_value
# Rechne die verschiedenen Fehler aus und summiere sie zu dem bestehenden Fehlern auf
me += diff
mae += np.abs(diff)
mse += diff * diff
# Teile alle Fehler durch die Länge der Passagierdatensätze
me /= len(forecast)
mae /= len(forecast)
mse /= len(forecast)
# Schreibe die Fehler in die Konsole
print(f"Mean Error: {me}")
print(f"Mean Absolute Error: {mae}")
print(f"Mean Square Error: {mse}")
# Plotte die initialen Daten
plt.plot(self.time, self.passengers, label='Initial data')
# Plotte die vorhergesagten Werten
plt.plot(self.time, forecast, label='Naive forecast')
# Kosmetische Eigenschaften des Plots
plt.title('Naive forecast')
plt.xlabel('Time')
plt.ylabel('Passengers')
plt.legend()
# Zeige alle Plots
plt.show()
def plot_arima_model(self):
# Errechne das ARIMA Model mittels der Bibliothek Statsmodels und füge die Passagierdaten hinzu
results = ARIMA(self.passengers, order=(2, 1, 2)).fit(disp=-1)
# Errechne die Vorhersagen
predictions = results.fittedvalues.cumsum()
# [1:] ignores the value at index 0, because fittedvalues and predictions are 1 indexed
# Plotte die initialen Daten
plt.plot(self.time, self.passengers, label='Initial data')
# [1:] ignoriert den ersten Wert in der Liste, da fittedvalues und predictions mit 1 anfangen und nicht mit 0
plt.plot(self.time[1:], results.fittedvalues, label='estimated differences')
plt.plot(self.time[1:], predictions, label='accumulated sum')
# Kosmetische Eigenschaften des Plots
plt.title('ARIMA model output')
plt.xlabel('Time')
plt.ylabel('Passengers')
plt.legend()
# Zeige alle Plots
plt.show()
def plot_arima_forecast(self):
# Errechne das ARIMA Model mittels der Bibliothek Statsmodels und füge die Passagierdaten hinzu
results = ARIMA(self.passengers, order=(2, 1, 2)).fit(disp=-1)
# Plotte die Ergebnisse und zeige die Vorhersagen von 1 bis 264
results.plot_predict(1, 264)
#
plt.show()
if __name__ == '__main__':
# Erstellen des AirlinePassengers Objekts, um auf die Funktionen zuzugreifen
data_set = AirlinePassengers('../../res/airline-passengers.xls')
# data_set.plot_initial()
# Kommentiere die Funktionen einzeln, um die Ergebnisse zu sehen
data_set.plot_initial()
# data_set.plot_moving_average_without_pandas([3, 7, 11, 27])
# data_set.plot_exponential_average_without_pandas()
# data_set.plot_moving_averages_with_pandas([3, 7, 11, 27])
......@@ -208,4 +336,4 @@ if __name__ == '__main__':
# data_set.plot_auto_correlation_with_stats_models()
# data_set.plot_naive_forecast()
# data_set.plot_arima_model()
data_set.plot_arima_forecast()
# data_set.plot_arima_forecast()
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment