Einführung in nbinteract

1.) Erstellen eines Git Accounts und eines Reposetories

Gehen sie auf https://github.com/ und erstellen sie sich ein Account sowie ein Reposetory.

Benennen wir das Repo als "wmd"

- Das Repo muss aud Public stehen 
- Das Repo muss mit einer README initialisiert werden

Nachfolgend ist in die Einstellungen des Repos zu sehen

2.) Initialisieren des Reposetories auf mybinder.org

Gehen sie auf http://mybinder.org/ und initialisieren sie ihr Reposetory. Geben sie hierzu den Pfad ihres Gits ein

Nachfolgend öffnet der Binder Server eine Jupyter Notebook Fenster in dem sie den Ihr Aotebook online ohne offline Installation von Jupyter Notebook benötigen

In diesem Beispiel betrachten wir jedoch die Verwendung mit einem offline am PC intsalliertn Jupyter Notebook

3.) Clonen des Reposetories (local)

Hierzu sollten sie zunächst ihr Reposetory local clonen. Öffnen sie ein Terminal (z.B. Anaconda Prompt Shell).

Hinweis: Sollten sie noch nie mit Git gearbeitet haben sollten sie zunächst Git im Terminal installieren.

Im Fall von Anaconda:

terminal
conda install -c anaconda git

Nachfolgenden können Sie die das Repo in ihren gewünschten Ordner clonen

terminal
# Clone the repo
{your folder}: git clone https://github.com/{username}/wmd
# Move into the repo directory
cd wmd
# Start Jupyter
jupyter notebook

4.) Installieren und Initialisieren von nbinteract

Gehen sie wieder in das locale Terminal. Hier ab besten das Terminal in Jupyter drirekt

Installieren sie nbinteract:

pip install nbinteract

Gehen sie im Terminal nun in den Ordner in dem sich auch das Repo befindet (über cd {yourpath})

Initialisieren sie nun ihr Verzeichnismit folgender Eingabe:

Initializes nbinteract.

nbinteract init

git add -A git commit -m "Setup nbinteract" git push origin master

Nun sollte sich in ihrem localen Verzeichnis eine requirements.txt erstellt haben in dieser sollten sie alle benutzen pakete eintragen z.b. numpy

Erstellen eines ersten Notebooks

Zunächst erstellen wir eine Notebook was interaktiv auf die Eingabe der Benutzer reagiert. Hierzu gibt es ein generelles vorgehen.

- Import aller benötigten Pakete 
- Erstellung von Funktionen die später interaktiv in der Html Seite aus-geführt werden sollen 
- Aufruf der geeigneten Eingabemethode

IMPORT

from ipywidgets import interact
import nbinteract as nbi

BSP 1: Flächenberechnung mittels Schieberegler

Wir wollen berechnen

$$A=a*b$$

Erstellen der Funktion mittels def

def square(a,b):
    return 'Die Fläche A beträgt {} m^2'.format(a * float(b))

Erstellen der Eingabemaske 2 Beispiele

# nbi:left
interact(square, a=(0,100,5),b='1.5');
# nbi:right
interact(square, a=(0,100,5),b={'One': 1, 'Five': 5, 'Ten': 10});

BSP 1: Funktion Plotten mittels Schieberegler

Wir wollen berechnen

$$f(x)=a\cdot x+b$$

oder

$$f(x)=a\cdot x^2+b*x + c$$

und anschließend plotten

Einbinden des Matplotlib paketes

Hinweis: Binden sie das Paket auch in die requierements.txt ein --> hier einfach ''matplotlib'' eintragen

import matplotlib.pyplot as plt 
%matplotlib inline
import numpy as np

Erstellen der Funktion

def lin(a,b,x):
    return a*x+b
def quad(a,b,c,x):
    return a*x**2+b*x+c

Erstellen der Plot funktion

def funk_plot(Bereich,Funktion,a,b,c=0):
    x=np.zeros(int(Bereich)*100)
    y=np.zeros(int(Bereich)*100)
    for i in range(0,int(Bereich)*100):
        x[i]=i/100
        if Funktion =='Linear':
            y[i]=lin(a,b,x[i])
            title='Lineare'
            label='$f(x)=$'+str(a)+'$\cdot x+$'+str(b)
        if Funktion =='Quadratisch':
            y[i]=quad(a,b,c,x[i])
            title='Quadratische'
            label='$f(x)=$'+str(a)+'$\cdot x^2+$'+str(b)+'$\cdot x+$'+str(c)
           
    plt.plot(x,y, label=r'Funktion: '+label)
    plt.title(title+'-Funktion') 
    plt.xlabel('$x$')
    plt.ylabel('$y$')
    plt.legend()
    plt.grid()
    plt.show()

Testen der beiden Funktion (statisch)

funk_plot(10,'Linear',1,2)
funk_plot(10,'Quadratisch',1,2,3)

Erstellen der Interaktiven Funktionen

interact(funk_plot,a=(0,100,5),b=(0,100,5),c=(0,100,5),Bereich='10',Funktion={'Quadratisch','Linear'})
<function __main__.funk_plot(Bereich, Funktion, a, b, c=0)>

Versteckte Funktionen in gesonderten Datein

Um eine übersuchtliche Seite zu erstellen gliedern wir Funktionben aus und speichern Sie in eine gesonderte .py Datei ab um sie später für interaktive felder zu nutzen.

Die Idee:

Wir möchen Nachfolgenden Code (Funktion und Sinn irrelevant) komplett auserhalb des Notebooks laufen lassen aber die Ausgabe mit variabel einzustellenden Werten innerhallb des Notebooks haben.

import random as rd
from numpy import sqrt,zeros
from matplotlib.pyplot import plot,close

close
def huge_plot(E=70000,SIG_Y=300 ,v=0.3,eta_min=-0.005,eta_max=0.005,NC=500):
    eta_min=float(eta_min)
    eta_max=float(eta_max)
    G=float(E)/(2.*(1+v))
    SIG_R_1=zeros(NC)
    SIG_G_1=zeros(NC)
    SIG_R_2=zeros(NC)
    SIG_G_2=zeros(NC)
    for i in range(1,NC):
       EPS_XX=rd.uniform(eta_min,eta_max)
       EPS_YY=rd.uniform(eta_min,eta_max)
       GAM_XY=rd.uniform(eta_min,eta_max)
       SIG_XX=(E/(1-v**2))*(EPS_XX+v*EPS_YY)
       SIG_YY=(E/(1-v**2))*(EPS_YY+v*EPS_XX)
       TAU_XY=G*GAM_XY    
       SIG_1=((SIG_XX+SIG_YY)/2)+sqrt(((SIG_XX-SIG_YY)/2)**2+TAU_XY**2)
       SIG_2=((SIG_XX+SIG_YY)/2)-sqrt(((SIG_XX-SIG_YY)/2)**2+TAU_XY**2)
       SIG_v3=sqrt(0.5*((SIG_1-SIG_2)**2+SIG_1**2+SIG_2**2))
       f=SIG_v3-SIG_Y   
       if f<0:
           SIG_G_1[i]=SIG_1
           SIG_G_2[i]=SIG_2
       elif f>0: 
           SIG_R_1[i]=SIG_1
           SIG_R_2[i]=SIG_2       
    plot(SIG_G_1,SIG_G_2,'go')
    plot(SIG_R_1,SIG_R_2,'ro')  
    plot(-SIG_G_1,-SIG_G_2,'go')
    plot(-SIG_R_1,-SIG_R_2,'ro')     
interact(huge_plot,eta_min='-0.005',eta_max='0.005')
<function __main__.huge_plot(E=70000, SIG_Y=300, v=0.3, eta_min=-0.005, eta_max=0.005, NC=500)>

Importieren einer verstekten Funktion aus einem gesonderten Notebook und gleichzeitiges ausführen durch "if name =='main':" Zeile

%run wmdfunctions.ipynb #Jupyternotebook Datei

Sind mehrer Funktionen zu versteken sollte ein Python Skript angelegt werden und dieses als Modul importiert werden. Nun kann die in der verstekten Datei vorhandene Funktion huge_plot_2 ausgeführt werden. Diese ist exakt die gleiche wie in dem vorherigen Code-Abschnitt

import hiddencode as hd#Python Skript
# Aufrufen der Funktion 
hd.huge_plot_2(E=800)

Ausblenden von Code um Interaktionen zu erlauben

Sobald sich jedoch der Code nicht in dem Notebook befindet das später in eine HTML umgewandelt werden soll können wir keine interaktiven Module einbauen. Dies ist geschuldet dadurch das der dezedierte Code nur einmalig ausgeführt wird. Hierzu können jedoch die Metadaten der einzelnen Zellen beeinflusst werde. Nbinteract bietet hierzu den Befehl:

# nbi:hide_in

#some code 
import ... as ..
a=b

Dieser wird einfach vor den code gesetzt

# nbi:hide_in

import random as rd
from numpy import sqrt,zeros
from matplotlib.pyplot import plot,close

close
def huge_plot_3(E=70000,SIG_Y=300 ,v=0.3,eta_min=-0.005,eta_max=0.005,NC=500):
    eta_min=float(eta_min)
    eta_max=float(eta_max)
    G=float(E)/(2.*(1+v))
    SIG_R_1=zeros(NC)
    SIG_G_1=zeros(NC)
    SIG_R_2=zeros(NC)
    SIG_G_2=zeros(NC)
    for i in range(1,NC):
       EPS_XX=rd.uniform(eta_min,eta_max)
       EPS_YY=rd.uniform(eta_min,eta_max)
       GAM_XY=rd.uniform(eta_min,eta_max)
       SIG_XX=(E/(1-v**2))*(EPS_XX+v*EPS_YY)
       SIG_YY=(E/(1-v**2))*(EPS_YY+v*EPS_XX)
       TAU_XY=G*GAM_XY    
       SIG_1=((SIG_XX+SIG_YY)/2)+sqrt(((SIG_XX-SIG_YY)/2)**2+TAU_XY**2)
       SIG_2=((SIG_XX+SIG_YY)/2)-sqrt(((SIG_XX-SIG_YY)/2)**2+TAU_XY**2)
       SIG_v3=sqrt(0.5*((SIG_1-SIG_2)**2+SIG_1**2+SIG_2**2))
       f=SIG_v3-SIG_Y   
       if f<0:
           SIG_G_1[i]=SIG_1
           SIG_G_2[i]=SIG_2
       elif f>0: 
           SIG_R_1[i]=SIG_1
           SIG_R_2[i]=SIG_2       
    plot(SIG_G_1,SIG_G_2,'go')
    plot(SIG_R_1,SIG_R_2,'ro')  
    plot(-SIG_G_1,-SIG_G_2,'go')
    plot(-SIG_R_1,-SIG_R_2,'ro') 
interact(huge_plot_3,E=600,eta_min='-0.005',eta_max='0.005')
<function __main__.huge_plot_3(E=70000, SIG_Y=300, v=0.3, eta_min=-0.005, eta_max=0.005, NC=500)>

Und wir sehen nur noch die Ausgabe.

So kann z.B. eine Interaktive Seite wie folgt aussehen

Beispile Seite ohne Code