Show Menu
Cheatography

Python Datenanalyse Cheat Sheet (DRAFT) by

Python Datenanalyse ETH 2023

This is a draft cheat sheet. It is a work in progress and is not finished yet.

Python Basics

import numpy as np
%matpl­otlib notebook
,
%matpl­otlib inline
intera­ktive Plots
a = np.arr­ay(­[0,­1,2­,3,4])
data[a,b]
zweidi­men­sio­nales Array, gibt Werte mit Koordi­naten (a,b) zurück
print(a[1:3)]
[start­:ende]
b = a + 1'
mult/add array
a = np.zer­os(5)
5 x 0.0
a = np.ones(5)
a = np.lin­spa­ce(­a_min, a_max, n_a)
d_a = 1/(n_a -1)
n_points = np.log­spa­ce(1, np.log­10(­len­(da­ta)), 100 , dtype=int) 
logari­thm­isches array # wir wollen 100 zahlen
a = np.ara­nge­(a_min, a_max, d_a)
n_a = (a_max­-a_­min­)/d_a (aufge­rundet, array ohne a_max)
a = [0, math.pi ,0] b = np.exp(a)
Funktion auf Array anwenden
np.loadtxt?
Dokume­ntation einer Funktion
print('Die Summe der Zahlen {} und {} ist gleich {}.'.f­orm­at(3, 5, 8))
{:d} : Integer {:f} : Fliess­komma {:0.2f}: Fliess­komma mit 2 Nachko­mme­stellen
 np.arr­ay(­[np.fr­oms­tri­ng(l, dtype=­float, sep=',')])
String Daten in Array (l ist String)
np.sta­ck((a, b))
Matrix mit Zeilen (a,b)
a.to_n­umpy()
Array zu np-Array
X = np.res­hap­e(d­f['­x'].va­lues, newsha­pe=(-1, 1))  # (-1, 1) bedeutet: eine Spalte mit sovielen Zeilen wie nötig
reshape macht aus 1 dimens­ionalem array ein zweidi­men­sio­nales (jeder wert wird zu einem Array mit einem Eintrag)

Iteration und Enumerate

for c_i in c:
	print(c_i)
for index, wert in enumerate(a):
    b[index] = wert**2
0.0 0.25 0.5 0.75 1.0
Wir möchten jedem b[i] den Wert a[i]**2 zuweisen.

Plotten eines Datens­atztes

import matplotlib.pyplot as plt 

# Umrechnung von Zoll in cm (1 Zoll = 2.54 cm)
cm = 0.393701

# Definition von globalen Parametern, hier die Schriftgrösse
plt.rcParams.update({'font.size': 16})
plt.rcParams.update({'axes.labelsize': 16})

# Definition der Figur, mit Grössenangabe
fig = plt.figure(figsize=(20cm, 17cm))
ax1 = fig.add_subplot(1, 1, 1) (anzahl, (x,y))
# Definitiond er zu plottenden Daten mit Label
ax1.plot(x0, y0, 'bo', label='Data') #b = blue, o = Punkte
ax1.plot(x0, y0, 'r-', label=r'$y = x^2$') #Rote Striche
# Achsenbeschriftung, die Angegebene Schriftgrösse überschrebit die globale Schriftgrösse
ax1.set_xlabel('x (x unit)')
ax1.set_ylabel('y (y unit)')
ax1.set_title("Titel")
# Definition des Bereichs der geplottet werden soll
ax1.set_xlim(0, 2)
ax1.set_ylim(0, 4)
# Erzeugen einer Legende, hier werden die Label aus der Plotfunktion übernommen
ax1.legend(fontsize=20, frameon=False)


# Abspeichern der Figur
fig.savefig(r'Figur.png', dpi=400, transparent=True)

Plotbe­fehle

ax3.ba­r(b­ins­[:-1], hist, width=­0.8­*bi­nsize)
Balken­dia­gramm
ax.axv­lin­e(V­_mean, color='r')
Linie einzei­chnen
fig.ti­ght­_la­yout()
schönes Layout
ax.plo­t(t­ime1, signal1, 'x-')
gemessene Datenp­unkte markieren
plt.sc­att­er(­t_mess, U_mess, zorder=2, color = "­red­", marker­='o')
Punkte
plt.ax­es(­).s­et_­asp­ect­('a­uto', 'datalim')
ax.leg­end()
Legende erstellen
ax.sem­ilo­gx(­n_p­oints, mean_n)
logari­thm­ische x-achse
 ax.set­_ys­cal­e("l­og")
# Logari­thm­ische Skalierung der y-Achse
ax1.er­ror­bar(x, y, x_error, y_error)
Graph mit Fehler
ax3.pl­ot(t, z,'.')
Punkte plotten

Abspei­chern und Laden von Daten

SPEICHERN
np.savetxt('DataOut.txt', (x0, y0), delimiter = ',') #Speichert Daten als ASCI (txt)
np.savetxt('DataOut.txt', (x,y,z), delimiter=',', header='Beispieldatei Datenanalyse, 14.2.2023. Format: x, y, z') #Für Metadaten


LADEN
(x2, y2) = np.loadtxt('DataOut.txt', delimiter = ',' , comments = '#') #lädt Daten, blendet # aus
data = np.loadtxt('DataOut.txt', delimiter = ',') #Daten von allg. Datenarray

print(data.shape) # a=np.array([[[0],[0]]]) hat shape (1,2,1) (3-dimensional)
x3 = data[0, :]
y3= data[1, :]
plt.plot(x3, y3)
zeilen, spalten = a.shape
Mit 'shape' erfahren wir die Form. Diese Funktion gibt ein Tupel zurück mit den Längen der einzelnen Dimens­ionen des Arrays

zeilen­weise Lesen und Speichern

LADEN
with open(file, 'r') as f:
    lines = f.readlines()
#lines ist ein String Array mit allen Daten

d = np.zeros((len(lines)-1, 2))
i = 0
for l in lines[1:]:
    d[i,:] = np.array([np.fromstring(l, dtype=float, sep=',')])
    i = i+1

SPEICHERN
with open('DataOut.txt', 'w') as f:
    f.writelines('x, y, z\n') #schreibe header 
    for i in range(0, len(x)):
        f.writelines('{:0.5f}, {:0.5f}, {:0.5f}\n'.format(x[i], y[i], z[i]))

Lineare und logist­ische Regression

IMPORTS
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

# Daten in Trainingsset und Testset aufteilen
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Regressionsmodell trainieren, d.h. Koeffizienten optimieren.
linreg = LinearRegression()
linreg.fit(X_train, y_train)
#analog für logistische Regression
# Logistische Regression
lr = LogisticRegression()
lr.fit(X_train, y_train)


# Measure the quality of the regression in the test data.
y_pred = linreg.predict(X_test)
r2 = r2_score(y_test, y_pred)
print("R2 on test data: {:.3f}".format(r2))

Auf neuen Datensatz anwenden

X_final = pd.read_csv("Daten_Aufgabe2/X_final.csv")
y_final = linreg.predict(X_final)
print(y_final)


from sklearn.neural_network import MLPClassifier

# Neuronales Netzwerk
mlp = MLPClassifier(hidden_layer_sizes=(100,), max_iter=1000, random_state=42)
mlp.fit(X_train, y_train)

y_pred_mlp = mlp.predict(X_test)
accuracy_mlp = accuracy_score(y_test, y_pred_mlp)

Entsch­eid­ung­sbäume

IMPORTS
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.tree import plot_tree

# 1. Daten in Testdaten und Trainingsdaten aufteilen
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 2. Entscheidungsbaum erstellen und trainieren
tree = DecisionTreeClassifier(random_state=42, max_depth=4)
tree.fit(X_train, y_train)

# 3. Vorhersagen des Baumes überprüfen
y_pred_tree = tree.predict(X_test)
accuracy_tree = accuracy_score(y_test, y_pred_tree)
print("Accuracy of classification tree on test data: {:.3f}".format(accuracy_tree))

# Entscheidungsbaum plotten
plot_tree(tree, feature_names=X.columns)
plt.savefig('decision_tree.pdf')

pandas


IMPORTS
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from evaluate import *

# Lade Daten in ein pandas Dataframe
df = pd.read_csv('periodic_table.csv')

# Zeige die ersten fünf Zeilen des Dataframes
df.head()

#Bereich von Spalten auswählen und anzeigen
df[5:10]

#Spalte auswählen (Namen eingeben)
df['Atomic_Weight']
df[['Symbol', 'Melting_Point', 'Boiling_Point']]

# Spalten ausschliessen:
df.drop(['Name', 'Atomic_Number', 'Atomic_Radius'], axis=1)

Mode und Median

def mode(data, resolution):
    # Berechnen der PMF
    x, px = PMF(data, resolution)
    # Der Wahrscheinlichste Wert ist derjenige, bei dem die PMF ein Maximum hat. 
    return x[np.argmax(px)]

------------------------------------------------------

def median(data):
    # Wir sortieren die Daten, der Median entspricht dem Datenpunkt in der Mitte.
    data_sorted = np.sort(data)
    if len(data) % 2 != 0:
        median = data_sorted[len(data)//2]
    # Bei ungerader Anzahl Datenpunkten mitteln wir über die beiden benachbarten Punkte.
    else:
        median = (data_sorted[len(data)//2] + data_sorted[len(data)//2 - 1]) / 2
    return median

Probab­ility Mass Function

def PMF(data, resolution):
    # Definieren der Bins und Berechnen des Histogramms
    # Wir addieren resolution / 1000 zur Obergrenze, um sicherzustellen, dass der letzte Wert auch im Array ist.
    bin_centers = np.arange(np.min(data), np.max(data) + resolution / 1000, resolution)
    bin_edges = np.linspace(bin_centers[0] - resolution / 2,
                            bin_centers[-1] + resolution / 2,
                            len(bin_centers) + 1)
    
    hist, _ = np.histogram(data, bin_edges)
    
    # Normieren
    px = hist / np.sum(hist)
    
    return bin_centers, px

Bandpass Filter

def ffilter(t, A, fmin, fmax):
    N = len(t)
    dt = t[1] - t[0]
    f = np.fft.fftfreq(N, dt)
    
    spectrum = np.fft.fft(A)
    
    for i,freq in enumerate(f):
        if abs(freq) < fmin or abs(freq) > fmax:
            spectrum[i] = 0
    
    return np.fft.ifft(spectrum)

Binomi­alv­ert­eilung

def binomial(n, k, p):
    return scipy.special.binom(n,k)pk(1-p)(n-k)

Tiefpa­ssf­ilter durch Mitteln

def LP_filter(x_sample, N_num):
    # N_num ist die Anzahl Werte vor und nach jedem originalen Wert, die gemittelt werden
    N_av = 2*N_num+1 # Filterlänge
    n_x = len(x_sample) # Anzahl des Messwerte in x
    x_filtered = x_sample.copy() # wir erstellen eine Kopie von x, um die neuen Werte hineinzuschreiben
    for n in range(N_num,n_x-N_num): # wir ignoriernen wir N_num ersten und letzte Werte
        x_filtered[n] = sum(x_sample[n-N_num:n+N_num+1])/N_av # Mittelwert
    return x_filtered

Spektrale Leistu­ngs­dic­htige

from scipy import signal

#f_samling = 1/sampling time

f,PSDx = scipy.signal.periodogram(U_mess,f_sampling,return_onesided=True,scaling='density')

alternative Berechnung

from numpy.fft import fftfreq, fft, ifft

data = np.loadtxt('autocorrelation_laser.txt')
t = data[:, 0] * 1e-12  # in ps abgespeichert. Wir konvertieren in s
signal = data[:, 1]

# Zeitauflösung und Länge des Signals berechnen
dt = t[1] - t[0]
N = len(t)

# Fouriertransformation
frequency = fftfreq(N, d=dt)
spectrum = fft(signal)

# Spektrale Leistungsdichte
psd = dt / N  np.abs(spectrum)*2

Fourier Rücktransformation: 
singal = np.fft.ifft(spectrum). 
np.real(signal)

Fourie­ran­alyse

Sei t das Zeit Array und V das Signal Array
 N = len(t)
dt = t[1] -t[0]
 f_ny = 1 / (2 * (t[1] - t[0]))
Nyquis­t-F­requenz
df = 1 / t[-1]
Freque­nza­ufl­ösung
f = np.fft.ff­tfr­eq(N, dt)
Berechnen der geordneten Freque­nza­chse: welche Frequenzen können vorkommen
spectrum = np.fft.fft(V)
Fourie­rta­nsf­orm­ation (Ampli­tuden der entspr­ech­enden Freque­nzen)
psd = dt / N  np.abs­(sp­ectrum)*2
Spektrale Leisun­gsd­ichte

Fourie­rtr­ans­for­mation

Koeffizienten für eine Frequenz bestimmen


def CN(x,f):
    Xn = 0
    for n in range(N):
        Xn += x[n]  cmath.exp(-1j2np.pif*n)
    return Xn

fc = 0.022  #f_sig1

print(CN(x,fc))
#print(CN(U,-fc))

Kovarianz und Autoko­varianz


 C = np.stack((U1_mess,U3_mess), axis=0)
 np.cov(C) #Kovarianzmatirx
 np.corrcoef(C) #Koeffizienten

AUTOKOVARIANZFUNKTION
def Rxx(x, delta):
    xm = np.mean(x)
    dev_sum = 0
    for i in range(len(x) - delta):
        dev_sum += (x[i] - xm) * (x[i + delta] - xm)
    return dev_sum / (len(x) - delta)

numpy Befehle

np.min­(array)
Minimum
np.mean(x)
Mittelwert von Array x
np.std(x)
Standa­rta­bwe­ichung von Array x
np.abs(x)
Betrag
np.sor­t(a­rray)
gibt sortiertes array zurück
np.dif­f(a­rray)
gibt differ­enz­-array zurück

Histogramm



V = Spannungswerte

#Wähle Bingrösse und erstelle einzelne bins
binsize = 0.01
bins = np.arange(np.min(V), np.max(V)+1, binsize)

hist, b = np.histogram(V, bins) #hist: häufigkeiten, b: array mit bin_edges

#plotte normal balken (breite kleiner als binsize)
fig = plt.figure(figsize=(30cm, 25.5cm))
ax1 = fig.add_subplot(2,2,1)
ax1.bar(bins[:-1], hist, width=0.8*binsize)
ax1.set_title('Binsize: {:.2f}V'.format(binsize))
Messe diskrete Werte für Spannung, Histogramm zeigt, wie oft welche Spannung gemessen wurde.

Auflösung

def extract_resolution(measured_values):
    '''Extract smallest difference between two unique values in an array.
    Values are treated as unique if their absolute difference is greater than the tolerance.'''
    
    sorted_values = np.sort(measured_values)
    differences = np.diff(sorted_values)
    sorted_differences = np.sort(np.abs(differences))
    resolution = -1
    
    tolerance = np.max(np.abs(measured_values)) * 1e-10  # Gleitkommavergleich
    for diff in sorted_differences:
        if diff > tolerance:
            resolution = diff
            break  

    return resolution