SQL-Joins bzw. Python pandas Objektvereinigungen

A bzw. B:

  •  in SQL eine Menge an Werten, die aus der Abfrage über eine Spalte einer Tabelle entstehen
  • in pandas ein pandas.Series-Objekt (eindimensionales ndarray mit Achsen-Namen), das ggf. aus der Abfrage eines pandas.DataFrame (zweidimensionale, größenveränderliche, möglicherweise verschieden typisierte Tabellendaten) resultiert
  • für Python pandas gilt: „left“ = 1st Dataframe; „right“ = 2nd Dataframe

Alle Werte der Menge A

SQL:
SELECT * FROM A LEFT JOIN B ON A.Key = B.Key
Python pandas:
A.join(B, on=[‘A.Key‘], rsuffix=‘_B‘)

Alle Werte, die nur in der Menge A sind

SQL:
SELECT * FROM A LEFT JOIN B ON A.Key = B.Key WHERE B.Key IS NULL
Python pandas:
A[~A[‘A.Key‘].isin(B[‘B.Key‘])

Alle Werte, die in Menge A und gleichzeitig in Menge B sind

SQL:
SELECT * FROM A INNER JOIN B ON A.Key = B.Key
Python pandas:
A.join(B, on=[‘A.Key‘], how=‘inner‘)

Alle Werte, die entweder in Menge A oder in Menge B sind

SQL:
SELECT * FROM A FULL OUTER JOIN B ON A.Key = B.Key WHERE A.Key IS NULL OR B.Key IS NULL
Python pandas:
pd.concat([A, B].loc[lambda df: ~df.index.duplicated()]

Alle Werte aus Menge A und B

SQL:
SELECT * FROM A FULL OUTER JOIN B ON A.Key = B.Key
Python pandas:
pd.merge(A, B, how=‘outer‘, on=[‘A.Key‘,‘B.Key‘], validate=“one_to_one“, indicator=True)

Weitere Varianten und komplexere Vereinigungen in der pandas-Dokumentation.

Download SQL-pandas-Cheatsheet

Deep Thought

Die Antwort „42“ auf die Frage nach dem Sinn des Lebens, dem Universum und dem ganzen Rest ist bekannt. Zaphod Beeblebrox und seine Begleiter, darunter ein depressiver, suizidaler Roboter versuchen, gejagt von einem der unausstehlichsten Völker des Universums, den Vogonen, mithilfe des Unendlichen-Unwahrscheinlichkeitsantrieb und gemeinsam mit uns die eigentliche Frage auf diese Antwort zu entdecken.

Einen unserer Empfindung nach nicht unerheblichen Beitrag, Dem Deutschen Volke zu helfen, aus dem Bann der Überregulierung, falscher Methodik, überkommener Hetz-Proklamationen à la AFD, dem Untergang der Erde sowie den Vogonen zu entkommen, leistet folgender Beitrag:

Ein Vortrag keinesfalls nur für Programmierer, von  „Pragmatic“ Dave Thomas, einem „alten Hasen“, der uns empfiehlt, nicht jedem Quacksalber – auch ihm nicht – auf den Leim zu gehen, aus dem Quark zu kommen, die Cojones auszupacken, Courage zu zeigen. KEINE PANIK!

„It takes guts“ – gute, deutsche Handwerkskunst, Eigeninitiative und ein seit Jahrmillionen in der Evolution genau so wie in modernen Steuerungen praktiziertes Vorgehen anhand eines „proportional-integral-derivative controllers“. Leider ist sogar die Deutung im deutschen Teil des Wikipedia-Universums mit der einzigen Definition des PID-Reglers nur eine ziemlich beschränkte Sicht auf die umfassendere, englische Definition und auch die Suche nach „Kontrollschleife“ fördert nichts zu Tage.

Mehr Klarheit zur praktischen Anwendung nicht nur in großen Schiffen und kleinen, selbstausbalancierenden Robotern, sondern im Rahmen alltäglicher Progresskontrolle im Privat- und Berufsleben bringt die Definition zum „agile life“ im hier verlinkten Video:

Agility – what to do

  • Find out where you are
  • Take a small step towards your goal
  • Adjust your understanding based on what you learned
  • Repeat

und falls sich auf diesem einfachen Weg Alternativen ergeben:

Agility – how to do it

  • When faced with two of more alternatives that deliver roughly the same value, take the path that makes future change easier

Das Preussische, Vogonische hat uns auf Platz 17 der leistungsfähigsten Digitalökonomien (IMD World Competitiveness Ranking 2019) verbannt. Irgendwann mag jeder, vom kleinen Angestellten bis hin zu den Gelähmten der jeweiligen Regierung, sich denken, dass auch die Deutschen dazu lernen sollten und schon lange nicht mehr mit dem Finger auf andere zeigen brauchen.

Hier die ersten zehn Länder des Rankings, an denen wir uns ein Beispiel nehmen könnten:

  1. USA
  2. Singapur
  3. Schweden
  4. Dänemark
  5. Schweiz
  6. Niederlande
  7. Finnland
  8. Hongkong
  9. Norwegen
  10. Südkorea

Diese Rankings können laut einem Artikel im Wirtschaftsteil der „Welt“ „durchaus als Weckruf verstanden werden“. Natürlich nimmt ein agiler Deutscher wie ich solche Schweizer Rankingtabellen nicht ernst – zumal die schönsten Länder auf unserer Erde meiner Ansicht nach viel zu weit hinten vertreten sind: die Möglichkeit, Schönheit im eigenen Leben verwirklichen zu können, stellt doch wohl die größte „competitiveness“ [Wettbewerbsstärke, Konkurrenzfähigkeit] dar.

Und schon sind wir wieder bei der Agilität: das bedeutet dem Vortrag von Pragmatic Dave zufolge vor allem auch, sich nicht von Experten einschüchtern zu lassen – sie kennen weder Deinen oder meinen individuellen Platz, noch den vorherrschenden Kontext, noch die individuelle Erfahrung, noch den nächsten richtigen Schritt auf Deinem oder meinem Weg. Wir haben nicht nur in unserem Leben auf dem Lande bereits einige Menschen kennen lernen dürfen, die weder den Begriff Agilität kennen, noch mit Software-Programmierung zu tun haben und uns mit der Weisheit ihres „höheren Alters“ ganz ähnlich klingende Tipps gegeben haben. Mitunter ist auch die deutsche Geschichte mitsamt Altersvorsorge und Leistungsprinzip kein Kontinuum, wie wir es gerne eingeredet bekommen. Wie stets kommt der deutsche Kant und seine Imperative zum Tragen!

Some people think they are important. Don’t let them tell you what to do.

Thank you Pragmatic Dave – you made my day twice!

Hier noch die zugehörige Vortrags-Präsentation von der GOTO 2015.

Observable Anxiety

Ein passender Titel für den Vortrag auf der NG-CONF 2018 von Ward Bell & Sander Ellis zum Thema „Angular APIs with RxJS“:

.pipe your Observables!

Angular APIs using RxJS: HttpClient, AsyncPipe, Forms, Router:

  • .get() with .subscribe() in your service, .pipe() the Observable and map() it there to the object you want to consume in your components, then use the service in your components
  • .post() with .subscribe(), including error-handling
  • or get the data with using async in your template and error handling (catchError()) in the component
  • with Angular reactive forms APIs valueChanges-Observable, .pipe() with tap() for error message, and three functions to reduce http-requests: debounceTime(), disctinctUntilChanged() and switchMap() for discarding an inflight-search, .pipe()‚d again to sandbox the errors inside the switchMap() so that examining the Observable does not complete, e.g. for auto-completion (use reactive style instead of Angular template-driven forms)
  • error isolation (explicit example) for sandboxing errors in an isolation level with the help of another .pipe() to map() and catchError() inside the .pipe() to switchMap(). RxJS rule: if an error occurs, the upstream is dead.
  • ActivatedRoute used with Observable paramMap.pipe(), Router events and url address path change while navigating on the same component with changing routerParams, map() and then switchMap(), again to cancel previous queries. Including watching the routing for debugging (altenrnative .subscribe()-style!)
  • Recommended way if subscribing to an Observable: .unsubscribe() from the source, a Subject, with Observable.onDestroy.next() in life cycle event hook ngOnDestroy() with the aid of Observable.pipe() to takeUntil() emitting the Subject in the Observable.pipe() to complete the Observable which prevents memory leaks. .unsubscribe() when in doubt with takeUntil(notifier) pattern. It never hurts to .unsubscribe()!
  •  .subscribe() takes: 1.) the happy (or: the next channel), 2.) the sad (or: the error channel) and 3.) alert things when the Observable completes (which means the Observable terminates and let go of any subscribers)
  • async autosubscribes when the Component is destroyed, but emits no „completed“: savely use AsyncPipe in the components template!
  • combine multistreams: bring multiple streams from Observers and Subjects together with combineLatest() .pipe()‘d to map() for mapping them into an immutable array of immutable objects
  • role your own Observables which have .next(), .error() and .complete(), from properties („rolling http of local storage“) in the component
  • create a new result array when any source emits an Observable array with .pipe()‚ing the Observable to scan(), which accumulates all incoming Observables into an array starting empty with startWith( [] ). combineLatest() takes the latest value of every Observable it gets
  • sort values in an additional map()
  • (not in movie) filter() the .pipe()‚d Observable to filter out unwanted values

Observable Decision Graph:
https://xgrommx.github.io/rx-book/content/which_operator_do_i_use

Source fork (Angular 7 / Node 10 commit):
https://github.com/Mesqualito/rxjs-in-ng-angular_berlin

Python3 pandas-Bibliothek

Wirklich fein.

DIE WELT HÄNGT AN EINEM KOMMA.

Und nicht vergessen: „Truth value of a Series is ambiguous.
„The or and and python statements require truth-values. For pandas these are considered ambiguous so you should use „bitwise“ | (or) or & (and) operations:
These are overloaded for these kind of datastructures to yield the element-wise or (or and).“

Da braucht es Ruhe. Schöne Ruhe. Hacking music Ruhe.

Angular 9 switchMap

Observable bedeutet zu deutsch: „Beobachtbares“

Die Funktion: mit switchMap kann zum Observable geschalten werden, welches sich zuletzt geändert hat („switch to a new observable“).

Der switchMap-Operator aus der RxJS-Bibliothek bildet jedes Element auf ein Observable ab. Er ordnet alle empfangenen Observables auf einer Ebene ein. Der switchMap-Operator projiziert jeden Wert aus der Quelle in ein Observable und führt dieses in einem Ziel-Observable zusammen, welches vom switchMap-Operator schließlich ausgegeben wird. Im Ziel-Observable finden sich immer nur die Werte, die vom zuletzt von der Quelle abgegebenen Observable empfangen wurden.

Die Syntax des switchMap-Operators

switchMap<T, R, O extends ObservableInput>(project: (value: T, index: number) => O, resultSelector?: (outerValue: T, innerValue: ObservedValueOf, outerIndex: number, innerIndex: number) => R): OperatorFunction<T, ObservedValueOf | R>

Der Parameter project in der Syntax ist eine Funktion, die ein Observable zurück gibt, sobald sie auf ein Element angewandt wird, das von einem Quell-Observable ausgegeben wurde.
Der Parameter resultSelector ist optionell und der Standardwert dieses Parameters ist nicht definiert. Der Rückgabewert, „OperatorFunction<T, ObservedValueOf | R>“, ist ein Observable, welches das Ergebnis liefert, das aus der Anwendung der projection-Funktion (und dem optionalen, veralteten [„deprecated“] resultSelector) auf jedes Element, welches aus dem Quell-Observable übergeben wird, resultiert, wobei nur die Werte des zuletzt proijezierten, inneren Observables verwendet werden.

Den switchMap-Operator in Angular anwenden

Der switchMap-Operator liefert ein Observable zurück, das Elemente ausgibt, auf welche eine Funktion, die dem Operator als Parameter mitgeliefert wird, angewandt wird. Dabei wird die Funktion auf jedes Element, das vom Quell-Observable kommt, angewandt. Diese Funktion gibt bei jeder Anwendung intern im switchMap-Operator ein inneres Observable zurück. Jedes Mal wenn eines dieser inneren Observable in Betracht gezogen wird, beginnt das von der switchMap zurückgelieferte Observable, die Elemente dieses inneren Observables  auszugeben.

Wenn ein neues, inneres Observable verarbeitet wird, beendet switchMap die Ausgabe der Elemente des vorher ausgelieferten, inneren Observable und beginnt, die Elemente des neuen, inneren Observable zurück zu liefern. Dieser switchMap-Prozess setzt sich kontinuierlich für jedes folgende, innere Observable fort.

switchMap-Einsatz beim Angular Routing

Der switchMap-Operator kann mit Angulars Activated Route verwendet werden.

Als erstes müssen Router, ActivatedRoute und ParamMap Wertmarken [„token“] aus dem router-Paket importiert werden. Anschließend muss der switchMap-Operator importiert werden, der dazu verwendet wird, die beobachtbaren [„observable“] route-Parameter abzuarbeiten. Wie gewöhnlich schreiben wir einen constructor, der Angular anfragt, services einzuspeisen, welche die Komponente benötigt, und diese mithilfe privater Variablen zu referenzieren.

In der ngOnInit-Methode verwenden wir den ActivatedRoute service, um die Parameter für das route-Objekt abzurufen, den employee ID aus den Parametern heraus zu ziehen und den employee zu extrahieren, den wir anzeigen wollen. Die Abarbeitung der paramMap ist etwas knifflig. Wenn die map sich ändert, bekommen [„get()“] wir die ID Parameter von den geänderten Parametern. Man könnte denken, jetzt wäre die Gelegenheit die RxJS map zu verwenden, der EmployeeService Operator liefert jedoch ein Observable zurück. Deswegen ebnen wir stattdessen das Observable mit dem switchMap-Operator ein. Zusätzlich verwirft der switchMap-Operator vorhergehende, „fliegende“ Anfragen. Wenn der Benutzer mit einer neuen ID zur gleichen Route zurück kehrt während der EmployeeService noch eine alte ID verarbeitet, verwirft switchMap die alte Anfrage und liefert den employee für die neue ID zurück.

Teilweise Übersetzung des Artikels von Yallaling Goudar. Code-Beispiele und weitere Ausführungen dort.

Ebenso ein nützlicher Link: switchMap auf Learn RxJS.

Daten essen Seele auf

Bereits verlinkt: Daten essen Seele auf, ein Artikel von Manfred Broy und Richard David Precht, erschienen am 26.01.2017 in der Zeit. Gedanken eines Informatikers und eines Philosophen zur Digitalisierung und zur vierten industriellen Revolution. Es gibt nichts Neues unter der Sonne (Prediger 1:9, Einheitsübersetzung der Bibel).

Buchtitel von Wir wollen nur Deine Seele - Bäumer

Und doch gibt es das Ringen der Guten gegen die Dummheit der ewig Gestrigen. 1992 wurde uns in der evangelischen Jugend ein Buch ans Herz gelegt: Wir wollen nur deine Seele. Rockszene und Okkultismus: Daten – Fakten – Hintergründe von Ulrich Bäumer, 1992, ISBN: 9783893971039. Hier wird gewarnt vor dem Teufel, verewigt auf den Schallplatten von den Eagles, Rolling Stones, AC/DC und vielen anderen (zur Info: der Buchtitel wurde sieben Jahre später als Titel der eigenen Platte von der Deutschrockband „Die Ärzte“ annektiert). Kaum dreht man manch schwarzes Vinyl rückwärts, spricht er, der Fürst der Finsternis, und hörst Du diese Worte und schüttelst Deinen Kopf dazu, schon ist sie weg, Deine Seele.

Jene gerüchteweise unsterbliche Seele, die nicht nur die servi unter den Plebejern den patrizischen Blaublütern schuldeten, diesen endemischen, adeligen, nach Abstammungsprinzip und oder und und oder Geburtsortprinzip genetisierten Vertretern der Gattung Homo patrioniciensis nationalitis.

Und diese Andersblutigen ihrerseits versuchten ihren unentdeckten substanzlosen Teil mithilfe der Priester an die sakrale Sphäre anzudocken.

So war das damals, vor dem Krieg. Und jetzt, jetzt dockt sich jeder selbst, mit Bluetooth und iPad, Bio-Hacking, Smarthome und einem Fahrzeug, das oftmals intelligenter ist als der jeweilige Betreiber, zumals kontradiktorisch ein Produkt äußerster Dummheit – die Kartoffeln der dümmsten Bauern haben zur Neuzeit nunmal Räder.

Jetzt sind es der CCC, der heise-Medienverlag, die Konferenz der unabhängigen Datenschutzbehörden des Bundes und der Länder (DSK), das BSI und die Tagesschau, die zurecht vor dem echten und einzigen Beelzebub warnen, dem Herren der Fliegen, dem Ba’al der Unterwelt und seinen Schergen Microsoft, facebook,  Alphabet (Google), Amazon, Intel, Apple, Lenovo (Legend Holdings), IBM, HP und Cisco.

Der Staat wurde überwunden, und mit ihm die Regierer und die Regierten, Gläubiger und Gläubigen und gleich auch das durch die Geschichte der Menschheit hinduch andauernde, kindliche, ja kindische Bedürfnis der um die Seele herum gebauten restlichen, sterblichen Teile, sich Platz zum Überleben, zum erfüllten Leben, zur Entfaltung individueller Persönlichkeit und zum würdevollen Tod zu erstreiten.

Es ist erst der Anfang der vierten industriellen Revolution: im Jahr 2019 besaßen immer noch 0,9 Prozent der Weltbevölkerung 43,9 Prozent des weltweiten Vermögen und 56,6 Prozent der Weltbevölkerung besaßen immer noch 1,8 Prozent. So wie die Tech-Industrie die KfZ-Industrie verdrängt und weitere verdrängen wird, die ihr Jahrhundert der Seelenfängerei ausgelebt haben, so werden in der von vorneherein globalen, länder- und personenunabhängigen Tech-Industrie ganz wenige Fürstendämonen-Prinzipale alle anderen vom Seelenmarkt schubsen. Und die Kasparseelen, die ihre Suppe nicht essen, sollen verhungern; die Bandbreite ist schmal, die zum Leben führt und wenige sind ihrer, die ihn finden (nach Matthäus 7:13 in der Übersetzung der Lutherbibel von 1912). Bemerkenswert, dass der Fortschritt vor nichts halt macht, nicht einmal vor dem Stillstand („Dieser Satz ist falsch“).

Also: Smartphone auf der Arbeit liegen lassen, ein Stupidphone von früher mit sich rumtragen, bestenfalls abgeschalten. Kein Auto fahren, wenn es sich vermeiden lässt und schon gar keinen Schwanzvergleich damit anzustellen versuchen. Facebook abmelden, WhatsApp deinstallieren, sich mit den Dienstleistungen beschäftigen, die man in Anspruch nimmt (z.B. Solid vom Internet-Begründer Tim Berners-Lee, WT.Social statt die Trump’n’Dumb-Dump-Plattform Twitter), nicht einfach drauflos installieren wie ein Süchtiger, der sich jedes lumpige Zeug in den Arm spritzt. Da wären wir auch gleich bei den Suchtmaschinen; die brauchen ja alle Strom wie ein paar übereinander gestapelte Aluminium-Fabriken. Die sollten wir nutzen wie die 16 Bände der Brockhaus Enzyklopädie aus Großvaters heiliger Glasvitrine – also nicht zu jedem Scheiß angrapschen, weil man zu faul ist, den eigenen Denkapparat zu trainieren – und wenn dann duckduckgo.com und andere, nicht google oder Bing!

Und natürlich immer wieder: Linux statt Microsoft! Schon allein deswegen, um nicht unweigerlich gegen geltendes deutsches Recht (DSGVO) oder beim nächsten Snapshot gegen Lizenzrecht zu verstoßen. Als Browser Firefox statt Chrome oder Edge. Vernünftige, rock-solid eMail- und Webserver-Dienste sind eh alle Open-Source, ob lokal oder auf dem öffentlichen Server.

Auch gut ist, beide Seiten zu kennen: die des Produzenten, also des Systemintegratoren, -administratoren, DevOps’ers, Programmierers, Mediengestalters etc. und die des „erwachsenen“ Konsumenten. Ein schönes Beispiel, wie falsch der Begriff „erwachsen“ ständig angewandt wird – die allermeisten, die auf Erden rumstolpern und sich erwachsen wähnen, sollten endlich auf ihre Kinder oder die Kinder der Nachbarn hören, um die Wahrheit zu erkennen – wir sind alles Lehrlinge und mit dem Ende der Lehrzeit geht’s in die Kiste (sagte u.a. Carlos Castaneda in wortgewaltiger Seelenreise).

Es hilft Euch nichts, wenn das ein paar intelligente Techies tun (und ja, wir tun das). Wir finden das gut: „Be excellent to each other„! Doch selbst regieren Deine Seele Du musst, Ablasszahlungen an Seelenfänger werden keine Macht Dir geben. Sonst heißt es für Dich:

Das vierte Reich komme, ein Wille geschehe.

Fett!

19. deutschen Bundestag 2020709 Sitze im 19. deutschen Bundestag (Stand: Januar 2020).
Im Vergleich dazu der erste deutsche Bundestag vom 7. September 1949 mit 402 Sitzen:

1. Bundestag 1949Desweiteren der elfte deutsche Bundestag vom 25. Januar 1987 mit 519 Sitzen:

11. Deutscher Bundestag 1987Und der zwölfte und zeitgleich erste gesamtdeutsche Bundestag vom 2. Dezember 1990 mit 662 Sitzen:

12. Deutscher Bundestag 1990Der nächste Bundestag wird voraussichtlich aus über 800 Sitzen bestehen.

In Wikipedia findet sich neben den hier abgebildeten letzten drei Graphiken ebenso der Satz: Der Bundesstaat Deutschland „besteht seit 1990 aus 16 Ländern und ist als freiheitlich-demokratischer und sozialer Rechtsstaat verfasst.“
Die Länderväter, Ländermütter, Ländersöhne und Ländertöchter wurden zu Vereinigung und Abgrenzung bestimmt und getrieben – „Das Volk steht auf, der Sturm bricht los“ Karl Theodor Körner (1791-1813), im Jahre 1813.

Im Bundeswahlgesetz (BWahlG) ist die gesetzliche Anzahl der das ganze Volk vertretenden Mitglieder mit 598 Parlamentariern angegeben.

Es werden mehr, doch die Ränge unserer Vertreter sind oft leer. Die Damen und Herren haben alle Koffer voll zu tun in den Hinterzimmern der Auto- und Energie-Industrie, der Pharma-Lobby, beim Vorstandsposten-Poker und Berater-Honorar-Roulette.

Eine weitere Vergleichstabelle zu den Sitzen zeigt uns ähnliche Zahlen (in  der zweiten Zeile die Bundestagswahlergebnisse in Prozent):

Union B90/Die Grünen Linke SPD FDP Rechte
1949 139+5 15 131+9 52+5 17
23,58 % 4,36 % 22,22 % 9,07 % 3,01 %
1987 223+11 42+2 186+7 46+2
36,98 % 6,90 % 30,94 % 7,59 %
1990 319 8 17 239 79
33,69 % 3,88 % 1,87 % 25,72 % 8,48 %
2017 246 67 69 153 80 94
24,83 % 6,74 % 6,97 % 15,47 % 8,10 % 9,53 %

Sitze, so völlig losgelöst von den Stimmen des Volkes?
Ist das nicht ein ziemlich schräges Bild von Volksvertretung?

So viele Schafe.

Mittelstand, quo vadis? Du Bürger zweiter Klasse mit dem größten nationalen Einkammer-Parlament der Welt, Du wirst wie stets eingeseift, bestimmt und getrieben.

Lass‘ Dich nicht länger einwickeln in dumpfe Angst und dumme Angewohnheiten.
Sapere aude – gedenke Deines Kants. Nutze Deinen Einstein!