Nützliche Kommandozeilen-Einzeiler für LaTeX
Unter https://gist.github.com/iwishiwasaneagle/2f91f63f3cb0107b94b501aa284a18ca gibt es eine Sammlung an nützlichen Einzeilern für die Arbeit mit LaTeX.
Textsatz mit \LaTeX, Programmieren, Zahlen, etc.
Unter https://gist.github.com/iwishiwasaneagle/2f91f63f3cb0107b94b501aa284a18ca gibt es eine Sammlung an nützlichen Einzeilern für die Arbeit mit LaTeX.
Die Uhr rechts unten in der Windows-Taskleiste kann man auch so einstellen, dass die Sekunden angezeigt werden
Dazu mit regedit den Schlüssel \HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced –> ShowSecondInSystemClock auf 1 setzen.
Hier ein einfaches Beispiel, wie man mit Python und LaTeX ein PDF mit Kursinformationen erstellen kann.
Zuerst der Python-Teil, der die Apple-Kursdaten seit dem 1.1.2021 in einen Dataframe lädt und dann in eine LaTeX-Tabelle schreibt:
import pandas import pandas_datareader.data as web YAHOO_TODAY="http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=sd1ohgl1vl1" history = web.DataReader('AAPL', "yahoo", start="2021-1-1") history.to_latex('aapl.tex') |
Dann noch der LaTeX-Teil, der a) den Python-Code aus dem LaTeX-Lauf heraus ausführt und b) die erzeugte Tabellen-Datei nur dann einbindet, wenn sie wirklich auch erzeugt wurde.
\documentclass[12pt,ngerman]{scrartcl} \usepackage[a4paper, top=1cm,bottom=1cm,left=1cm, right=1cm]{geometry} \usepackage[T1]{fontenc} \usepackage{booktabs} \makeatletter \newcommand{\testfileexists}[1]{% \IfFileExists{#1}% {\def\inputtestedfile{\@@input #1 }} {\let\inputtestedfile\@empty}% } \makeatother \begin{document} \write18{python runpy.py} \testfileexists{aapl} \inputtestedfile \end{document} |
Mit Seaborn lassen sich auch Stripplots erstellen, hier ein Beispiel. Die Besonderheit ist hier, dass die pd.melt() Funktion genutzt wird, um aus den verschiedenen Variablen des Datensatzes drei Variablen zu machen: eine für den Typ echt/unecht, eine für den Variablennamen und eine für den Wert der jeweiligen Variablen.
#!/usr/bin/env python # coding: utf-8 import seaborn as sns import pandas as pd import requests from bs4 import BeautifulSoup from io import StringIO import matplotlib.pylab as plt headers = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET', 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Max-Age': '3600', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0' } url = "http://www.statistics4u.com/fundstat_eng/data_fluriedw.html" req = requests.get(url, headers) soup = BeautifulSoup(req.content, 'html.parser') data=soup.find('pre').contents[0] str_object = StringIO(data) df = pd.read_csv(str_object,engine='python',skiprows=5,delim_whitespace=True) # Banknotes BN1 to BN100 are genuine, all others are counterfeit df['Type'] = 'Counterfeit' df.loc[df.index[:100], 'Type'] = 'Genuine' print(df) sns.set(style="whitegrid", palette="muted") #df = df[['Left', 'Diagonal', 'Type']] df = pd.melt(df, "Type", var_name="Variable") sp = sns.stripplot(x="value", y="Variable", hue="Type", data=df, dodge=True, alpha=.75, zorder=1) #sp.set(xlim=(127, 143)) sp.legend_.remove() plt.show() |
Das Bild, was dabei erzeugt wird, ist aber eher schlecht. Da die Variablen teilweise sehr unterschiedliche Skalen haben, erkennt man eigentlich nur Punktwolken, die übereinander liegen.
Die Lösung besteht darin, nur die Variablen gemeinsam zu plotten, die sehr nah beieinander liegende Skalen haben. Dazu entfernt man die beiden Hashes aus den auskommentierten Python-Zeilen, um nur noch die Variablen Left und Diagonal zu plotten und um die Skale anzupassen.
Dann erkennt man im Bild, dass die Diagonale echte und falsche Banknoten schön voneinander trennt.
Im Beitrag „CSV-Dateien mit speziellen Spaltentrennern in Python laden“ hatte ich gezeigt, wie man mit BS4 Dateien aus Webseiten extrahieren und abspeichern kann, um sie dann in pandas weiterzuverarbeiten. Es geht auch ohne den Umweg der CSV-Datei, wenn man die StringIO Klasse aus dem io Modul nutzt.
Wir laden das Modul und instanziieren dann ein Objekt der Klasse mit dem von BS4 gefundenen Datensatz. Diese Objekt wird dann anstelle des Pfades der CSV-Datei an die pd.read_csv()
Funktion übergeben.
import pandas as pd import requests from bs4 import BeautifulSoup from io import StringIO headers = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET', 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Max-Age': '3600', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0' } url = "http://www.statistics4u.com/fundstat_eng/data_fluriedw.html" req = requests.get(url, headers) soup = BeautifulSoup(req.content, 'html.parser') data=soup.find('pre').contents[0] str_object = StringIO(data) df = pd.read_csv(str_object,engine='python',skiprows=5,delim_whitespace=True) print(df) |
Hier ein Beispiel, wie man Bilder für eine Animation mit matplotlib erstellen kann, adaptiert von im Netz gefundenen Code
Der folgende Python-Code erzeugt 720 einzelne Bilder und legt diese im Dateisystem ab. Mittels magick -quality 100 *.png outputfile.mpeg
werden dann die Bilder zu einem MPEG-Video kombiniert. Hinweis: Nur unter Windows heißt der Befehl „magick“ da „convert“ auch ein Systemprogramm ist.
import matplotlib.pyplot as plt import pandas as pd import seaborn as sns from mpl_toolkits.mplot3d import Axes3D df = sns.load_dataset('iris') sns.set(style = "darkgrid") fig = plt.figure() fig.set_size_inches(16, 9) ax = fig.add_subplot(111, projection = '3d') x = df['sepal_width'] y = df['sepal_length'] z = df['petal_width'] ax.set_xlabel("sepal_width") ax.set_ylabel("sepal_lesngth") ax.set_zlabel("petal_width") c = {'setosa':'red', 'versicolor':'blue', 'virginica':'green'} ax.scatter(x, y, z,c=df['species'].apply(lambda x: c[x])) for angle in range(0, 720): ax.view_init((angle+1)/10, angle) plt.draw() plt.savefig('r:/'+str(angle).zfill(3)+'.png')
Eine kürzere Version der Animation habe ich unter https://www.youtube.com/watch?v=gdgvXpq4k1w abgelegt.
Hinweise zu anderen Konvertierungsprogrammen gibt es unter anderem hier: https://www.andrewnoske.com/wiki/Convert_an_image_sequence_to_a_movie
Um einige Klassifikations-Algorithmen in Python ausprobieren zu können habe ich heute die Swiss Banknote Data von Flury und Riedwyl benötigt. Die Daten sind im Netz z.B. unter http://www.statistics4u.com/fundstat_eng/data_fluriedw.html verfügbar, ich wollte sie aber nicht manuell einladen müssen.
Mit dem folgenden Code, adaptiert von https://hackersandslackers.com/scraping-urls-with-beautifulsoup/, kann man die Daten lokal abspeichern und dann in einen pandas Dataframe einladen.
import pandas as pd import requests from bs4 import BeautifulSoup headers = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET', 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Max-Age': '3600', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0' } url = "http://www.statistics4u.com/fundstat_eng/data_fluriedw.html" req = requests.get(url, headers) soup = BeautifulSoup(req.content, 'html.parser') a=soup.find('pre').contents[0] with open('banknote.csv','wt') as data: data.write(a) df = pd.read_csv('banknote.csv',engine='python',skiprows=5,delim_whitespace=True) print(df) |
Ich habe heute auf einer meiner Linux-Maschinen Jupyter Notebook installiert. Um die — für die Arbeit im lokalen Netz lästigen — Sicherheitsabfragen zu umgehen, habe ich mir ausgehend von https://stackoverflow.com/questions/41159797/how-to-disable-password-request-for-a-jupyter-notebook-session ein kleines Startskript geschrieben:
#! /bin/bash jupyter notebook --ip='*' --NotebookApp.token='' --NotebookApp.password='' |
Mit cudf gibt es ein Paket, das pandas Datenstrukturen auf nvidia-Grafikkarten verarbeiten kann. Einen i7 3770 mit 24 GB RAM habe ich jetzt mit einer CUDA-fähigen Grafikkarte (Typ Quadro P400) ausgestattet, damit ich damit rumspielen arbeiten kann. Unter https://towardsdatascience.com/heres-how-you-can-speedup-pandas-with-cudf-and-gpus-9ddc1716d5f2 findet man passende Beispiele, diese habe ich in einem Jupyter-Notebook laufenlassen.
Ein Geschwindigkeitszuwachs ist erkennbar, insbesondere bei der Matrix-Größe aus dem verlinkten Beispiel war die CUDA-Variante mehr als 3x so schnell wie die CPU-Variante. Das Merge mit der vollen Matrix-Größe lief bei mir leider nicht, da limitieren vermutlich die 2 GB RAM, die die P400 bietet.
Im letzten Beitrag hatten wir mit hue
die Zugehörigkeit der Iris Data Orchideen dargestellt, Seaborn besitzt aber mit style
und size
noch weitere Möglichkeiten der Unterscheidung. style
nutzt dabei verschiedene Symbole, size
unterschiedliche Punktgrößen. Die verschiedenen Optionen können auch kombiniert werden.
import seaborn as sns sns.set(style = "darkgrid") iris=sns.load_dataset('iris') sns.scatterplot( x=iris['sepal_width'], y=iris['sepal_length'], style=iris['species'], legend=False ) |
import seaborn as sns sns.set(style = "darkgrid") iris=sns.load_dataset('iris') sns.scatterplot( x=iris['sepal_width'], y=iris['sepal_length'], size=iris['species'], legend=False ) |
import seaborn as sns sns.set(style = "darkgrid") iris=sns.load_dataset('iris') sns.scatterplot( x=iris['sepal_width'], y=iris['sepal_length'], hue=iris['species'], style=iris['species'], size=iris['species'], legend=False ) |