Python Workshop
av Peder Bergebakken Sundt og Torje Hoås Digernes
Programvareverkstedets
Plan
- Om scipy
- Matplotlib
- Pandas
- Numpy
- Ipython
- Linalg
- Distributive funksjoner
-
Eksempel
- Dekomponering
- Diagonalisering og transisjonsmatriser
- Enkelt plott
- Merkelapper
- Plot-titler
Intro
Matplotlib
Numpy
Least squares i numpy
En funksjon for ditt formål
Klarte ikke lage en egnet oppg :(
- Lesing fra csv/excel
- Dataframes
- Pulsdata
Pandas
Om scipy
Paraplyprosjekt for flere
- Matplotlib
- Numpy
- Pandas
- IPyhton
- Sympy
Matplotlib
- Grafer og plot
- Visualisering
Numpy
- Numerikk i python
- Distributive mattefunksjoner
import numpy
import numpy.linalg as linalg
A = numpy.reshape(numpy.array([1,2,-1,3]),(2,2))
e,v = linalg.eig(A)
vi = linalg.inv(v)
print(vi)
A2 = numpy.matmul(numpy.matmul(v,numpy.diag(e)),vi)
print(numpy.round(A2,10))
Pandas
- Leser data for deg
- Dataframes
import pandas
import matplotlib.pyplot as plt
data_frame = pandas.read_csv("Torje_pulsdata.csv",header=2)
print( data_frame[0:-1][0:5] )
data_frame = data_frame.drop(labels=["Stride length (m)","Cadence","Altitude (m)","Power (W)", "Temperatures (C)","Unnamed: 11"], axis=1)
print( data_frame[0:-1][0:5] )
#print(pandas.to_datetime(data_frame["Time"]))
data_frame["Time"]= pandas.to_datetime(data_frame["Time"])
plt.plot(data_frame["Time"], data_frame[["HR (bpm)","Speed (km/h)"]])
plt.show()
IPython
- Et python-skall for utforskning
De andre pakkene kan være nyttige
- Scipy - numeriske metoder for optimalisering og signalbehandling.
- Sympy - symbolsk matematikk, høres nyttig ut, men jeg kan ikke hjelpe noe særlig.
Installere
Om dere lastet ned fra python.org
pip3.exe install matplotlib
Om dere installerte via anaconda, så skal visst dette være installert for dere
(Windows)
Installere
Om dere lastet ned fra python.org
pip3 install numpy matplotlib scipy pandas
Om dere installerte via anaconda, så skal visst dette være installert for dere
MacOs
pip3 installasjon
Matplotlib
Virker det?
import matplotlib.pyplot as plt
from math import pi, sin
xs = [ i*0.01 for i in range( 0 , 2*314 )]
ys = [ sin(x) for x in xs ]
plt.plot(xs,ys)
plt.show()
Prøv dette i IDLE (kopier innholdet i matplotlib_test.py) og lim inn
Matplotlib
Hva er delene?
import matplotlib.pyplot as plt
from math import pi, sin
xs = [ i*0.01 for i in range( 0 , 2*314 )]
ys = [ sin(x) for x in xs ]
plt.plot(xs,ys)
plt.show()
Matplotlib
Marger
Lagre
Matplotlib
Vi kan nå både lage og lagre et enkelt plot
Matplotlib
import matplotlib.pyplot as plt
from math import pi, sin
xs = [ i*0.01 for i in range( 0 , 2*314 )]
ys = [ sin(x) for x in xs ]
plt.plot(xs,ys) # Vi gir data som skal plottes
plt.show() # Først nå vises dataen
Et enkelt plot
Matplotlib
import matplotlib.pyplot as plt
from math import pi, sin
xs = [ i*0.01 for i in range( 0 , 2*314 )]
ys = [ sin(x) for x in xs ]
plt.plot(xs,ys)
plt.savefig("sinus.png")
Dette kan også gjøres programmatisk
pyplot.savefig(filnavn)
Matplotlib
Vi mangler noen elementer:
- Figurtittel
- Aksebeskrivlse
- Legende
Matplotlib
import matplotlib.pyplot as plt
from math import pi, sin
xs = [ i*0.01 for i in range( 0 , 2*314 )]
ys = [ sin(x) for x in xs ]
plt.plot(xs,ys) # Vi gir data som skal plottes
plt.title("Enkelt plot") # Figurtittel
plt.xlabel("Tid [s]") # x-aksens tittel
plt.ylabel("Bølgehøyde [m]") # y-aksens tittel
plt.show() # Først nå vises dataen
Et enkelt plot
Matplotlib
import matplotlib.pyplot as plt
from math import pi, sin
xs = [ i*0.01 for i in range( 0 , 2*314 )]
ys = [ sin(x) for x in xs ]
plt.plot(xs,ys,label="line 1" ) # Vi gir data som skal plottes
plt.title("Enkelt plot") # Figurtittel
plt.xlabel("Tid [s]") # x-aksens tittel
plt.ylabel("Bølgehøyde [m] CO$_2 $") # y-aksens tittel
plt.legend(loc = "lower right")
plt.show() # Først nå vises dataen
Et enkelt plot, med legende
Matplotlib
import matplotlib.pyplot as plt
from math import pi, sin
xs = [ i*0.01 for i in range( 0 , 2*314 )]
ys = [ sin(x) for x in xs ]
plt.plot(xs,ys)
plt.title("Utvikling av sinus")
plt.savefig("sinus.png")
Tittel er ganske greit.
Matplotlib
import matplotlib.pyplot as plt
from math import pi, sin
xs = [ i*0.01 for i in range( 0 , 2*314 )]
ys = [ sin(x) for x in xs ]
plt.plot(xs,ys)
xs2 = [ i*0.1 for i in range( 0 , 2*32 )]
ys2 = [ -sin(x) for x in xs2 ]
plt.plot(xs2,ys2,"-+")
plt.show()
Matplotlib
linjeplot
Akser
Matplotlib
Liten oppgave:
Lag en funksjon som tar inn en tittel, data for x-aksen og y-aksen og lager et plot av det.
Matplotlib
import matplotlib.pyplot as plt
def simplePlot( title, xdata, ydata):
plt.plot(xdata,ydata)
plt.title(title)
plt.show()
simplePlot("Rare data", [1,2,3],[3,1,2])
Numpy
Eksempel for å sjekke om modulen virker
from numpy.fft import fft
from numpy import arange,sin,pi
sig = fft(sin(arange(0,2*pi,0.01)))
Numpy
- Numerikk i python
- Distributive funksjoner (virker på lister og lignende)
- Lineær algebra
- Dekomponering
Numpy
Distributive funksjoner
from math import sin,pi
xs = [ 0.01*i for i in range( 0, 314) ]
ys = [ sin(x) for x in xs ]
print(ys)
from numpy import sin, arange, pi
xs = arange(0,pi,0.01)
ys = sin(xs)
print(ys)
Vanlig Python
Med Numpy
Linalg
Finnes i to deler, den enkle finnes direkte i numpy.
numpy.matmul( a , b)
import numpy
a = [[1,2],[-1,3]]
b = [[1,2],[3,4]]
c = numpy.matmul(a,b)
print(c)
Dekomponering
Egenverdier
import numpy
import numpy.linalg as linalg
A = numpy.reshape(numpy.array([1,2,-1,3]),(2,2))
e,v = linalg.eig(A)
vi = linalg.inv(v)
print(vi)
A2 = numpy.matmul(numpy.matmul(v,numpy.diag(e)),vi)
print(numpy.round(A2,10))
Pandas
Formål
- Lese og skrive data
- Excel, csv, hdf samme interface
- Alt leses inn til DataFrames
Pandas
Virker det?
- Du trenger nå en enkel csv-fil,
import pandas
import os
from os.path import expanduser
home = expanduser("~")
os.chdir(home)
file = open("panda_test_pvv_kurs.csv","w")
file.write("navn,alder\n")
file.write("kari,29\n")
file.write("ola,28\n")
file.close()
doc = pandas.read_csv("panda_test_pvv_kurs.csv")
print(doc["navn"])
Pandas
- de to øverste linjene er imports, men den andre er ikke veldig viktig
- de tre neste linjene er for å bytte arbeidskatalog til hjemmemappen
- så åpner vi og skriver til en csv-fil, (Comma Separated Values) og lukker filen
- de to siste leser inn filen vi nettopp skrev, men nå som en Dataframe
import pandas
import os
from os.path import expanduser
home = expanduser("~")
os.chdir(home)
file = open("panda_test_pvv_kurs.csv","w")
file.write("navn,alder\n")
file.write("kari,29\n")
file.write("ola,28\n")
file.close()
doc = pandas.read_csv("panda_test_pvv_kurs.csv")
print(doc["navn"])
Pulsdata
import pandas as pd
import matplotlib.pyplot as plt
dataframe = pd.read_csv('Torje+Hos_Digernes_2018-04-04_15-35-03.csv', skiprows=2,parse_dates=['Time'])
plt.plot(dataframe["Time"],dataframe[["HR (bpm)"]])
axes2 = plt.twinx()
axes2.plot(dataframe["Time"],dataframe[["Speed (km/h)"]], color="red")
plt.show()
Legend outside the plot
This solution works for 4 labels, if the labels are short enough.
It gets a bit more complicated for more labels, as we need to rescale the axes to fit.
import matplotlib.pyplot as plt
import numpy as np
xs = np.arange(0, 2 * np.pi, 0.01)
ys1 = np.sin(xs)
ys2 = np.cos(xs)
plt.plot(xs, ys1, label="sine")
plt.plot(xs, ys2, label="cosine")
plt.legend(loc="lower left",
mode="expand",ncol=2,
bbox_to_anchor=(0.0,1.0,1.0,1.0))
plt.show()
We should probably use the more complex solution always, as this puts it outside the borders we started with.
Legend outside the plot
import matplotlib.pyplot as plt
import numpy as np
xs = np.arange(0, 2 * np.pi, 0.01)
ys1 = np.sin(xs)
ys2 = np.cos(xs)
plt.plot(xs, ys1, label="sine")
plt.plot(xs, ys2, label="cosine")
plt.legend(loc="lower left",
mode="expand",ncol=2,
bbox_to_anchor=(0.0,1.0,1.0,1.0))
plt.show()
Python del 2: Scipy
By torjehoa
Python del 2: Scipy
- 518