Alles so schön bunt

Vorgestern habe ich beschrieben, dass ich meine Oandaschnittstelle ausprobiert habe. Das Ergebnis sieht so aus.

Jetzt muss ich mir überlegen, wo ich weiter mach.

  • Tauch ich tiefer in die Welt der Algorithmen ein, versuche vielleicht ein lernendes Algorithmus zu bauen? oder
  • Bau ich erst mal eine Schnittstelle zwischen Oanda und ein genereller Algorithmus, damit ich Order algorithmisch verwalten kann?

Bald soll sich das auch in Bares umsetzen 🙂

Zurück an die Arbeit

Ich habe eine erste Anwendung für meine Oanda-Schnittstelle geschrieben: ich habe das Technical Analysis Konzept aus Python for Finance (Kapitel 3, Seite 68ff.) auf Oanda Kurven angewendet. Wer Interesse an dem Jupyter Notebook hat möge sich melden.

Oanda Python interface 2

Diese Woche hatte ich angefangen, eine vereinfachte Schnittstelle für die oanda v20 API zu erstellen. Jetzt bin ich so weit, dass ich die ohne Tests entwickelte Funktionalität übersetzt habe und die erste Funktionalität test-driven entwickelt habe. Halbherzig.

  • Ich habe implizit einen GIT Crashkurs absolviert. (Ich bin noch von der CVS und SVN Generation.)
  • Ich bin noch nicht ganz fertig mit dem Thema Mocks / Stubs. Auch da fehlt mir noch ein wenig Disziplin, mich weiter zu vertiefen. Ich implementiere fleißig Stubs, aber irgendwo bin ich mir nicht mehr sicher, ob ich jetzt meine Stubs oder mein Code teste.
  • Ich habe jetzt Orderfunktionalität eingebaut. (Order canceln und einen Market Order einstellen.)
  • Ich werde die Order-Funktionalität noch was vertiefen und dann anfangen, die Schnittstelle zu verwenden. Wahrscheinlich werde ich die Orderfunktionalität aus der OandaAccount-Klasse hinaus refactoren (O Welch Ein Satz).
  • Die Kommentardisziplin lässt auch nach. Ich brauch einen Code Review!!

Oanda Python interface

Ich spiele gerade mit der Oanda V20 Schnittstelle.Ich will die Oanda-Informationen verwenden, um mit dem Buch Python for Finance üben zu können.

Die Schnittstelle von Oanda ist mir zu technisch, also schreibe ich gerade eine vereinfachte Schnittstelle. Das ist dann auch eine schöne Übung für Test Driven Development (beim ersten Anlauf wieder glatt vergessen). Auf GIT liegt also mein neues Projekt.

Dazu musste ich jetzt auch die Paketverwaltung von Python verstehen. Die Stubs stehen jetzt, OandaSession und OandaAccount. Die Logik hatte ich zum Teil schon testfrei ausgetüfftelt (Asche auf mein Haupt) und werde ich langsam testend überführen.

 

Where Have All the Singletons Gone?

Schöne Serie von Artikel über die Verwendung von Singletons. Fast 10 Jahre alt, aber ich habe die Diskussionen nicht so verfolgt. Jetzt dachte ich aber einen Singleton zu brauchen 🙂

Quelle: Singletons are Pathological Liars

Quelle: Where Have All the Singletons Gone?

Quelle: Root Cause of Singletons

Thoughtful Machine Learning with Python

Mir gefällt das Buch ist ‚Thoughtful Machine Learning with Python‚ immer mehr.

Wie beschrieben, ist es das erste Buch, dass ich zu Python und Data Science in Händen kriege, dass auch Unittests behandelt.

Aber auch die Machine Learning Inhalte werden sehr sorgfältig behandelt. Das erste inhaltliche Kapitel (3) zu KNearestNeigbors habe ich jetzt ein mal gelesen und ein mal durchgearbeitet. Ich weiß immer noch nicht genau, was ein KDTree macht, aber weiter habe ich wohl noch Neues gelernt. Das folgende Kapitel (4) arbeite ich jetzt durch.

Die Codebeispiele im Repository für Kapitel 3 sind Python3-kompatibel, im Buch nicht ganz. Für Kapitel 4 muss man auch noch ein kleines Bisschen am Code aus dem Repository schrauben. Aber, hey, dafür testet man doch! Das sind dann die Übungen für die Streber 🙂

TDD und Data Science

Nachdem ich jetzt einige Python Data Science Bücher [u.A. 1, 2, 3, 4] und alle DataCamp Python Kurse durchgearbeitet habe, habe ich mich gefragt, warum immer nur in hack-style gearbeitet und das sogar als Heldentat verbucht wird. Also habe ich gesucht.

Und ich habe was gefunden! Es gibt ein Buch, dass sich mit Python, TDD und Machine Learning beschäftigt. Schön dünn ist es eine Einführung in Machine Learning unter Anwendung von Tests. Unit Tests in Test First Approach, neben den öfters angewendeten Cross Validations und visuellen Tests.

Das Buch ist ‚Thoughtful Machine Learning with Python‚, von Matthew Kirk. (Es gibt eine Rezension, die besagt, dass der Code nicht mit Python 3 funktioniert. Wie immer: man hat ein eigenes Hirn dabei, man kann es auch benutzen.)

Jetzt brauch ich ’nur‘ noch Disziplin, um wirklich Test First zu arbeiten, weil hack-style mir nicht fremd ist.

‚Schlechtes‘ Buch das mich sehr genutzt hat.

Diese Amazon-Rezension zu ‚Spark for Python Developers‚ habe ich erst gelesen, als ich das Buch schon bestellt habe. Die Rezension ist trotz drei Sterne abschreckend, trifft völlig zu oder ist eher noch untertrieben und trotzdem fand ich das Buch extrem nützlich. Ich liebe es, so zu sagen :-), gerade in seiner Unvollkommenheit.

Das Fazit zuerst: wer gerne nach Rezept kocht, wird dieses Buch nicht mögen. Wer improvisiertes Kochen aus eine gut gefüllte Vorratskammer schätzt, wird seien Freude haben.

Die einzelne Kritikpunkte von Rezensent TDL:

First, the code as presented (at least in the ebook) is in serious need of formatting

Nicht nur im eBook, kann ich ergänzen. Auch im Buch. Und auch in den ‚Quelltexten‘, die von der Webseite verfügbar sind. Es heißt zwar ‚Quelltext‘, ist aber eine Kopie vom IPython notebook, inklusive Ausgaben, Nummerierung, Zwischentexte etc, dazu noch durcheinander nummeriert. Das bedeutet, das Copy and Paste nicht funktioniert. Das ist blöd,aber da ich faul bin, hat es den Lerneffekt zienlich erhöht.

Second, it is not clear that this book was well edited.

Ich würde sagen, dass es klar ist, dass der Lektor geschlafen hat. Oder aber gar nicht eingeschaltet wurde, um das Buch schnell am Markt zu kriegen.

Why isn't the code available online? Github & Bitbucket both have free public repos.

Die Frage habe ich eigentlich schon beantwortet: es gibt keinen Code, beim Autor gab es nur ein Notebook. Und das ist verfügbar beim Verlag. Und vielleicht ist es Verlagspolitik.

Andere Rezensenten hatten andere Probleme:

The author skims over important details in setting up the environments he describes

oder auch

dreadfully confusing

Man muss sich schon selber auf den Weg machen, die Onlinehilfen zu Hilfe rufen, vielleicht StackOverflow. Aber es lohnt sich. (Es hat sich für mich gelohnt.)

Very little of the first few chapters actually deal with Spark, except for some brief examples that are not explained in detail.

Es gibt eine Riesenlatte an Tools, die in den ersten Kapitteln installiert werden. Alle drei bis vier Seiten eine neue Installation. Da bleibt wenig Platz für Spark. Wer nur etwas zu Spark/ Pyspark wissen will, sollte sich ein anderes Buch suchen. Für mich war es ausgesprochen nützlich, Spark in seinem Kontext kennen zu lernen, überlegungen zu der Wahl zwischen MongoDB und Cassandra mitzukriegen, mit Kafka zu spielen.

Wichtig ist noch, dass das Buch auf Python 2.7 aufsetzt (meistens).

Inherentes Apache Spark Problem

Ich versuche gerade ein interessantes Problem zu lösen. Hier und hier habe ich beschrieben, wie ich den Performance von Spark und Pandas vergleichen will auf die Daten vom Kaggle Quora Wettbewerb.

Dabei stoße ich auf ein interessantes Phänomen. Solange der Zugriff zeilenweise stattfindet, ist Spark OK. Jetzt will ich aber das Maximum einer Spalte berechnen. Das geht erstaunlich schlecht. Ich vermute, dass das mit der verteilte Struktur von Spark zu tun hat, würde es aber gerne verstehen wollen.

Meine Frage nach dem ‚Warum‘ auf Stack Overflow wurde beantwortet mit ‚benutze Spark nur, wenn es absolut notwendig ist, nimm ansonsten Pandas‘. Obwohl das auch meine Schlussfolgerung ist, ist es keine Antwort.

Es gibt verschiedene Arten, das Maximum zu suchen. Alle brauchen mehr als 20 Minuten. Wenn Du diesen Code siehst, verstehst Du, wie merkwürdig das ist.

df.createOrReplaceTempView("kaggle")
biggest = spark.sql("SELECT MAX(levenshtein) FROM kaggle")
biggest.collect()

Das Maximum aus 400.000 Einträgen zu suchen, dauert bei einem Datenbankzugriff keine Sekunde. Und hier 25 Minuten. Es gibt noch mehr Lösungen auf StackOverflow und bei Databricks. Alles Banane. Irgendwann wird die Antwort kommen.

[Edit: 2. Mai] Das Problem saß mal wieder vor dem Bildschirm. Aber schon seit Tage 😦

Es eht um ein inherentes Apache Spark Feature: Lazy Evaluation. Ich habe das Ausmaß des Laziness unterschätzt. Ich hatte gedacht, dass ich die Berechnung der levenshtein-Spalte schon erzwungen hatte, aber dem war nicht so. Also werden jetzt alle Werte berechnet, bevor das MAX geholt werden kann. Also

  1. Dauert die Berechnung des Maximums nicht so lange und
  2. War meine Freude, dass die zeilenweise Berechnungen so flott durchliefen, nicht so angebracht. Die liefen schön flott noch nicht durch.

Inzwischen habe ich aber die Accumulator und AccumulatorParam Klassen kennengelernt, dass ist auch was schönes 🙂

[Edit2: 2. Mai] Trotzdem sollte man den Accumulator benutzen. Ansonsten wird die ganze Berechnung noch mal wiederholt, wenn man den Codeblock oben aufruft.

# create the accumulator to capture the maximum levnshtein
from pyspark.accumulators import AccumulatorParam

class MaxAccumulatorParam(AccumulatorParam):
    def zero(self, value):
        return 0
    def addInPlace(self, val1, val2):
        # this method defines what happens with 
        # the value sent to the accumulator
        return max(val1, val2)
    
# create an Accumulator object
max_levenshtein = sc.accumulator(0,MaxAccumulatorParam())

from nltk.metrics import edit_distance

def levenshtein(question1, question2):
    result = edit_distance(question1, question2)
    global max_levenshtein
    # the following call calls the addInPlace method
    # from the MaxAccumulatorParam object
    max_levenshtein += result
    return result

# and create the pyspark.sql.UserDefinedFunction
from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType
udf_levenshtein = udf(levenshtein, IntegerType())

 

Gestern war ein schöner Tag

Gestern war ein schöner Tag, weil ich den ganzen Tag erfolgreich mit Sparks’s RDDs experimentiert hatte. Leider habe ich dann gestern Abend spät festgestellt, dass die Zukunft den DataSets (und DataFrames) gehört und nicht den RDDs 😦

Damit war ich heute noch nicht so erfolgreich. Ich hänge auf eine User Defined Function, wobei ich die Fehlermeldung in der Console kenne – ich arbeite wieder mit den Kaggle Quora Daten.