#!/usr/bin/env python # coding: utf-8 # # 301 - Workflows mit Daten im PAP # # # ## Teilt Daten mit eurem Partner # # Da ihr im PAP mit eurem Partner zusammen arbeitet benötigt ihr ein System, um eure Daten miteinander zu teilen. Achtet darauf, dass eure Daten dabei konsistent bleiben und nicht verloren gehen - schickt sie also bspw. nicht per Email hin und her und tragt sie nicht auf verschiedenen USB-Sticks umher. # # - Eine einfache Option ist ein Cloud Storage Dienst wie die Uni-interne [HeiBox](https://heibox.uni-heidelberg.de), mit der ihr einen Ordner mit Kommilitonen teilen könnt. # - Noch robuster ist, eure Dateien in einem [Git Repository](https://git-scm.com) zu verwalten. Das ist ein Ordner, in dem Git regelmäßig alle Änderungen der Dateien darin speichert, sodass ein konsistenter Versions-Verlauf entsteht. Über einen Dienst wie [GitHub](https://www.github.com) könnt ihr das Repository jederzeit mit eurem Partner abgleichen, ohne dass Synchronisierungs-Konflikte entstehen können. # # > Auch die Fakultät Physik bietet Studierenden einen solchen Dienst in Form eines [GitLab](https://about.gitlab.com) Servers: # > - [GitLab Server der Fakultät Physik](https://appgit.physik.uni-heidelberg.de) # > # > Im [Werkraum-Wiki](https://werkraum.ixpa.de/wiki/index.php/GitLab) findet ihr weitere Informationen dazu. Falls ihr Hilfe mit Git benötigt könnt ihr euch auch an das Werkraum-Team wenden. # # Git ist die Grundlage weltweiter Softwareentwicklung und wird in der Wissenschaft bereits ebenso viel verwendet. Nutzt also die Gelegenheit, im PAP mit Git und Python zwei der grundlegenden Technologien moderner Wissenschaft zu lernen. Eine Einführung in Git bietet euch [try.github.io](http://try.github.io/). Wenn ihr lieber ohne Kommandozeile arbeitet könnt ihr Git mit der [GitHub Desktop](https://desktop.github.com) App auch mit einer graphischen Oberfläche verwenden. # # ## Speichert Daten getrennt von eurer Analyse # # In eurem Verzeichnis für das PAP, das ihr mit eurem Partner teilt, legt ihr nun einen Ordner für jeden Versuch an und speichert darin das Jupyter Notebook für diesen Versuch. Schon während der Versuchsdurchführung könnt ihr darin Berechnungen durchführen und Notizen machen. # # > Im PAP nehmt ihr während eines Versuchs häufig selbst Daten oder verwendet Messgeräte, die Daten in verschiedenen Formaten speichern. Diese Daten repräsentieren alles, was euer Experiment über die Natur herausfindet und bilden damit die objektive Grundlage eurer Analyse. **Wir trennen daher die Daten strikt von der Versuchsauswertung, die diese Daten interpretiert.** # # Erstellt für manuell genommene Daten demnach eine `.txt` Datei und tragt die Daten in einem konsistenten Format ein, sodass es anschließend leicht eingelesen werden kann. # # ## Formatiert eure Daten konsistent # # Sinnvoll ist, Spalten durch Tabulatoren zu trennen und in einer Titelzeile die Messgröße und ihre Einheit zu notieren: # # t [s] x [mm] # 0 5.1 # 1 12.25 # 2 19.5 # 3 31.13 # # In den meisten Fällen lesen wir Daten mit [`numpy.loadtxt`](https://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html) ein. Ein Format wie dieses kann die Funktion ohne Schwierigkeiten lesen, wenn wir mit `skiprows=1` die Titelzeile überspringen: # In[ ]: import numpy as np # In[ ]: np.loadtxt('data/formatted_data.txt', skiprows=1) # ## Lest beliebige Datensätze ein # # Die `numpy.loadtxt` Funktion ist flexibel genug, um Daten jeglicher Form einlesen zu können. Schaut euch einfach die Struktur eurer Daten an, indem ihr bspw. die `!head` Funktionalität im Jupyter Notebook verwendet: # In[ ]: get_ipython().system('head data/comma_separated_data.txt') # Diese Daten verwenden bspw. ein Komma statt eines Punktes als Dezimaltrennzeichen. Zieht die Dokumentation der `numpy.loadtxt` Funktion zu Rate, um eine Option zu finden, die Daten einzulesen: # In[ ]: #np.loadtxt? # Dem Argument `converters` der Funktion `numpy.loadtxt` können wir in einem Dictionary für jede Spalte eine Funktion angeben, die einen Wert des Datensatzes beliebig verändern kann. Wir ersetzen also das Komma durch einen Punkt und konvertieren den String zu einem Float: # In[ ]: def comma_decimal_to_float(valstr): return float(valstr.decode("utf-8").replace(',','.')) np.loadtxt('data/comma_separated_data.txt', skiprows=1, converters={ 1: comma_decimal_to_float }) # Wenn ihr Daten in einem Format vorliegen habt, das `numpy.loadtxt` nicht direkt einlesen kann, erinnert euch daran, dass euch mit Python die Möglichkeiten einer vollwertigen Programmiersprache zur Verfügung stehen. Durch String-Manipulationen könnt ihr die Daten häufig so weit verändern, dass ihr die Daten weiterverarbeiten könnt.