TSchiefer / IE_BigData_Project

0 stars 0 forks source link

how to join? #3

Open TSchiefer opened 5 years ago

TSchiefer commented 5 years ago

hier ein Vorschlag, wie der join umgesetzt werden könnte:

air = air_df_grouped.alias("air")
w = weather.alias("w")
air_weather_joined_by_date = air.join(w, air.date == w.CET, 'inner')

Die Methode ".join" für spark-dataframes ist hier beschrieben: http://www.learnbymarketing.com/1100/pyspark-joins-by-example/

Ich habe einen inner-join gewählt, weil es dann zwangsläufig nur Daten gibt, ab denen sowohl Wetterdaten als auch Luftqualitätsdaten vorhanden sind. Allerdings gibt es dann nur noch 5448 Rows, gezählt mit:

air_weather_joined_by_date.count() 
Eckeau commented 5 years ago

Macht ja Sinn, weil es nur für die Jahre 2001 - 2015 gemeinsame Daten gibt, also rund 15 Jahre.

Ich komme mit der Anfrage

res1 = sqlContext.sql("SELECT count(*) FROM weatherT, airT WHERE weatherT.CET = airT.date")

auf das gleiche Resultat. Wobei ich das Entfernen von Duplikaten beim Erstellen der air-Tabelle wieder wegnehmen werde, weil es sonst die Durchschnittswerte-Berechnung verfälscht.

Eckeau commented 5 years ago

Hallo zusammen. Eine neue Version des Notebooks liegt nun bereit, die einen Vergleich der Performance zwischen CSV und Parquet enthält (sehr eindrucksvoll: 2 min vs. 5 sec) und den Join.

Ich würde es dann gut sein lassen und Euch bitten, mit den joined Daten noch ein oder zwei hübsche Auswertungen zu fahren. Für die Performance kann man dann in die Präsentation noch den Execution Plan reinkopieren. Muss die Bilder noch zusammensuchen und speichern.

FischerAndi commented 5 years ago

Ich habe auch eine neue Notebook-Version hochgeladen. Habe versucht alle eure bisher gemachten Dinge nachzuvollziehen. Grafiken habe ich in die Präsentation einmal eingefügt. Die können wir auch noch verkleinern und auf eine Seite plazieren, oder auch einzelne weglassen / löschen.

Mir fallen jetzt dann gleich die Augen zu ;-) Das Bett ruft.

TSchiefer commented 5 years ago

In Commit 9b63f523bddc6c5377fc1e3c22d75fa3c1875a4a habe ich mal versucht, die zusammengeführten Daten zusammen in einen Plot zu bringen. Ich habe dafür die mittlere Temperatur, die gemittelten NO_2 und die PM_10-Daten gewählt und gegen die Zeit geplottet (siehe ganz unten im Notebook).

Um die Daten vergleichen zu können, habe ich sie normalisiert (jeweils minus Mittelwert und dann geteilt durch die Standardabweichung). Um dann noch was erkennen zu können, habe ich 3 (oder 5? weiss nicht mehr, welche Version die commitete ist) bei einer Zeitserie abgezogen bei der mittleren nichts gemacht, und bei der letzten 3 (oder 5) dazugezählt, damit man besser vergleihcen kann.

Das Problem ist, dass das Datum nicht mehr auf die x-Achse gemapped wird. Aber er ist schon so schlau, dass er automatisch das Datum ignoriert, obwohl es die erste Spalte im Panda-Dataframe ist.

TSchiefer commented 5 years ago

Ein weiteres, wahrscheinlich schwerwiegenderes Problem, ist, dass man eigentlich bei dem ganzen Gezappel kaum Entwicklungen vergleichen kann. Dies könnte man eventuell verbessern durch Monatsmittel. Ausserdem könnte man eine Korrelationsmatrix erstellen, sowohl auf Tagesbasis als auch auf Monatsbasis.

Ich würde aber vorschlagen, wie erwähnen das nur in der Präsi und machen das nicht mehr. Oder was meint Ihr?

FischerAndi commented 5 years ago

Ich denke auch, dass wir das nicht mehr machen sollten.

Ich bin momentan daran die Präsentation etwas weiter zu treiben. Für die Abgabe schlage ich den Samstag Abend vor und da sollten wir die Präsentation und das Notebook als ipynb und pdf einreichen. Einverstanden?

TSchiefer commented 5 years ago

Von mir aus gerne! Ich habe heute etwas Zeit und werde im Laufe des Tages mal durch unsere letzten Notebooks durchgehen und Euch dann mitteilen, was meiner Ansicht nach als interessante Ergebnisse in die Präsentation aufgenommen werden sollte. Eben sowas wie Bernd's Vergleich der Performance von Parquet und Dataframe.

Eckeau commented 5 years ago

Hallo zusammen. Ich habe mir heute auch einiges an Zeit reserviert, um das hier fertig zu stellen und um das Kleingedruckte (insb. Dani Aebi's 10'000 Seiten) zusammen zu stellen. Samstag Abend wäre auch mein Ziel. Jedenfalls nicht später. Die Daten müssen wir dann übrigens auch hochladen, das dürfen wir nicht vergessen. Da nehmen wir einfach die beiden originalen Zip-Files von Kaggle.

Eckeau commented 5 years ago

@TSchiefer Wie wäre es mit einer Korrelationsmatrix, z.B. um festzustellen, ob einer der Air-Werte sehr stark von der Temperatur abhängt. Man könnte auch eine Regression machen: Einzelner Air-Wert in Abhängigkeit zu den Wetterfaktoren.

Eckeau commented 5 years ago

Vorschlag: Ich könnte heute Abend die Notebooks zusammenführen, dass wir wieder eine saubere Version haben.

TSchiefer commented 5 years ago

Korrelationsmatrix ist in der Tat eine gute Idee, da wohl auch recht leicht machbar. (Pandas Dataframe Methode .corr() ) Was die Regression angeht: muss mal schauen, ob die Zeit reicht. Mir steht auch noch der Aebi-Marathon bevor...

Heute Abend Konsolidierung klingt super.

TSchiefer commented 5 years ago

Commit f4fc10df831e3255c1571a8b75e96cfded57f35d:

Das Bild habe ich dann mal gespeichert und im nächsten Commit 353e20f54ab208b474d0e82430e393e83d5d1256 hochgeladen, File: Korrelationsmatrix_MeanTemp_Schadstoffe.png

Kann man so vll. in die Präsentation integrieren? (Sollte man noch Legende einbauen? ich versuch's mal, wenn's einfach geht, mach ich's)

TSchiefer commented 5 years ago

Gerade noch einen kleinen Bug gesehen, PM_10 habe ich doppelt drin gehabt. In Commit: 5625d5cfba744ba66a9e5ccb80add4a4426ea307 behoben.

Äh ja, also zum Ergebnis: lediglich O_3 hat wie zu erwarten eine positive Korrelation mit T. Ansonsten hat noch PM_10 eine leicht positive Korrelation mit T und ansonsten haben alle Schadstoffe negative Korrelation mit T.

Jetzt eben nochmal was gemacht, Commit 21985fc89633908e64cd4805211a5653e55fbca3: jetzt gibt es eine Legende, keine wunderschöne (geht nur von ca. -0.6 bis 1.0 und ist auch etwas zu hoch), aber hilft schon bei der Interpretation des Bildchens.

TSchiefer commented 5 years ago

Nur zur Klarheit: in den letzten beiden Commits habe ich jeweils sowohl das Bild als auch das Notebook aktualisiert.

Jetzt mal wieder zurück ans Lernen...

Eckeau commented 5 years ago

Danke. Negativ ist ja auch gut solange es eine hohe Korrelation ist. Kämpfe auch mit Aebi's Materialschlacht. Mal sehen wer gewinnt...

FischerAndi commented 5 years ago

Sehr gut! Ich habe die Präsentation neu gemacht, umbenannt und ein anderes Layout gewählt, da die Kompatibilität von PowerPoint und LibreOffice nicht ganz sauber ist. Nach jedem neuen Start von PowerPoint waren einzelne Textfelder verschoben :-( Nun ist alles PowerPoint.

Fühlt Euch frei dort noch Ergänzungen zu machen und die neuen Sachen zu beschreiben.

Die Daten müssen wir übrigens nicht hochladen. Es muss nur eine Referenz vorhanden sein und die habe ich in der Präsentation eingefügt.

TSchiefer commented 5 years ago

Danke für die Arbeit, sieht schön aus!

Nur eine Frage zu Folie 5: was meinst Du denn mit dem Punkt "Format Zeitstempel anpassen"?

FischerAndi commented 5 years ago

Wir haben doch die Stunden und Minuten der Zeit (Zeitstempel) auf 0 gesetzt und dann den Durchschnitt genommen. Kann man auch weglassen. Ich wollte nur die Verwendung von AVG() erwähnen.

Falls ihr Ideen für bessere Folien habt, könnt ihr auch die schlechteste ersetzen, oder zwei zusammen legen. Wir dürfen einfach nur max. 10 haben.

TSchiefer commented 5 years ago

Ja gut, aber nachdem die Zeitstempel auf Mitternacht gesetzt worden waren, haben wir - zumindest in dem Notebook, das ich letztens immer verwendet habe - das Mitteln mit der Methode .agg() gemacht, mit Argumenten 'Gas':'mean'

air_df_grouped = air_df_new.groupBy('date').agg({'CO': 'mean', 'EBE': 'mean', 'NMHC': 'mean', 'TCH': 'mean', 'SO_2': 'mean', 'O_3': 'mean',
                                                'TOL': 'mean', 'BEN': 'mean', 'PM10': 'mean', 'NO_2': 'mean'})
FischerAndi commented 5 years ago

Wie wäre es, wenn wir den Punkt ändern und verallgemeinern zu: Anpassen der Daten agg()

TSchiefer commented 5 years ago

Das klingt m.E. gut. Wir sollten dann halt vielleciht bei der Präsentation ein wenig ins Detail gehen, würde ich sagen.

TSchiefer commented 5 years ago

Ich habe gerade im Big Data Skript noch eine Methode ( DF.describe() ; die gibt für alle numerischen Spalten Statistiken zurück: Anzahl Zeilen, mean(), sd(), min(), max() ) für Spark DataFrames gefunden, die ganz nett ist und vielleicht auch noch in unser Notebook rein kann:

temp_air_pollution_extended.describe().show()
Eckeau commented 5 years ago

Ich habe nun eine kombinierte Version des Notebooks hochgeladen, die alle Operationen aus Euren jeweils letzten Files enthalten sollte. Es liess sich auch alles ausführen. Nur bei den sehr lange laufenden Umwandlungen in Pandas Dataframes habe ich die Geduld verloren.

TSchiefer commented 5 years ago

Manche der Umwandlungen dauern wirklich ewig... aber, egal.

Bei mir passiert bei Kommando 45 (

from pyspark.sql import SQLContext
sqlCtx = SQLContext(sc)
air_df_enhanced = sqlCtx.createDataFrame(air_df_pd)

) was Komisches: Es zeigt an "Running command...", aber der Ladebalken kommt nicht, und es sieht so aus als ob es hier nicht weitergeht... Wenn es aber bei Euch funktioniert, ist's eventuell in Ordnung(?)

Eckeau commented 5 years ago

Habe ich nicht ausgeführt, weil ich nicht so lange auf die Pandas Umwandlung warten wollte. Wieso muss man in databricks überhaupt den SQLContext importieren? Ich dachte, der ist immer da.

TSchiefer commented 5 years ago

Wow... jetzt ist er gerade doch fertig geworden: 40.66 Minuten!! Also, ich nehm alles zurück, läuft wie geschmiert :)

Jup, mit dem SQLContext hast Du recht, man kann auch einfach ohne die ersten beiden Zeilen:

air_df_enhanced = SQLContext.createDataFrame(air_df_pd)

machen.

Eckeau commented 5 years ago

Habe folgenden Tipp gefunden, wie man die Pandas DF conversion beschleunigen kann: spark.conf.set("spark.sql.execution.arrow.enabled", "true")

Eckeau commented 5 years ago

@TSchiefer Mit dem Trick und gezieltem Caching konnte ich nun Deinen 15 Minuten Befehl in 19 Sekunden ausführen.

TSchiefer commented 5 years ago

Sollen wir das so wirklich lassen? Selbst mit der conversion-Beschleunigung muss ich sagen, ich bin ir nicht sicher, ob das so Sinn macht. Nach pandas konvertieren muss man doch eigentlich nur, wenn man was plotten mag. Und in dem Fall, sollte man sich doch auf diejenigen Spalten beschränken, die man auch wirklich anschauen will. Kam dieses Kommando aus einem meiner ersten Notebooks?

TSchiefer commented 5 years ago

nicht schlecht... ich frage mich aber, ob dieser Befehl vielleicht ursprünglich nur so lange gedauert hat, weil er "lazy evaluation" macht. Also vielleciht wurde das pandas-DataFrame erst in der Zeile erzeugt, wo es zum ersten mal gebraucht wurde...?

TSchiefer commented 5 years ago

Kommando 49 erzeugt übrigens einen Fehler, wenn das Parquet-File schon existiert. Das hast Du doch eigentlich in Deinem Notebook irgendwie umgangen, @Eckeau

Eckeau commented 5 years ago

Das ist schon so, diese Pandas Umwandlerei macht man nur wegen der Grafiken. Da sollte man immer erst einen Select auf die Daten machen, die es für die Grafik braucht. Weiss jetzt nicht mehr was aus welchem Notebook kam. Generell finde ich es schwierig im Notebook Format den Überblick zu behalten.

Eckeau commented 5 years ago

Ich gehe gerade nochmal das Notebook durch, ob alle Befehle durchlaufen. Komme demnächst zu Kommando 49...

Eckeau commented 5 years ago

Ich habe jetzt nochmal eine Version raufgeladen, in der bei mir alle Commands durchgelaufen sind. Am längsten hat Command 43 mit rund 5 Minuten gedauert. Alles andere geht recht flüssig.

Eckeau commented 5 years ago

Noch was am Rande: wieso sieht eigentlich der Plot für die "KM Visibility" so merkwürdig aus? Ist das ein Datenqualitätsproblem?

FischerAndi commented 5 years ago

Ich denke ja, wenn man die Rohdaten ansieht (Command 8). In Madrid ist die Sitcht meistens maximal gut. Und später haben sie scheinbar die maximale Sichtweite erhöht. Anderes Messverfahren?

FischerAndi commented 5 years ago

Sieht alles schon fast perfekt aus.

Soll ich im Notebook noch Titel und Textboxen hinzufügen? Was ist sonst noch zu tun? Ich denke, dass wir das Notebook noch im PDF-Format abgeben sollten. Was meint ihr?

Eckeau commented 5 years ago

Warte schnell. Ich lade gleich noch ein Notebook mit mehr Kommentaren hoch. Können wir das Notebook nicht im Rohformat hochladen? Evtl. will Kurt das mal laden und testen.

Eckeau commented 5 years ago

In der Präsentation habe ich auch noch eine kleine Ergänzung eingefügt. Kommt auch gleich.

Eckeau commented 5 years ago

So, jetzt ist beides hochgeladen.

Eckeau commented 5 years ago

@FischerAndi Titel im Notebook sind sicher eine gute Idee um es lesbarer zu machen.

TSchiefer commented 5 years ago

Ich habe noch einen Commit mit einem Notebook hochgeladen: f46c29712339129e97f114bef7d835ad37ce6409

Einzige Änderung zu "Madrid-Complete_2019_01_12.ipynb": Cmd 48 löscht erstmal das Parquet-File, bevor es erzeugt werden soll. Dann gibt es bei mir keine Fehlermeldung.

Ich habe das Notebook-File "Madrid-final_2019_01_12.ipynb" genannt, also anders als das von Bernd zusammengestellt.

Eckeau commented 5 years ago

Gute Punkt. Sonst muss man nichts mehr zusammenfügen, oder? Hast Du meine letzte Version mit den Komemtaren genommen, die ich vor gut einer halben Stunde hochgeladen habe?

TSchiefer commented 5 years ago

okay, jetzt ist die Präsi inklusive des Korrelationsmatrixplots und den Zeitserien von T, NO_2 und PM_10 hochgeladen, unter dem Namen " IE_BigData_FischerNovotnySchieferdecker_19_01_12.pptx "

im Commit: 9a2a22fb5e964ccc642fc777d5b06322d9ec90cd das Bild der Zeitserien habe ich im gleichen Commit auch hochgeladen

Eckeau commented 5 years ago

Sieht doch alles gut aus, oder was meint Ihr? Man könnte da sicher noch ewig weiter machen, aber die Prüfung wartet ja auch noch... Also aus meiner Sicht kann man das in dem Zustand hochladen.

TSchiefer commented 5 years ago

oh-oh... das ist genau die Gefahr, wenn alle an einem File arbeiten... :( jetzt habe ich die Zeile in dem richtigen, aktuellsten Notebook von Dir Bernd eingefügt.

...und in der Zwischenzeit arbeitet wahrscheinlich Andi daran, die Titel ins Notebook einzufügen, wo dann die Zeile auch wieder fehlt... In dem Fall könnte man aber die Zeile einfach noch dazutun. Ist nur die mittlere Zeile in:

# Ausgabe der neuen Tabelle in Parquet-File; erst löschen des Files, falls vorhanden:
dbutils.fs.rm("/FileStore/tables/Madrid/madrid_2001-2018_time_gas_concentration.parquet", True)
time_gas_con.write.parquet("/FileStore/tables/Madrid/madrid_2001-2018_time_gas_concentration.parquet")
TSchiefer commented 5 years ago

(ach so, Commit ist: 1a05d1a639406ea88b5095e057090d7d213f2330)

FischerAndi commented 5 years ago

Ich bin noch nicht dran :-)

Eckeau commented 5 years ago

Die eine Zeile würde jetzt auch nicht das ganze Werk zerstören ;-)