Blog durchsuchen
Profil
Joerg Rings lebt in Oakland, Kalifornien, und ist Senior Quantitative Analyst in einem Start-Up, das Thermostate optimiert um Energie zu sparen.
Kontakt
Letzte Einträge
- Neue Grenzen um Stadtteile ziehen mit Foursquare4 Kommentare· 12.05.12
- Deepwater Horizon-Katastrophe: Nichts gelernt?8 Kommentare· 04.05.12
- Das Gefangenendilemma im Fernsehen6 Kommentare· 02.05.12
- Sam Harris Privileg fordert Profiling an Muslimen18 Kommentare· 30.04.12
- Graphen bekommt Gesellschaft: Zweidimensionale Silizium-Struktur erzeugt0 Kommentare· 29.04.12
Kommentare
- Kerstin Gauck · 22.05.12 · 12:43 Uhr Deepwater Horizon-Katastrophe: Nichts gelernt?
- Hagen Scherb · 22.05.12 · 10:25 Uhr Weniger Mädchengeburten um Gorleben und nach Tschernobyl?
- SimbaOderNala · 15.05.12 · 22:23 Uhr Neue Grenzen um Stadtteile ziehen mit Foursquare
- Karina · 08.05.12 · 02:18 Uhr Sam Harris Privileg fordert Profiling an Muslimen
- BreitSide · 03.05.12 · 20:16 Uhr Das Gefangenendilemma im Fernsehen
Kategorien
Archiv
- Mai 2012
- April 2012
- Februar 2012
- Januar 2012
- Dezember 2011
- November 2011
- Oktober 2011
- September 2011
- August 2011
- Juli 2011
- Mai 2011
- April 2011
- März 2011
- Februar 2011
- Januar 2011
- Dezember 2010
- November 2010
- Oktober 2010
- September 2010
- August 2010
- Juli 2010
- Juni 2010
- Mai 2010
- April 2010
- März 2010
- Februar 2010
- Januar 2010
- Dezember 2009
- November 2009
- Oktober 2009
- September 2009
- August 2009
- Juli 2009
- Juni 2009
- Mai 2009
- April 2009
- März 2009
- Februar 2009
- Frühere Beiträge
« vorheriger Beitrag · nächster Beitrag »
29.03.09 · 16:35 Uhr
Wissenschaftliches Arbeiten mit Python und PyLab I: Einführung
Kategorie: Naturwissenschaften · Kommentare: 10
Der Arbeitsalltag eines Wissenschaftlers besteht vor allem aus einem: Daten in einem Format einlesen, irgendwie verarbeiten, und wieder irgendwie ausgeben, sei es in einem anderen Format oder als Bild. Da man das sowieso auch in den einfachsten Fällen meistens etwa sechsunddreissig Mal falsch macht, und die Bilder eh alle neunzehn Mal, daher ist es ratsam, sich gleich ein Skript für alle Arbeiten zu schreiben. Das ist dann besser, weil man zwar initial ein bißchen mehr Arbeit reinsteckt, aber später wenigstens noch leicht neu rechnen oder modifizieren kann, was man da gemacht hat.
Ich würde außerdem immer raten, auf freie Software zu setzen. Auch wenn ihr jetzt eine Matlab-Lizenz habt, vielleicht ändert das sich mal, und dann tretet ihr alle eure Skripte in die Tonne - grad Matlab hat teure Lizenzen, und ihr wisst nicht ob eure Uni die immer weiter bezahlt oder reduziert oder ob euer nächstes Institut das überhaupt hat.
Besonders bieten sich Skriptsprachen an, denn sie bieten gegenüber herkömmlichen Programmiersprachen wie C++ oder Java den Vorteil, nicht immer kompiliert werden zu müssen sondern einfach gleich ausführbar sind. Außerdem sind sie drauf angelegt, viele Werkzeuge zu bieten die Datenverarbeitung einfacher machen.
Ich habe viel mit Perl gearbeitet, bin aber seit kurzem voll auf Python umgestiegen. Das bietet die umfangreichsten Werkzeuge, auch bis hin zu vollständigen wissenschaftlich-mathematisch Bibliotheken und umfangreichen und im einfachsten Fall in zwei Zeilen implementierbaren Plotfunktionen. Diese Funktionen sind in den SciPy/NumPy/matplotlib-Bibliotheken vereint.
Grundsätzlich gehe ich von Linux aus, alles andere taugt nicht. Linux bietet in der Kommandozeile die nötigen Programme, um ohne Dauerklickerei alles zu erledigen, was man bei der Datenverarbeitung tun möchte. Daher gehe ich einfach mal davon aus, dass Linux und Python installiert sind.
Ein einfacher emacs mit Python-Mode leistet auch beste Dienste dabei, die Einrückungen in Python einfach hinbekommen zu können. Es gibt für komplexere Programme auch PyDev für Eclipse, das funktioniert auch ganz gut. Aber außer Java scheint in Eclipse nichts so richtig gut zu funktionieren.
Python ist aktiv in Entwicklung, aber Version 2.4 sollte mindestens vorhanden sein. Die neuere, 2.5, hat durchaus mehr "convenience functions", daher, wenn mal etwas nicht funktioniert darin, einfach mal schauen ob es wegen der Version ist.
Grundsätzlich schreibt man Python genau wie andere Programmiersprachen, mit wenigen Besonderheiten, und auch ein paar Eigenheiten die einem mal den Tag versauen können wenn man sie noch nicht kennt. Aber die Vorteile überwiegen: Dadurch, dass es nicht geschweifte Klammern {} eingesetzt werden um Blöcke zu markieren, und Zeilen nicht mit ; beendet werden müssen, sondern stattdessen strenge Einrückung als Markierung dient, schreibt man quasi ab-initio übersichtlichen Code.
Man kann für einfache Fälle ein Skript einfach am Stück runterschreiben, einfach ein paar Befehle aneinanderreihen. Python ist aber eigentlich voll objektorientiert, man sollte für größere Probleme also die Objektorientierung nutzen, das ist auch sehr einfach.
Das Variablensystem ist flexibel in Python, Variablen werden mit der ersten Verwendung initiiert. Die Typen int, float, string gibt es aber doch und man muss leider öfters einmal casten oder aufpassen, beim Teilen /2. zu schreiben statt /2 um floats zu erhalten. Das ist in Perl schöner, da kann man wirklich fast beliebig schlampig sein mit den Typen und doch klappt es. Ich schreibe jetzt pur aus der Sicht eines Anwenders, der mit einer Sprache arbeitet ohne große das Konzept dahinter zu inhalieren. Ich weiß, dass Python ein strenges Konzept hat, ist ja auch gut so, aber manchmal reibt das sich halt mit meiner Vorstellung.
Weitere Reibungen sind z.B. dass in Klassen ständig self verwendet werden muss, wie this in C++/Java, aber man muss es immer schreiben, auch einmal in jeder Funktionsdefinition. Das ist etwas lästig manchmal. Und aufpassen: Python übergibt Variablen NUR per Referenz. Das hat mich vor kurzem einen Tag gekostet: Ich wollte eigentlich nur ein Objekt ein paar Mal kopieren und in eine Liste stecken. Dann sollte jedes Listenelement einen anderen Weg gehen, und ich wusste nicht, dass das Objekt nicht als Kopie in die Liste gesteckt wird, (dazu braucht man das copy-Modul), sondern nur eine Referenz. Das heißt, die Änderungen an einem Listenelement haben die anderen mit verändert. Naja, normaler Lernprozess an einer neuen Sprache, aber findet so etwas mal raus...
Ok, vielleicht doch ein Beispiel dazu:
class TestObject:
def __init__(self, value, text=""):
self.value = value
self.text = text
def output(self):
print self.value, self.text
def doubleList(list):
newList = []
for element in list:
newList.append(element)
element.value += 1
newList.append(element)
return newList
def main():
t1 = TestObject(1)
t2 = TestObject(5,"Hallo")
t3 = TestObject(value=10, text="ScienceBlogs")
tList = [t1,t2,t3]
dList = doubleList(tList)
for e in dList:
e.output()
if __name__ == "__main__":
main()
Sehen wir zuerst kurz an den Schluss:
if __name__ == "__main__":
main()
Es gibt bestimmte feste Variable intern in Python, die mit doppelte Unterstrichen vor und nach dem Namen markiert sind. Eine davon ist __name__, und wenn man das Skript von der Kommandozeile aufruft, ist diese Variable auf "__main__" gesetzt. Auch wenn man das Skript einfach runterschreiben könnte, ist es besser, das so zu schreiben und die Funktionalität in einer Funktion main() zu definieren, und diese wie hier aus dem if aufzurufen. So kann man die Wiederverwendbarkeit des Codes erhöhen.
Ok, wir möchten folgendes ausprobieren: Wir haben eine einfache Klasse Testobject, die sehen wir uns mal zuerst an:
class TestObject:
def __init__(self, value, text=""):
self.value = value
self.text = text
def output(self):
print self.value, self.text
Die Klassendefinition ist einfach. Die Funktion, die __init__ heißt, ist der Konstruktor. Man sieht auch, dass Klassenfunktionen als erstes Argument self haben müssen. Es werden zwei Klassenvariablen value und text angelegt. Man sieht auch im Funktionaufruf, dass text optional ist, weil es einen Default-Wert hat. Es gibt weitere dieser vorgegebenen Funktionsnamen mit dem __, für Getters und Setters, auch für das ausgeben, aber hier haben wir doch eine eigene Funktion output dafür. Man kann einfach print schreiben und dann Variablen durch Komma hintendranreihen, das schafft er dann, das in einen String zu wandeln und setzt auch automatisch Leerzeichen dazwischen und Zeilenumbrüche ans Ende.
Also mit output kann man value und text des Objektes ausgeben.
Das ganze Skript macht jetzt folgendes: Es legt eine Liste an mit drei Elementen. Dann soll die Funktion doubleList die Anzahl der Elemente verdoppeln, in dem es jedes kopiert, aber bei der Kopie den Wert um eins hochzählt. Aber wenn man die Ausgabe ansieht, fällt auf dass die Objekte nicht kopiert in die Liste eingefügt werden, sondern nur als Referenz.
2
2
6 Hallo
6 Hallo
11 ScienceBlogs
11 ScienceBlogs
Die Zahlen sind gleich, das heißt er hat nur eine Kopie des Objektes, und diese einmal bearbeitet.
So, jetzt ist der Beitrag mit Python-Ranting schon ein bißchen lang geworden, daher mache ich mal Schluss für heute. Im nächsten Teil geht es dann wirklich an die wissenschaftlichen Bibliotheken um SciPy, und vielleicht später auch nochmal systematischer etwas zu Python.
Zur Einführung in die vielfältigen Funktionen von Python empfehle ich das Buch "Dive Into Python" von Mark Pilgrim, das man auch <a href="http://www.diveintopython.org/>online</a> lesen kann.
Autor: Jörg· 10 Kommentare· Permalink· Trackback-URL
Kommentar schreiben
Top5
- Liebe Piraten, lasst uns endlich vernünftig miteinander reden!Astrodicticum Simplex· 14.05.2012
- Risikowahrnehmung: Wenn man vor den falschen Dingen Angst hatAstrodicticum Simplex· 20.05.2012
- Dr. h.c. im Sonderangebot für 39 Euro[sic]· 14.05.2012
- Die Erde dreht sich nicht um die Sonne...Astrodicticum Simplex· 12.05.2012
- Ein Krawumm geht um die Welt (4): Eishockey und NobelpreiseAstrodicticum Simplex· 14.05.2012
Top5
- Liebe Piraten, lasst uns endlich vernünftig miteinander reden!Astrodicticum Simplex· 14.05.2012
- Klimaschmock des Monats Mai 2012Primaklima· 20.05.2012
- Gibt es ein "generisches Maskulinum"?Hier wohnen Drachen· 11.05.2012
- Sollten wir auf Fleisch verzichten?evolvimus· 11.05.2012
- Die kalte Sonne von Vahrenholt/Lüning: Le Trend, c'est moi!Primaklima· 16.05.2012
ScienceBlogs.com
- Doubt and other products: The National Toxicology Program's Report on Carcinogens, bad for whose business?by Elizabeth Grossman As it pursues its anti-regulatory agenda the ...The Pump Handle· 22.05.2012 · 16:39 Uhr
- Weekend Recap: My Annular Eclipse Expedition!A little more persistence a little more effort and what ...Starts With A Bang· 22.05.2012 · 00:11 Uhr
- Water, waterThis image has been going around the intertubes recently I ...A Few Things Ill Considered· 21.05.2012 · 22:59 Uhr
- To be or not to be? The Prevention and Public Health Fundby Kim Krisberg We will pay for this by taking ...The Pump Handle· 21.05.2012 · 15:19 Uhr
- An important revelation regarding Heartland Gate (global warming denialism)Peter Gleick has been cleared of faking a key memo ...Greg Laden's Blog· 21.05.2012 · 12:52 Uhr




Kommentare (10)
Fein, danke! Selbst unter der Annahme, dass es solche Beiträge (oder "Topologie von Flächen $" von Thilo Kuessner, meine 3 Semester Mathe liegen dafür zu lang zurück...) nicht in die Spitze der Top5 schaffen, gehören sie unbedingt dazu, um den SB so etwas wie wissenschaftliche street credibility zu verschaffen (IMHO).
Zurück zum Beitrag: Allerdings muss ich für mich feststellen, dass ich nach ein wenig Beschäftigung mit Python + SciPy noch kein Argument gefunden habe, das mir gegenüber R einen Zusatzgewinn verspricht. Deswegen erwarte ich mit Spannung die weiteren Ausführungen der kleinen Reihe.
Mit R habe ich selbst noch nichts gemacht, aber jetzt wo ich auch mit Monte Carlo-Methoden arbeite, wäre das vielleicht sogar eine Überlegung wert, mir das anzusehen. Ich denke, Python + SciPy (und es gibt ja noch viele weitere Module) gehen mehr in die Breite und bieten allgemein eine solide Basis für jede Anwendung. R ist da sicherlich in der Spezialisierung auf Statistik besser, vermute ich?
Ich bin gerade dabei mich in Python 3 einzuarbeiten, gefällt mir bisher sehr gut. Allerdings ist es nicht mehr mit früheren Versionen kompatibel und an einigen Stellen wurde der Syntax verändert. Dein Problem mit /2. gibt es nicht mehr.
Dadurch habe ich noch einige Schwierigkeiten mit den Tutorials, die auf 2.x ausgelegt sind.
R hat den Vorteil, dass es mit CRAN ein riesiges Repository an Programmpaketen gibt, die größtenteils Statistik-spezifisch sind. Bei einer oberflächlichen Suche habe ich zB acht Pakete gefunden, die irgendwas mit Monte Carlo-Methoden zu tun haben.
R und Python brauchen nicht gegeneinander zu konkurrieren, sie arbeiten perfekt zusammen.
"Grundsätzlich gehe ich von Linux aus, alles andere taugt nicht."
Ich weiss, es ist eine Glaubensfrage, aber Mac OS ist eine Unix-Platform wie jede andere auch (mit Shell und allem was man braucht). Python läuft wunderbar und ist ab 10.5 sogar schon standardmässig vorinstalliert. Ich kann also alle Mac-User nur ermuntern, es zu benutzen. Das nur als Ergänzung - tolle Idee, hier einen kleinen Schnupperkurs zu machen!
Ist Python schnell genug für wirklich große Datensätze?
Ein Freund von mir wollte zuerst für seine Diplomarbeit was in Perl schreiben (n paar Jährchen her), ist dann aber doch zu C gewechselt, weils sonst zu lange dauerte (im Endeffekt einige hundert Milliarden Daten auf Eingangsseite). Und auch ich stand schon vor dem Problem, dass Perl bei einigen zehn Millionen Datensätzen (Wochenendmessung eunes Sensors jede zehntel Sekunde auf 30 Kanälen...) doch recht lange verweilte... gut, war in meinem Fall nur ne Kaffeepause, da recht einfache Umrechnerei :D
Oder sind das nur klassische Vorurteile gegenüber Skriptsprachen, die Python nicht hat?
Jannis,
Nur schöner ;-)Aber ernsthaft. Auch, wenn selbst die meisten Mac-Nutzer es nicht wissen (und nicht verstehen würden, wass es bedeutet, wenn sie es wüssten): Max OS X, bzw. sein Unterbau Darwin, ist ein vollwertiges standardkonformes UNIX und unter X11 lässt sich jedes für UNIX geschriebene Programm kompilieren (bzw. jedes, bei dem ich das bisher ausprobiert habe). Python, Perl, et al. sind sowieso dabei, und R läuft nirgends mit mehr Stil als unter Mac OS X.
Trotzdem stimme ich Jörg zu: Am Ende taugen nur Linux und andere freie UNIXe wirklich etwas, denn Apple könnte morgen entscheiden, diesen oder jenen Standard nicht länger zu unterstützen. Bei den freien UNIXen wird das nicht passieren.
Ja, OsX ist schon ein UNIX, wenn man die Wahl hat nur zwischen Windows und Mac ist das sicherlich die bessere Wahl und es lässt sich damit etwas anfangen.
Aber bei meiner subjektiven Verachtung für das Apple-Gesamtkonzept ist das keine Option :)
Mit den großen Datensätzen weiß ich nicht, Python setzt ja eigentlich auch nur auf C auf, aber für solche wirklichen Riesendatenberge muss man wahrscheinlich so Low Level wie möglich anfangen. Aber da würde sich doch anbieten, die kritischen Funktionen in C zu implementieren und mit Python zu wrappen. Wenn man sich mal Python angewöhnt hat, ist C wie Auto fahren mit zusammengebundenen Händen und Füßen...
Python 2.6 ist jetzt Produktionsvariant. Ich empfehle, nichts später als 2.5.2 zu benutzen, da ich letzte Woche eine 2.4 Applikation verloren habe - zwölfstundige Ausfall, brauchte eine Weile um einige Anderungen im Time-modul aufzuspüren.