Skip to content
Snippets Groups Projects
Commit 708d13b0 authored by Christof Kaufmann's avatar Christof Kaufmann
Browse files

Notebooks from applied-cs/data-science@37de694d

parent 4e8a31d9
Branches
No related tags found
No related merge requests found
%% Cell type:markdown id:0008-807056fbb7dc9180c1cef92d674cbb5d4cbfcaa19fc89cabde2b2821b8c tags:
# Old Faithful Geysir
![](attachment:old-faithful.jpg "Gemälde des Old Faithful Geysir")
Der Old Faithful Geysir ist ein Geysir im Yellowstone-Nationalpark in
den USA. Er ist bekannt für seine regelmäßigen Ausbrüche, die alle 34
bis 125 Minuten auftreten und 1.5 bis 5 min andauern. Der Geysir kann
Wasser bis zu einer Höhe von 56 Metern ausstoßen.
## a) Einlesen und einfache Statistik
In der Datei `old-faithful-1938.csv` sind 272 aufeinanderfolgende Daten
von 1938 zu Eruptionen des Old Faithful Geysirs gespeichert. Die Spalten
sind:
- `eruption_duration`: Dauer des Ausbruchs in Minuten
- `waiting_time`: Zeit bis zum nächsten Ausbruch in Minuten
Lesen Sie die Daten mit Pandas ein und ermitteln Sie die kürzeste,
längste und mittlere Wartezeit bis zur nächsten Eruption.
### Lösung zu a)
Wir laden zunächst die Daten:
%% Cell type:code id:0009-b55382a5d67a7d482fceb0474f9df51e36848047f1fd89b487ae10cdd03 tags:
```
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
df1 = pd.read_csv('old-faithful-1938.csv')
```
%% Cell type:markdown id:0010-0e9af1d0355bcff4f08204299d01a4f4d0a305729d374a1e85ab8e97d48 tags:
Nun können wir die Werte mit `min`, `max` und `mean` ermitteln:
%% Cell type:code id:0011-46bbabe4d35d2f1fe47dc7062500f23e6553edba827c1f11a9ed93e81d6 tags:
```
shortest = df1['waiting_time'].min()
longest = df1['waiting_time'].max()
average = df1['waiting_time'].mean()
```
%% Cell type:markdown id:0013-a201a2eb23ee94cf852ac27a8e841d0555ed7620cd8a5851967c742baba tags:
### Tests zu a)
Hier eine Ausgabe mit den statischen Werten:
%% Cell type:code id:0014-9138aae2c7a798439e7af9c10aaea671af179a5f4494248d429f09101f0 tags:
```
print("Old Faithful bricht alle", shortest, "bis", longest, "min und alle", average, "min im Mittel aus.")
```
%% Output
Old Faithful bricht alle 43 bis 96 min und alle 70.8970588235294 min im Mittel aus.
%% Cell type:markdown id:0021-e2cf21287fd774120df13b7ccb89959512a5f8e6cd4e5c083b174637554 tags:
## b) Messdauer
<p><img
src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNDI2LjI3N3B0IiBoZWlnaHQ9IjQ0Ljk0NnB0IiB2aWV3Qm94PSIwIDAgNDI2LjI3NyA0NC45NDYiIHZlcnNpb249IjEuMSI+CjxkZWZzPgo8Zz4KPHN5bWJvbCBvdmVyZmxvdz0idmlzaWJsZSIgaWQ9ImdseXBoMC0wIj4KPHBhdGggc3R5bGU9InN0cm9rZTpub25lOyIgZD0iIi8+Cjwvc3ltYm9sPgo8c3ltYm9sIG92ZXJmbG93PSJ2aXNpYmxlIiBpZD0iZ2x5cGgwLTEiPgo8cGF0aCBzdHlsZT0ic3Ryb2tlOm5vbmU7IiBkPSJNIDIuODkwNjI1IC0zLjUxNTYyNSBDIDMuNzAzMTI1IC0zLjc4MTI1IDQuMjgxMjUgLTQuNDY4NzUgNC4yODEyNSAtNS4yNjU2MjUgQyA0LjI4MTI1IC02LjA3ODEyNSAzLjQwNjI1IC02LjY0MDYyNSAyLjQ1MzEyNSAtNi42NDA2MjUgQyAxLjQ1MzEyNSAtNi42NDA2MjUgMC42ODc1IC02LjA0Njg3NSAwLjY4NzUgLTUuMjgxMjUgQyAwLjY4NzUgLTQuOTUzMTI1IDAuOTA2MjUgLTQuNzY1NjI1IDEuMjAzMTI1IC00Ljc2NTYyNSBDIDEuNSAtNC43NjU2MjUgMS43MDMxMjUgLTQuOTg0Mzc1IDEuNzAzMTI1IC01LjI4MTI1IEMgMS43MDMxMjUgLTUuNzY1NjI1IDEuMjM0Mzc1IC01Ljc2NTYyNSAxLjA5Mzc1IC01Ljc2NTYyNSBDIDEuMzkwNjI1IC02LjI2NTYyNSAyLjA0Njg3NSAtNi4zOTA2MjUgMi40MDYyNSAtNi4zOTA2MjUgQyAyLjgyODEyNSAtNi4zOTA2MjUgMy4zNzUgLTYuMTcxODc1IDMuMzc1IC01LjI4MTI1IEMgMy4zNzUgLTUuMTU2MjUgMy4zNDM3NSAtNC41NzgxMjUgMy4wOTM3NSAtNC4xNDA2MjUgQyAyLjc5Njg3NSAtMy42NTYyNSAyLjQ1MzEyNSAtMy42MjUgMi4yMDMxMjUgLTMuNjI1IEMgMi4xMjUgLTMuNjA5Mzc1IDEuODkwNjI1IC0zLjU5Mzc1IDEuODEyNSAtMy41OTM3NSBDIDEuNzM0Mzc1IC0zLjU3ODEyNSAxLjY3MTg3NSAtMy41NjI1IDEuNjcxODc1IC0zLjQ2ODc1IEMgMS42NzE4NzUgLTMuMzU5Mzc1IDEuNzM0Mzc1IC0zLjM1OTM3NSAxLjkwNjI1IC0zLjM1OTM3NSBMIDIuMzQzNzUgLTMuMzU5Mzc1IEMgMy4xNTYyNSAtMy4zNTkzNzUgMy41MzEyNSAtMi42ODc1IDMuNTMxMjUgLTEuNzAzMTI1IEMgMy41MzEyNSAtMC4zNDM3NSAyLjg0Mzc1IC0wLjA2MjUgMi40MDYyNSAtMC4wNjI1IEMgMS45Njg3NSAtMC4wNjI1IDEuMjE4NzUgLTAuMjM0Mzc1IDAuODc1IC0wLjgxMjUgQyAxLjIxODc1IC0wLjc2NTYyNSAxLjUzMTI1IC0wLjk4NDM3NSAxLjUzMTI1IC0xLjM1OTM3NSBDIDEuNTMxMjUgLTEuNzE4NzUgMS4yNjU2MjUgLTEuOTIxODc1IDAuOTg0Mzc1IC0xLjkyMTg3NSBDIDAuNzM0Mzc1IC0xLjkyMTg3NSAwLjQyMTg3NSAtMS43ODEyNSAwLjQyMTg3NSAtMS4zNDM3NSBDIDAuNDIxODc1IC0wLjQzNzUgMS4zNDM3NSAwLjIxODc1IDIuNDM3NSAwLjIxODc1IEMgMy42NTYyNSAwLjIxODc1IDQuNTYyNSAtMC42ODc1IDQuNTYyNSAtMS43MDMxMjUgQyA0LjU2MjUgLTIuNTE1NjI1IDMuOTIxODc1IC0zLjI5Njg3NSAyLjg5MDYyNSAtMy41MTU2MjUgWiBNIDIuODkwNjI1IC0zLjUxNTYyNSAiLz4KPC9zeW1ib2w+CjxzeW1ib2wgb3ZlcmZsb3c9InZpc2libGUiIGlkPSJnbHlwaDAtMiI+CjxwYXRoIHN0eWxlPSJzdHJva2U6bm9uZTsiIGQ9Ik0gMS4zMTI1IC0zLjI2NTYyNSBMIDEuMzEyNSAtMy41MTU2MjUgQyAxLjMxMjUgLTYuMDMxMjUgMi41NDY4NzUgLTYuMzkwNjI1IDMuMDYyNSAtNi4zOTA2MjUgQyAzLjI5Njg3NSAtNi4zOTA2MjUgMy43MTg3NSAtNi4zMjgxMjUgMy45Mzc1IC01Ljk4NDM3NSBDIDMuNzgxMjUgLTUuOTg0Mzc1IDMuMzkwNjI1IC01Ljk4NDM3NSAzLjM5MDYyNSAtNS41NDY4NzUgQyAzLjM5MDYyNSAtNS4yMzQzNzUgMy42MjUgLTUuMDc4MTI1IDMuODQzNzUgLTUuMDc4MTI1IEMgNCAtNS4wNzgxMjUgNC4zMTI1IC01LjE3MTg3NSA0LjMxMjUgLTUuNTYyNSBDIDQuMzEyNSAtNi4xNTYyNSAzLjg3NSAtNi42NDA2MjUgMy4wNDY4NzUgLTYuNjQwNjI1IEMgMS43NjU2MjUgLTYuNjQwNjI1IDAuNDIxODc1IC01LjM1OTM3NSAwLjQyMTg3NSAtMy4xNTYyNSBDIDAuNDIxODc1IC0wLjQ4NDM3NSAxLjU3ODEyNSAwLjIxODc1IDIuNSAwLjIxODc1IEMgMy42MDkzNzUgMC4yMTg3NSA0LjU2MjUgLTAuNzE4NzUgNC41NjI1IC0yLjAzMTI1IEMgNC41NjI1IC0zLjI5Njg3NSAzLjY3MTg3NSAtNC4yNSAyLjU2MjUgLTQuMjUgQyAxLjg5MDYyNSAtNC4yNSAxLjUxNTYyNSAtMy43NSAxLjMxMjUgLTMuMjY1NjI1IFogTSAyLjUgLTAuMDYyNSBDIDEuODc1IC0wLjA2MjUgMS41NzgxMjUgLTAuNjU2MjUgMS41MTU2MjUgLTAuODEyNSBDIDEuMzI4MTI1IC0xLjI4MTI1IDEuMzI4MTI1IC0yLjA3ODEyNSAxLjMyODEyNSAtMi4yNSBDIDEuMzI4MTI1IC0zLjAzMTI1IDEuNjU2MjUgLTQuMDMxMjUgMi41NDY4NzUgLTQuMDMxMjUgQyAyLjcxODc1IC00LjAzMTI1IDMuMTcxODc1IC00LjAzMTI1IDMuNDg0Mzc1IC0zLjQwNjI1IEMgMy42NTYyNSAtMy4wNDY4NzUgMy42NTYyNSAtMi41MzEyNSAzLjY1NjI1IC0yLjA0Njg3NSBDIDMuNjU2MjUgLTEuNTYyNSAzLjY1NjI1IC0xLjA2MjUgMy40ODQzNzUgLTAuNzAzMTI1IEMgMy4xODc1IC0wLjEwOTM3NSAyLjczNDM3NSAtMC4wNjI1IDIuNSAtMC4wNjI1IFogTSAyLjUgLTAuMDYyNSAiLz4KPC9zeW1ib2w+CjxzeW1ib2wgb3ZlcmZsb3c9InZpc2libGUiIGlkPSJnbHlwaDAtMyI+CjxwYXRoIHN0eWxlPSJzdHJva2U6bm9uZTsiIGQ9Ik0gNC43NSAtNi4wNzgxMjUgQyA0LjgyODEyNSAtNi4xODc1IDQuODI4MTI1IC02LjIwMzEyNSA0LjgyODEyNSAtNi40MjE4NzUgTCAyLjQwNjI1IC02LjQyMTg3NSBDIDEuMjAzMTI1IC02LjQyMTg3NSAxLjE3MTg3NSAtNi41NDY4NzUgMS4xNDA2MjUgLTYuNzM0Mzc1IEwgMC44OTA2MjUgLTYuNzM0Mzc1IEwgMC41NjI1IC00LjY4NzUgTCAwLjgxMjUgLTQuNjg3NSBDIDAuODQzNzUgLTQuODQzNzUgMC45MjE4NzUgLTUuNDY4NzUgMS4wNjI1IC01LjU5Mzc1IEMgMS4xMjUgLTUuNjU2MjUgMS45MDYyNSAtNS42NTYyNSAyLjAzMTI1IC01LjY1NjI1IEwgNC4wOTM3NSAtNS42NTYyNSBDIDMuOTg0Mzc1IC01LjUgMy4yMDMxMjUgLTQuNDA2MjUgMi45ODQzNzUgLTQuMDc4MTI1IEMgMi4wNzgxMjUgLTIuNzM0Mzc1IDEuNzUgLTEuMzQzNzUgMS43NSAtMC4zMjgxMjUgQyAxLjc1IC0wLjIzNDM3NSAxLjc1IDAuMjE4NzUgMi4yMTg3NSAwLjIxODc1IEMgMi42NzE4NzUgMC4yMTg3NSAyLjY3MTg3NSAtMC4yMzQzNzUgMi42NzE4NzUgLTAuMzI4MTI1IEwgMi42NzE4NzUgLTAuODQzNzUgQyAyLjY3MTg3NSAtMS4zOTA2MjUgMi43MDMxMjUgLTEuOTM3NSAyLjc4MTI1IC0yLjQ2ODc1IEMgMi44MjgxMjUgLTIuNzAzMTI1IDIuOTUzMTI1IC0zLjU2MjUgMy40MDYyNSAtNC4xNzE4NzUgWiBNIDQuNzUgLTYuMDc4MTI1ICIvPgo8L3N5bWJvbD4KPHN5bWJvbCBvdmVyZmxvdz0idmlzaWJsZSIgaWQ9ImdseXBoMC00Ij4KPHBhdGggc3R5bGU9InN0cm9rZTpub25lOyIgZD0iTSAzLjY1NjI1IC0zLjE3MTg3NSBMIDMuNjU2MjUgLTIuODQzNzUgQyAzLjY1NjI1IC0wLjUxNTYyNSAyLjYyNSAtMC4wNjI1IDIuMDQ2ODc1IC0wLjA2MjUgQyAxLjg3NSAtMC4wNjI1IDEuMzI4MTI1IC0wLjA3ODEyNSAxLjA2MjUgLTAuNDIxODc1IEMgMS41IC0wLjQyMTg3NSAxLjU3ODEyNSAtMC43MDMxMjUgMS41NzgxMjUgLTAuODc1IEMgMS41NzgxMjUgLTEuMTg3NSAxLjM0Mzc1IC0xLjMyODEyNSAxLjEyNSAtMS4zMjgxMjUgQyAwLjk2ODc1IC0xLjMyODEyNSAwLjY3MTg3NSAtMS4yNSAwLjY3MTg3NSAtMC44NTkzNzUgQyAwLjY3MTg3NSAtMC4xODc1IDEuMjAzMTI1IDAuMjE4NzUgMi4wNDY4NzUgMC4yMTg3NSBDIDMuMzQzNzUgMC4yMTg3NSA0LjU2MjUgLTEuMTQwNjI1IDQuNTYyNSAtMy4yODEyNSBDIDQuNTYyNSAtNS45Njg3NSAzLjQwNjI1IC02LjY0MDYyNSAyLjUxNTYyNSAtNi42NDA2MjUgQyAxLjk2ODc1IC02LjY0MDYyNSAxLjQ4NDM3NSAtNi40NTMxMjUgMS4wNjI1IC02LjAxNTYyNSBDIDAuNjQwNjI1IC01LjU2MjUgMC40MjE4NzUgLTUuMTQwNjI1IDAuNDIxODc1IC00LjM5MDYyNSBDIDAuNDIxODc1IC0zLjE1NjI1IDEuMjk2ODc1IC0yLjE3MTg3NSAyLjQwNjI1IC0yLjE3MTg3NSBDIDMuMDE1NjI1IC0yLjE3MTg3NSAzLjQyMTg3NSAtMi41OTM3NSAzLjY1NjI1IC0zLjE3MTg3NSBaIE0gMi40MjE4NzUgLTIuNDA2MjUgQyAyLjI2NTYyNSAtMi40MDYyNSAxLjc5Njg3NSAtMi40MDYyNSAxLjUgLTMuMDMxMjUgQyAxLjMxMjUgLTMuNDA2MjUgMS4zMTI1IC0zLjg5MDYyNSAxLjMxMjUgLTQuMzkwNjI1IEMgMS4zMTI1IC00LjkyMTg3NSAxLjMxMjUgLTUuMzkwNjI1IDEuNTMxMjUgLTUuNzY1NjI1IEMgMS43OTY4NzUgLTYuMjY1NjI1IDIuMTcxODc1IC02LjM5MDYyNSAyLjUxNTYyNSAtNi4zOTA2MjUgQyAyLjk4NDM3NSAtNi4zOTA2MjUgMy4zMTI1IC02LjA0Njg3NSAzLjQ4NDM3NSAtNS42MDkzNzUgQyAzLjU5Mzc1IC01LjI4MTI1IDMuNjQwNjI1IC00LjY1NjI1IDMuNjQwNjI1IC00LjIwMzEyNSBDIDMuNjQwNjI1IC0zLjM3NSAzLjI5Njg3NSAtMi40MDYyNSAyLjQyMTg3NSAtMi40MDYyNSBaIE0gMi40MjE4NzUgLTIuNDA2MjUgIi8+Cjwvc3ltYm9sPgo8c3ltYm9sIG92ZXJmbG93PSJ2aXNpYmxlIiBpZD0iZ2x5cGgwLTUiPgo8cGF0aCBzdHlsZT0ic3Ryb2tlOm5vbmU7IiBkPSJNIDIuOTM3NSAtNi4zNzUgQyAyLjkzNzUgLTYuNjI1IDIuOTM3NSAtNi42NDA2MjUgMi43MDMxMjUgLTYuNjQwNjI1IEMgMi4wNzgxMjUgLTYgMS4yMDMxMjUgLTYgMC44OTA2MjUgLTYgTCAwLjg5MDYyNSAtNS42ODc1IEMgMS4wOTM3NSAtNS42ODc1IDEuNjcxODc1IC01LjY4NzUgMi4xODc1IC01Ljk1MzEyNSBMIDIuMTg3NSAtMC43ODEyNSBDIDIuMTg3NSAtMC40MjE4NzUgMi4xNTYyNSAtMC4zMTI1IDEuMjY1NjI1IC0wLjMxMjUgTCAwLjk1MzEyNSAtMC4zMTI1IEwgMC45NTMxMjUgMCBDIDEuMjk2ODc1IC0wLjAzMTI1IDIuMTU2MjUgLTAuMDMxMjUgMi41NjI1IC0wLjAzMTI1IEMgMi45NTMxMjUgLTAuMDMxMjUgMy44MjgxMjUgLTAuMDMxMjUgNC4xNzE4NzUgMCBMIDQuMTcxODc1IC0wLjMxMjUgTCAzLjg1OTM3NSAtMC4zMTI1IEMgMi45NTMxMjUgLTAuMzEyNSAyLjkzNzUgLTAuNDIxODc1IDIuOTM3NSAtMC43ODEyNSBaIE0gMi45Mzc1IC02LjM3NSAiLz4KPC9zeW1ib2w+CjxzeW1ib2wgb3ZlcmZsb3c9InZpc2libGUiIGlkPSJnbHlwaDAtNiI+CjxwYXRoIHN0eWxlPSJzdHJva2U6bm9uZTsiIGQ9Ik0gMS42MjUgLTQuNTYyNSBDIDEuMTcxODc1IC00Ljg1OTM3NSAxLjEyNSAtNS4xODc1IDEuMTI1IC01LjM1OTM3NSBDIDEuMTI1IC01Ljk2ODc1IDEuNzgxMjUgLTYuMzkwNjI1IDIuNDg0Mzc1IC02LjM5MDYyNSBDIDMuMjAzMTI1IC02LjM5MDYyNSAzLjg0Mzc1IC01Ljg3NSAzLjg0Mzc1IC01LjE1NjI1IEMgMy44NDM3NSAtNC41NzgxMjUgMy40NTMxMjUgLTQuMTA5Mzc1IDIuODU5Mzc1IC0zLjc2NTYyNSBaIE0gMy4wNzgxMjUgLTMuNjA5Mzc1IEMgMy43OTY4NzUgLTMuOTg0Mzc1IDQuMjgxMjUgLTQuNSA0LjI4MTI1IC01LjE1NjI1IEMgNC4yODEyNSAtNi4wNzgxMjUgMy40MDYyNSAtNi42NDA2MjUgMi41IC02LjY0MDYyNSBDIDEuNSAtNi42NDA2MjUgMC42ODc1IC01LjkwNjI1IDAuNjg3NSAtNC45Njg3NSBDIDAuNjg3NSAtNC43OTY4NzUgMC43MDMxMjUgLTQuMzQzNzUgMS4xMjUgLTMuODc1IEMgMS4yMzQzNzUgLTMuNzY1NjI1IDEuNjA5Mzc1IC0zLjUxNTYyNSAxLjg1OTM3NSAtMy4zNDM3NSBDIDEuMjgxMjUgLTMuMDQ2ODc1IDAuNDIxODc1IC0yLjUgMC40MjE4NzUgLTEuNSBDIDAuNDIxODc1IC0wLjQ1MzEyNSAxLjQzNzUgMC4yMTg3NSAyLjQ4NDM3NSAwLjIxODc1IEMgMy42MDkzNzUgMC4yMTg3NSA0LjU2MjUgLTAuNjA5Mzc1IDQuNTYyNSAtMS42NzE4NzUgQyA0LjU2MjUgLTIuMDMxMjUgNC40NTMxMjUgLTIuNDg0Mzc1IDQuMDYyNSAtMi45MDYyNSBDIDMuODc1IC0zLjEwOTM3NSAzLjcxODc1IC0zLjIwMzEyNSAzLjA3ODEyNSAtMy42MDkzNzUgWiBNIDIuMDc4MTI1IC0zLjE4NzUgTCAzLjMxMjUgLTIuNDA2MjUgQyAzLjU5Mzc1IC0yLjIxODc1IDQuMDYyNSAtMS45MjE4NzUgNC4wNjI1IC0xLjMxMjUgQyA0LjA2MjUgLTAuNTc4MTI1IDMuMzEyNSAtMC4wNjI1IDIuNSAtMC4wNjI1IEMgMS42NDA2MjUgLTAuMDYyNSAwLjkyMTg3NSAtMC42NzE4NzUgMC45MjE4NzUgLTEuNSBDIDAuOTIxODc1IC0yLjA3ODEyNSAxLjIzNDM3NSAtMi43MTg3NSAyLjA3ODEyNSAtMy4xODc1IFogTSAyLjA3ODEyNSAtMy4xODc1ICIvPgo8L3N5bWJvbD4KPHN5bWJvbCBvdmVyZmxvdz0idmlzaWJsZSIgaWQ9ImdseXBoMC03Ij4KPHBhdGggc3R5bGU9InN0cm9rZTpub25lOyIgZD0iTSA0LjQ2ODc1IC0yIEMgNC40Njg3NSAtMy4xODc1IDMuNjU2MjUgLTQuMTg3NSAyLjU3ODEyNSAtNC4xODc1IEMgMi4xMDkzNzUgLTQuMTg3NSAxLjY3MTg3NSAtNC4wMzEyNSAxLjMxMjUgLTMuNjcxODc1IEwgMS4zMTI1IC01LjYyNSBDIDEuNTE1NjI1IC01LjU2MjUgMS44NDM3NSAtNS41IDIuMTU2MjUgLTUuNSBDIDMuMzkwNjI1IC01LjUgNC4wOTM3NSAtNi40MDYyNSA0LjA5Mzc1IC02LjUzMTI1IEMgNC4wOTM3NSAtNi41OTM3NSA0LjA2MjUgLTYuNjQwNjI1IDMuOTg0Mzc1IC02LjY0MDYyNSBDIDMuOTg0Mzc1IC02LjY0MDYyNSAzLjk1MzEyNSAtNi42NDA2MjUgMy45MDYyNSAtNi42MDkzNzUgQyAzLjcwMzEyNSAtNi41MTU2MjUgMy4yMTg3NSAtNi4zMTI1IDIuNTQ2ODc1IC02LjMxMjUgQyAyLjE1NjI1IC02LjMxMjUgMS42ODc1IC02LjM5MDYyNSAxLjIxODc1IC02LjU5Mzc1IEMgMS4xNDA2MjUgLTYuNjI1IDEuMTI1IC02LjYyNSAxLjEwOTM3NSAtNi42MjUgQyAxIC02LjYyNSAxIC02LjU0Njg3NSAxIC02LjM5MDYyNSBMIDEgLTMuNDM3NSBDIDEgLTMuMjY1NjI1IDEgLTMuMTg3NSAxLjE0MDYyNSAtMy4xODc1IEMgMS4yMTg3NSAtMy4xODc1IDEuMjM0Mzc1IC0zLjIwMzEyNSAxLjI4MTI1IC0zLjI2NTYyNSBDIDEuMzkwNjI1IC0zLjQyMTg3NSAxLjc1IC0zLjk2ODc1IDIuNTYyNSAtMy45Njg3NSBDIDMuMDc4MTI1IC0zLjk2ODc1IDMuMzI4MTI1IC0zLjUxNTYyNSAzLjQwNjI1IC0zLjMyODEyNSBDIDMuNTYyNSAtMi45NTMxMjUgMy41OTM3NSAtMi41NzgxMjUgMy41OTM3NSAtMi4wNzgxMjUgQyAzLjU5Mzc1IC0xLjcxODc1IDMuNTkzNzUgLTEuMTI1IDMuMzQzNzUgLTAuNzAzMTI1IEMgMy4xMDkzNzUgLTAuMzEyNSAyLjczNDM3NSAtMC4wNjI1IDIuMjgxMjUgLTAuMDYyNSBDIDEuNTYyNSAtMC4wNjI1IDAuOTg0Mzc1IC0wLjU5Mzc1IDAuODEyNSAtMS4xNzE4NzUgQyAwLjg0Mzc1IC0xLjE3MTg3NSAwLjg3NSAtMS4xNTYyNSAwLjk4NDM3NSAtMS4xNTYyNSBDIDEuMzEyNSAtMS4xNTYyNSAxLjQ4NDM3NSAtMS40MDYyNSAxLjQ4NDM3NSAtMS42NDA2MjUgQyAxLjQ4NDM3NSAtMS44OTA2MjUgMS4zMTI1IC0yLjE0MDYyNSAwLjk4NDM3NSAtMi4xNDA2MjUgQyAwLjg0Mzc1IC0yLjE0MDYyNSAwLjUgLTIuMDYyNSAwLjUgLTEuNjA5Mzc1IEMgMC41IC0wLjc1IDEuMTg3NSAwLjIxODc1IDIuMjk2ODc1IDAuMjE4NzUgQyAzLjQ1MzEyNSAwLjIxODc1IDQuNDY4NzUgLTAuNzM0Mzc1IDQuNDY4NzUgLTIgWiBNIDQuNDY4NzUgLTIgIi8+Cjwvc3ltYm9sPgo8c3ltYm9sIG92ZXJmbG93PSJ2aXNpYmxlIiBpZD0iZ2x5cGgwLTgiPgo8cGF0aCBzdHlsZT0ic3Ryb2tlOm5vbmU7IiBkPSJNIDIuOTM3NSAtMS42NDA2MjUgTCAyLjkzNzUgLTAuNzgxMjUgQyAyLjkzNzUgLTAuNDIxODc1IDIuOTA2MjUgLTAuMzEyNSAyLjE3MTg3NSAtMC4zMTI1IEwgMS45Njg3NSAtMC4zMTI1IEwgMS45Njg3NSAwIEMgMi4zNzUgLTAuMDMxMjUgMi44OTA2MjUgLTAuMDMxMjUgMy4zMTI1IC0wLjAzMTI1IEMgMy43MzQzNzUgLTAuMDMxMjUgNC4yNSAtMC4wMzEyNSA0LjY3MTg3NSAwIEwgNC42NzE4NzUgLTAuMzEyNSBMIDQuNDUzMTI1IC0wLjMxMjUgQyAzLjcxODc1IC0wLjMxMjUgMy43MDMxMjUgLTAuNDIxODc1IDMuNzAzMTI1IC0wLjc4MTI1IEwgMy43MDMxMjUgLTEuNjQwNjI1IEwgNC42ODc1IC0xLjY0MDYyNSBMIDQuNjg3NSAtMS45NTMxMjUgTCAzLjcwMzEyNSAtMS45NTMxMjUgTCAzLjcwMzEyNSAtNi40ODQzNzUgQyAzLjcwMzEyNSAtNi42ODc1IDMuNzAzMTI1IC02Ljc1IDMuNTMxMjUgLTYuNzUgQyAzLjQ1MzEyNSAtNi43NSAzLjQyMTg3NSAtNi43NSAzLjM0Mzc1IC02LjYyNSBMIDAuMjgxMjUgLTEuOTUzMTI1IEwgMC4yODEyNSAtMS42NDA2MjUgWiBNIDIuOTg0Mzc1IC0xLjk1MzEyNSBMIDAuNTYyNSAtMS45NTMxMjUgTCAyLjk4NDM3NSAtNS42NzE4NzUgWiBNIDIuOTg0Mzc1IC0xLjk1MzEyNSAiLz4KPC9zeW1ib2w+CjxzeW1ib2wgb3ZlcmZsb3c9InZpc2libGUiIGlkPSJnbHlwaDAtOSI+CjxwYXRoIHN0eWxlPSJzdHJva2U6bm9uZTsiIGQ9Ik0gNC4wNzgxMjUgLTIuMjk2ODc1IEwgNi44NTkzNzUgLTIuMjk2ODc1IEMgNyAtMi4yOTY4NzUgNy4xODc1IC0yLjI5Njg3NSA3LjE4NzUgLTIuNSBDIDcuMTg3NSAtMi42ODc1IDcgLTIuNjg3NSA2Ljg1OTM3NSAtMi42ODc1IEwgNC4wNzgxMjUgLTIuNjg3NSBMIDQuMDc4MTI1IC01LjQ4NDM3NSBDIDQuMDc4MTI1IC01LjYyNSA0LjA3ODEyNSAtNS44MTI1IDMuODc1IC01LjgxMjUgQyAzLjY3MTg3NSAtNS44MTI1IDMuNjcxODc1IC01LjYyNSAzLjY3MTg3NSAtNS40ODQzNzUgTCAzLjY3MTg3NSAtMi42ODc1IEwgMC44OTA2MjUgLTIuNjg3NSBDIDAuNzUgLTIuNjg3NSAwLjU2MjUgLTIuNjg3NSAwLjU2MjUgLTIuNSBDIDAuNTYyNSAtMi4yOTY4NzUgMC43NSAtMi4yOTY4NzUgMC44OTA2MjUgLTIuMjk2ODc1IEwgMy42NzE4NzUgLTIuMjk2ODc1IEwgMy42NzE4NzUgMC41IEMgMy42NzE4NzUgMC42NDA2MjUgMy42NzE4NzUgMC44MjgxMjUgMy44NzUgMC44MjgxMjUgQyA0LjA3ODEyNSAwLjgyODEyNSA0LjA3ODEyNSAwLjY0MDYyNSA0LjA3ODEyNSAwLjUgWiBNIDQuMDc4MTI1IC0yLjI5Njg3NSAiLz4KPC9zeW1ib2w+CjxzeW1ib2wgb3ZlcmZsb3c9InZpc2libGUiIGlkPSJnbHlwaDEtMCI+CjxwYXRoIHN0eWxlPSJzdHJva2U6bm9uZTsiIGQ9IiIvPgo8L3N5bWJvbD4KPHN5bWJvbCBvdmVyZmxvdz0idmlzaWJsZSIgaWQ9ImdseXBoMS0xIj4KPHBhdGggc3R5bGU9InN0cm9rZTpub25lOyIgZD0iTSAxLjkwNjI1IC0wLjUzMTI1IEMgMS45MDYyNSAtMC44MTI1IDEuNjcxODc1IC0xLjA2MjUgMS4zOTA2MjUgLTEuMDYyNSBDIDEuMDkzNzUgLTEuMDYyNSAwLjg1OTM3NSAtMC44MTI1IDAuODU5Mzc1IC0wLjUzMTI1IEMgMC44NTkzNzUgLTAuMjM0Mzc1IDEuMDkzNzUgMCAxLjM5MDYyNSAwIEMgMS42NzE4NzUgMCAxLjkwNjI1IC0wLjIzNDM3NSAxLjkwNjI1IC0wLjUzMTI1IFogTSAxLjkwNjI1IC0wLjUzMTI1ICIvPgo8L3N5bWJvbD4KPHN5bWJvbCBvdmVyZmxvdz0idmlzaWJsZSIgaWQ9ImdseXBoMS0yIj4KPHBhdGggc3R5bGU9InN0cm9rZTpub25lOyIgZD0iTSAyLjA0Njg3NSAtMy45ODQzNzUgTCAyLjk4NDM3NSAtMy45ODQzNzUgQyAzLjE4NzUgLTMuOTg0Mzc1IDMuMjk2ODc1IC0zLjk4NDM3NSAzLjI5Njg3NSAtNC4xODc1IEMgMy4yOTY4NzUgLTQuMjk2ODc1IDMuMTg3NSAtNC4yOTY4NzUgMy4wMTU2MjUgLTQuMjk2ODc1IEwgMi4xNDA2MjUgLTQuMjk2ODc1IEMgMi41IC01LjcxODc1IDIuNTQ2ODc1IC01LjkwNjI1IDIuNTQ2ODc1IC01Ljk2ODc1IEMgMi41NDY4NzUgLTYuMTQwNjI1IDIuNDIxODc1IC02LjIzNDM3NSAyLjI1IC02LjIzNDM3NSBDIDIuMjE4NzUgLTYuMjM0Mzc1IDEuOTM3NSAtNi4yMzQzNzUgMS44NTkzNzUgLTUuODc1IEwgMS40Njg3NSAtNC4yOTY4NzUgTCAwLjUzMTI1IC00LjI5Njg3NSBDIDAuMzI4MTI1IC00LjI5Njg3NSAwLjIzNDM3NSAtNC4yOTY4NzUgMC4yMzQzNzUgLTQuMTA5Mzc1IEMgMC4yMzQzNzUgLTMuOTg0Mzc1IDAuMzEyNSAtMy45ODQzNzUgMC41MTU2MjUgLTMuOTg0Mzc1IEwgMS4zOTA2MjUgLTMuOTg0Mzc1IEMgMC42NzE4NzUgLTEuMTU2MjUgMC42MjUgLTAuOTg0Mzc1IDAuNjI1IC0wLjgxMjUgQyAwLjYyNSAtMC4yNjU2MjUgMSAwLjEwOTM3NSAxLjU0Njg3NSAwLjEwOTM3NSBDIDIuNTYyNSAwLjEwOTM3NSAzLjEyNSAtMS4zNDM3NSAzLjEyNSAtMS40MjE4NzUgQyAzLjEyNSAtMS41MzEyNSAzLjA0Njg3NSAtMS41MzEyNSAzLjAxNTYyNSAtMS41MzEyNSBDIDIuOTIxODc1IC0xLjUzMTI1IDIuOTA2MjUgLTEuNSAyLjg1OTM3NSAtMS4zOTA2MjUgQyAyLjQzNzUgLTAuMzQzNzUgMS45MDYyNSAtMC4xMDkzNzUgMS41NjI1IC0wLjEwOTM3NSBDIDEuMzU5Mzc1IC0wLjEwOTM3NSAxLjI1IC0wLjIzNDM3NSAxLjI1IC0wLjU2MjUgQyAxLjI1IC0wLjgxMjUgMS4yODEyNSAtMC44NzUgMS4zMTI1IC0xLjA0Njg3NSBaIE0gMi4wNDY4NzUgLTMuOTg0Mzc1ICIvPgo8L3N5bWJvbD4KPC9nPgo8L2RlZnM+CjxnIGlkPSJzdXJmYWNlMSI+CjxwYXRoIHN0eWxlPSJmaWxsLXJ1bGU6bm9uemVybztmaWxsOnJnYigxMDAlLDgzLjc5OTc0NCUsODMuNzk5NzQ0JSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjAuOTk2Mjg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlOnJnYigxMDAlLDE4Ljk5ODcxOCUsMTguOTk4NzE4JSk7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtbWl0ZXJsaW1pdDoxMDsiIGQ9Ik0gMC40OTkwMzEgMC4wMDAyNSBMIDAuNDk5MDMxIDI4LjM0NzkwNiBMIDkuNzA2MDYyIDI4LjM0NzkwNiBMIDkuNzA2MDYyIDAuMDAwMjUgWiBNIDAuNDk5MDMxIDAuMDAwMjUgIiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwtMSwzLjMzMywyOC44NDQpIi8+CjxnIHN0eWxlPSJmaWxsOnJnYigxMDAlLDE4Ljk5ODcxOCUsMTguOTk4NzE4JSk7ZmlsbC1vcGFjaXR5OjE7Ij4KICA8dXNlIHhsaW5rOmhyZWY9IiNnbHlwaDAtMSIgeD0iMi4wNyIgeT0iNDEuNTE1Ii8+CjwvZz4KPGcgc3R5bGU9ImZpbGw6cmdiKDEwMCUsMTguOTk4NzE4JSwxOC45OTg3MTglKTtmaWxsLW9wYWNpdHk6MTsiPgogIDx1c2UgeGxpbms6aHJlZj0iI2dseXBoMS0xIiB4PSI3LjA1MSIgeT0iNDEuNTE1Ii8+CjwvZz4KPGcgc3R5bGU9ImZpbGw6cmdiKDEwMCUsMTguOTk4NzE4JSwxOC45OTg3MTglKTtmaWxsLW9wYWNpdHk6MTsiPgogIDx1c2UgeGxpbms6aHJlZj0iI2dseXBoMC0yIiB4PSI5LjgxOSIgeT0iNDEuNTE1Ii8+CjwvZz4KPHBhdGggc3R5bGU9ImZpbGwtcnVsZTpub256ZXJvO2ZpbGw6cmdiKDc5Ljk5ODc3OSUsOTIuMDc5MTYzJSw5Ni4wNzg0OTElKTtmaWxsLW9wYWNpdHk6MTtzdHJva2Utd2lkdGg6MC45OTYyODtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2U6cmdiKDAlLDYwLjM5ODg2NSUsODAuMzk4NTYlKTtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1taXRlcmxpbWl0OjEwOyIgZD0iTSAxMC43MDIxNTYgMC4wMDAyNSBMIDEwLjcwMjE1NiAyOC4zNDc5MDYgTCAyMzMuNjQzNTYzIDI4LjM0NzkwNiBMIDIzMy42NDM1NjMgMC4wMDAyNSBaIE0gMTAuNzAyMTU2IDAuMDAwMjUgIiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwtMSwzLjMzMywyOC44NDQpIi8+CjxnIHN0eWxlPSJmaWxsOnJnYigwJSw2MC4zOTg4NjUlLDgwLjM5ODU2JSk7ZmlsbC1vcGFjaXR5OjE7Ij4KICA8dXNlIHhsaW5rOmhyZWY9IiNnbHlwaDAtMyIgeD0iMTIwLjUyNCIgeT0iNDEuNTE1Ii8+CiAgPHVzZSB4bGluazpocmVmPSIjZ2x5cGgwLTQiIHg9IjEyNS41MDUzMiIgeT0iNDEuNTE1Ii8+CjwvZz4KPHBhdGggc3R5bGU9ImZpbGwtcnVsZTpub256ZXJvO2ZpbGw6cmdiKDEwMCUsODMuNzk5NzQ0JSw4My43OTk3NDQlKTtmaWxsLW9wYWNpdHk6MTtzdHJva2Utd2lkdGg6MC45OTYyODtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2U6cmdiKDEwMCUsMTguOTk4NzE4JSwxOC45OTg3MTglKTtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1taXRlcmxpbWl0OjEwOyIgZD0iTSAyMzQuNjQzNTYzIDAuMDAwMjUgTCAyMzQuNjQzNTYzIDI4LjM0NzkwNiBMIDIzOC43NDkwMzEgMjguMzQ3OTA2IEwgMjM4Ljc0OTAzMSAwLjAwMDI1IFogTSAyMzQuNjQzNTYzIDAuMDAwMjUgIiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwtMSwzLjMzMywyOC44NDQpIi8+CjxnIHN0eWxlPSJmaWxsOnJnYigxMDAlLDE4Ljk5ODcxOCUsMTguOTk4NzE4JSk7ZmlsbC1vcGFjaXR5OjE7Ij4KICA8dXNlIHhsaW5rOmhyZWY9IiNnbHlwaDAtNSIgeD0iMjMzLjY1OSIgeT0iNDEuNTE1Ii8+CjwvZz4KPGcgc3R5bGU9ImZpbGw6cmdiKDEwMCUsMTguOTk4NzE4JSwxOC45OTg3MTglKTtmaWxsLW9wYWNpdHk6MTsiPgogIDx1c2UgeGxpbms6aHJlZj0iI2dseXBoMS0xIiB4PSIyMzguNjQxIiB5PSI0MS41MTUiLz4KPC9nPgo8ZyBzdHlsZT0iZmlsbDpyZ2IoMTAwJSwxOC45OTg3MTglLDE4Ljk5ODcxOCUpO2ZpbGwtb3BhY2l0eToxOyI+CiAgPHVzZSB4bGluazpocmVmPSIjZ2x5cGgwLTYiIHg9IjI0MS40MDgiIHk9IjQxLjUxNSIvPgo8L2c+CjxwYXRoIHN0eWxlPSJmaWxsLXJ1bGU6bm9uemVybztmaWxsOnJnYig3OS45OTg3NzklLDkyLjA3OTE2MyUsOTYuMDc4NDkxJSk7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjAuOTk2Mjg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlOnJnYigwJSw2MC4zOTg4NjUlLDgwLjM5ODU2JSk7c3Ryb2tlLW9wYWNpdHk6MTtzdHJva2UtbWl0ZXJsaW1pdDoxMDsiIGQ9Ik0gMjM5Ljc0NTEyNSAwLjAwMDI1IEwgMjM5Ljc0NTEyNSAyOC4zNDc5MDYgTCAzOTEuODE5MzQ0IDI4LjM0NzkwNiBMIDM5MS44MTkzNDQgMC4wMDAyNSBaIE0gMjM5Ljc0NTEyNSAwLjAwMDI1ICIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMy4zMzMsMjguODQ0KSIvPgo8ZyBzdHlsZT0iZmlsbDpyZ2IoMCUsNjAuMzk4ODY1JSw4MC4zOTg1NiUpO2ZpbGwtb3BhY2l0eToxOyI+CiAgPHVzZSB4bGluazpocmVmPSIjZ2x5cGgwLTciIHg9IjMxNC4xMjkiIHk9IjQxLjUxNSIvPgogIDx1c2UgeGxpbms6aHJlZj0iI2dseXBoMC04IiB4PSIzMTkuMTEwMzIiIHk9IjQxLjUxNSIvPgo8L2c+CjxnIHN0eWxlPSJmaWxsOnJnYig2MC4zOTg4NjUlLDE5LjU5OTkxNSUsODAuMzk4NTYlKTtmaWxsLW9wYWNpdHk6MTsiPgogIDx1c2UgeGxpbms6aHJlZj0iI2dseXBoMC05IiB4PSI2My4wOTYiIHk9IjQwLjc5NSIvPgo8L2c+CjxnIHN0eWxlPSJmaWxsOnJnYig2MC4zOTg4NjUlLDE5LjU5OTkxNSUsODAuMzk4NTYlKTtmaWxsLW9wYWNpdHk6MTsiPgogIDx1c2UgeGxpbms6aHJlZj0iI2dseXBoMC05IiB4PSIxNzguODkxIiB5PSI0MC43OTUiLz4KPC9nPgo8ZyBzdHlsZT0iZmlsbDpyZ2IoNjAuMzk4ODY1JSwxOS41OTk5MTUlLDgwLjM5ODU2JSk7ZmlsbC1vcGFjaXR5OjE7Ij4KICA8dXNlIHhsaW5rOmhyZWY9IiNnbHlwaDAtOSIgeD0iMjc1LjY5MyIgeT0iNDAuNzk1Ii8+CjwvZz4KPGcgc3R5bGU9ImZpbGw6cmdiKDYwLjM5ODg2NSUsMTkuNTk5OTE1JSw4MC4zOTg1NiUpO2ZpbGwtb3BhY2l0eToxOyI+CiAgPHVzZSB4bGluazpocmVmPSIjZ2x5cGgwLTkiIHg9IjM1My4yNTUiIHk9IjQwLjc5NSIvPgo8L2c+CjxnIHN0eWxlPSJmaWxsOnJnYig2MC4zOTg4NjUlLDE5LjU5OTkxNSUsODAuMzk4NTYlKTtmaWxsLW9wYWNpdHk6MTsiPgogIDx1c2UgeGxpbms6aHJlZj0iI2dseXBoMS0xIiB4PSIzODkuMzM2IiB5PSIzOC44MyIvPgo8L2c+CjxnIHN0eWxlPSJmaWxsOnJnYig2MC4zOTg4NjUlLDE5LjU5OTkxNSUsODAuMzk4NTYlKTtmaWxsLW9wYWNpdHk6MTsiPgogIDx1c2UgeGxpbms6aHJlZj0iI2dseXBoMS0xIiB4PSIzOTMuNzU3NDIiIHk9IjM4LjgzIi8+CjwvZz4KPGcgc3R5bGU9ImZpbGw6cmdiKDYwLjM5ODg2NSUsMTkuNTk5OTE1JSw4MC4zOTg1NiUpO2ZpbGwtb3BhY2l0eToxOyI+CiAgPHVzZSB4bGluazpocmVmPSIjZ2x5cGgxLTEiIHg9IjM5OC4xODg4MDIiIHk9IjM4LjgzIi8+CjwvZz4KPHBhdGggc3R5bGU9ImZpbGw6bm9uZTtzdHJva2Utd2lkdGg6MC45OTYyODtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2U6cmdiKDAlLDUwJSw1MCUpO3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlLW1pdGVybGltaXQ6MTA7IiBkPSJNIC0yLjgzMyAtMC45OTU4NDQgTCA0MTYuOTk5MDMxIC0wLjk5NTg0NCAiIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDMuMzMzLDI4Ljg0NCkiLz4KPHBhdGggc3R5bGU9ImZpbGw6bm9uZTtzdHJva2Utd2lkdGg6MC43OTcwMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlOnJnYigwJSw1MCUsNTAlKTtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1taXRlcmxpbWl0OjEwOyIgZD0iTSAtMS43MzM0MjQgMi4zMTI5MzYgQyAtMS41ODg4OTIgMS40NDU3NDkgMC4wMDA5NTEyNSAwLjE0NDk2NyAwLjQzNDU0NSAwLjAwMDQzNjI1IEMgMC4wMDA5NTEyNSAtMC4xNDQwOTUgLTEuNTg4ODkyIC0xLjQ0NDg3NiAtMS43MzM0MjQgLTIuMzEyMDY0ICIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsNDIwLjMzMTA4LDI5Ljg0MDI4KSIvPgo8ZyBzdHlsZT0iZmlsbDpyZ2IoMCUsNTAlLDUwJSk7ZmlsbC1vcGFjaXR5OjE7Ij4KICA8dXNlIHhsaW5rOmhyZWY9IiNnbHlwaDEtMiIgeD0iNDE5LjM1OSIgeT0iMzkuNzg3Ii8+CjwvZz4KPC9nPgo8L3N2Zz4K" /></p>
Die Messungen fanden alle nacheinander statt. Wenn Sie davon ausgehen,
dass die Wartezeit jeweils direkt bis zum nächste Ausbruch geht und nach
dem Ausbruch direkt die nächste Wartezeit beginnt, wie lange hat es
gedauert den gesamten Datensatz aufzunehmen? Geben Sie die Zeitdauer in
Tagen, Stunden und Minuten an.
### Lösung zu b)
Wir summieren zunächst alles auf. Das machen wir hier mit zwei Aufrufen
von `sum`. Der erste Aufruf summiert spaltenweise auf, also jeweils alle
Eruptionsdauern und alle Wartezeiten. Der zweite Aufruf addiert die
beiden Werte.
Anschließend teilen wir die Summe durch 60 um die Zeit in Minuten zu
erhalten. Dann teilen wir durch 24 um die Zeit in Tagen zu erhalten. Da
wir nur ganze Tage zählen wollen (weil wir ja noch kleine Einheiten
haben), nehmen wir direkt die Integer-Division mittels `//`. Für die
Stunden bestimmen wir erst mittels `// 60` die ganzen Stunden und
ermitteln dann mit `% 24` die übrig gebliebenen Stunden, wenn man durch
24 teilen würde. Für die Minuten müssen wir die Restlichen Minuten
haben, die nicht in den Stunden enthalten sind.
Zum Schluss fügen wir noch eine Probe hinzu, ob die Werte ungefähr (bis
auf 7 Nachkommastellen) gleich sind.
%% Cell type:code id:0022-8de0ea7526873d5e4bd97141b36dc9231fed3d09bfeb817b6c5021b9bbc tags:
```
total_duration_min = df1.sum().sum()
total_days = total_duration_min // (60 * 24)
total_hours = total_duration_min // 60 % 24
total_minutes = total_duration_min % 60
np.testing.assert_almost_equal(total_duration_min, total_days * 60 * 24 + total_hours * 60 + total_minutes)
```
%% Cell type:markdown id:0023-5c06a410812f3c83669b96e7f3d60a66cf144d3e8242a7f8b32dba0b906 tags:
Nun geben wir die Werte aus:
%% Cell type:code id:0024-760c2dfab162bda32f34a5271a5a2635a7fa672bed6cda7bcc1a8825bf9 tags:
```
print("Die Messung dauerte", total_days, "Tage,", total_hours, "Stunden und", total_minutes, "Minuten.")
```
%% Output
Die Messung dauerte 14.0 Tage, 1.0 Stunden und 12.67699999999968 Minuten.
%% Cell type:markdown id:0029-416a1d039c0c2ab3e9216049a939e3ac5e81cbb503c17db2f9d24fb8f51 tags:
## c) Differenz der Wartezeiten
Berechnen Sie die Differenzen der Wartezeiten. Zum Beispiel beträgt die
erste Wartezeit 79 min und die zweite 54 min. Die Differenz ist also -25
min. Geben Sie die größte Abnahme und die größte Zunahme der Wartezeiten
als Absolutzahlen aus.
Plotten Sie anschließend das Histogramm der Differenzen um zu sehen, ob
sich die Wartezeiten vielleicht nur langsam verändern oder langsame
Änderungen zumindest wahrscheinlicher als schnelle Änderungen sind.
### Lösung zu c)
Wir verwenden hier die Methode `diff` um die Differenzen zu berechnen.
Diese Methode gibt uns die Differenz des aktuellen Wertes mit dem
vorherigen Wert zurück. Das erste Element ist immer `NaN`, weil es
keinen vorherigen Wert gibt. Alternativ hätte man auch `np.diff` oder
`df1['waiting_time'].iloc[1:] - df1['waiting_time'].iloc[:-1].to_numpy()`
(Vorsicht: Ohne \`to_numpy() tritt Alignment auf) verwenden können.
%% Cell type:code id:0030-5e54e3b321c98f109a79559471203fec83cb4ddd0fe78f9ad4094820cb9 tags:
```
diff = df1['waiting_time'].diff()
max_decrease = abs(diff.min())
max_increase = diff.max()
```
%% Cell type:markdown id:0031-a8d9b30204e7d23cda4faf21aed3f18a4f3d119edae04f3dc950e68a845 tags:
Wir geben die größte Abnahme und die größte Zunahme der Wartezeiten aus:
%% Cell type:code id:0032-d7b56d7413bf5af0c5995e70d3d20a689b96a25e117d3d60dd155714b18 tags:
```
print("Die größte Abnahme der Wartezeiten beträgt", max_decrease, "min und die größte zunahme", max_increase, "min.")
```
%% Output
Die größte Abnahme der Wartezeiten beträgt 45.0 min und die größte zunahme 47.0 min.
%% Cell type:markdown id:0033-89b9c6a0d707d92e5aa62c4d01d46b20b48df425cbc54abd7dde0e45f9e tags:
Da `diff` eine Pandas Series ist, können wir einfach die Methode `hist`
oder `plot.hist` aufrufen um das Histogramm zu plotten:
%% Cell type:code id:0034-86a0bd19c284b2d3344bb726a5942fe1e0f3d428a3a8b08f733a07c1262 tags:
```
diff.hist(bins=15)
```
%% Cell type:markdown id:0039-3f6fa9a68f5102f22bcf39cf650fb1a099818131783672880cd19d606e3 tags:
Bei so wenigen Daten ist die Interpretation des Plots nicht eindeutig.
Man sieht aber fast eine gleichmäßige Verteilung. Die Ränder kommen
weniger häufig vor, was aber auch klar ist, weil die Wartezeiten ja
einen kleinsten und größten Wert haben und nur von diesen die
größtmöglichen Differenzen kommen können, während die anderen
Differenzen auch von vielen anderen Werten kommen können. Allerdings
erkennt man keine klare Häufung um 0 herum. Also gibt es durchaus große
Sprünge in den Wartezeiten.
## d) Modellierung
Wenn man ein Modell erstellt, will man auch wissen, wie gut es ist.
Daher macht man oft ein triviales Modell, damit man einen Vergleichswert
hat. Als triviales Modell für die Wartezeit nehmen wir zunächst eine
konstante Vorhersage und zwar den Mittelwert der Wartezeiten. Wie hoch
ist der mittlere absolute Fehler (MAE) und die Wurzel aus dem mittleren
quadratischen Fehler (RMSE) für das triviale Modell? Berechnen Sie die
Werte ohne Schleifen.
$$MAE = \frac 1 n \sum_{i=0}^{n-1} |y - \hat y| = \frac{1}{272} \cdot (|54 - 70.9| + |74 - 70.9| + \dots + |74 - 70.9|)$$
$$RMSE = \sqrt{\frac 1 n \sum_{i=0}^{n-1} (y - \hat y)^2}$$
Dabei ist $\hat y$ die Vorhersage, also zunächst die mittlere
Wartedauer.
%% Cell type:code id:0040-44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 tags:
```
```
%% Cell type:markdown id:0042-1314ebc28c0c6337a876c6bd3e8c27e6be258572fb9e604a2eaca71f30b tags:
Als nächstes betrachten wir als Modell als nächste Wartezeit die
vorherige Wartezeit vorherzusagen. Wie hoch wären die Fehlerwerte dann?
Die Berechnung des MAE wäre also
$$MAE = \frac{1}{271} \cdot (|54 - 79| + |74 - 54| + \dots + |74 - 46|)$$
%% Cell type:code id:0043-44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 tags:
```
```
%% Cell type:markdown id:0046-1e5c2934b1940cf84478bfd1fb46024b3cb859d8a2560b75aa40dad6944 tags:
Wenn man die Fehlerwerte verschiedener Modelle vergleicht, kriegt man
ein Gefühl dafür, wie gut ein Modell ist.
Schauen Sie sich nun die Daten mit einem Pairplot mit Kernel Density
Estimation (KDE) Plots auf der Diagonalen (`diag_kind`) an (siehe
[Doku](https://seaborn.pydata.org/generated/seaborn.pairplot.html)).
*Bonus: Versuchen Sie ein besseres Modell zu entwickeln! Sie dürfen auch
die aktuelle Eruptionsdauer verwenden. Denken Sie daran nur einen Teil
der Daten für das Training und einen Teil als Test zu verwenden. Streng
genommen hätten wir vorhin den Mittelwert auch nur auf der Trainingmenge
bilden und auf der Testmenge den Fehler ermitteln dürfen.*
%% Cell type:code id:0047-44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 tags:
```
```
%% Cell type:markdown id:0049-4795a7dcddb40541fbeaae65108031f38bfa3a6627064153e12223b7d08 tags:
### Lösung zu d)
Den Mittelwert haben wir in `average` abgelegt und wir können ihn für
die Fehlerberechnung verwenden:
%% Cell type:code id:0050-00c55c0abc106a9ad5ac0ac32e11aae24656f89b882f1d8582fa0469f38 tags:
```
avg_err = (df1['waiting_time'] - average)
avg_mae = avg_err.abs().mean()
avg_rmse = np.sqrt((avg_err ** 2).mean())
```
%% Cell type:code id:0051-4478840585df093490445e59c5ccf24eda25d0d3b27a51c145430efee69 tags:
```
print(f'Mittelwertmodell. MAE: {avg_mae:.2f}, RMSE: {avg_rmse:.2f}')
```
%% Output
Mittelwertmodell. MAE: 11.95, RMSE: 13.57
%% Cell type:markdown id:0052-a044d32a03db5f17e9ff2d070681ae4f072c0b3637218db14e62e703e81 tags:
Für die Berechnung des Fehlers des Modells, das die letzte Wartezeit als
Vorhersage verwendet, können wir `diff` verwenden, wo ja schon die
Differenzen zur jeweils letzten Wartezeit berechnet sind:
%% Cell type:code id:0053-bd8c089f3966459bfa34576d28c9ad516465013f51e8efc48a8b5198e4d tags:
```
diff_mae = diff.abs().mean()
diff_rmse = np.sqrt((diff ** 2).mean())
```
%% Cell type:code id:0054-db2c4202bfb4831517feefb877a6d812bf8dbf87198d83bf968f45183e8 tags:
```
print(f'Letzte-Wert-Modell. MAE: {diff_mae:.2f}, RMSE: {diff_rmse:.2f}')
```
%% Output
Letzte-Wert-Modell. MAE: 20.52, RMSE: 23.85
%% Cell type:markdown id:0055-be44853a9b6976808192db735ad24190d023eb9e284633973adc0d2afb6 tags:
Nun schauen wir uns den Pairplot an und erkennen, dass es einen
Zusammenhang zwischen der Eruptionsdauer und der Wartezeit gibt:
%% Cell type:code id:0056-7fca65c15a5eee1266e38df1f400bb0699906b618fcfb1262cde78d893c tags:
```
sns.pairplot(df1, diag_kind='kde', plot_kws=dict(alpha=0.5))
```
%% Cell type:markdown id:0057-563be423d1d87141d2abb93a055369c6c982d0b0860e3aa7ce27b2ba1a7 tags:
Es ist also naheliegend ein Modell zu bauen, dass die Wartezeit aus der
aktuellen Eruption vorhersagt. Dazu nehmen wir einfach eine lineare
Regression eins Polynom ersten Grades:
%% Cell type:code id:0058-4f11d068e818a45992ff1d2f9655db761f4a49d930796085e9d3f384f63 tags:
```
x_train = df1['eruption_duration'].iloc[:200]
y_train = df1['waiting_time'].iloc[:200]
x_test = df1['eruption_duration'].iloc[200:]
y_test = df1['waiting_time'].iloc[200:]
p = np.polynomial.Polynomial.fit(x_train, y_train, deg=1).convert()
```
%% Cell type:markdown id:0059-4dc58f257323c22bd484e7af4083ecf6212d54910425984d6aab554ffee tags:
Den Fehler ermitteln wir jetzt aus der Vorhersage der Testdaten:
%% Cell type:code id:0060-4dd7b0cfa418382f44a529d35c009cf52cf1c18d11752718d4c8e0687ad tags:
```
y_pred = p(x_test)
linreg_diff = y_test - y_pred
linreg_mae = linreg_diff.abs().mean()
linreg_rmse = np.sqrt((linreg_diff ** 2).mean())
```
%% Cell type:code id:0061-9b8d038b883d47e0bc123b28e34a70f0569a2c93439365e2c45092df31c tags:
```
print(f'Regressionsmodell. MAE: {linreg_mae:.2f}, RMSE: {linreg_rmse:.2f}')
```
%% Output
Regressionsmodell. MAE: 4.69, RMSE: 5.82
%% Cell type:markdown id:0073-ca96affb40213b63dd4c7c0149650711a1676067611b985280b5bc26ade tags:
Mit etwas Mühe wären hier vermutlich noch Verbesserungen möglich.
## e) Weitere Datensätze
Es gibt noch weitere Datensätze aus anderen Jahren zum Old Faithful
Geysir. Lesen Sie diese ein und bringen Sie sie in die Form des
Datensatzes von 1938, sodass sie gemeinsam geplottet werden können.
Starten Sie am besten mit einem Scatter-Plot des Datensatzes von 1938,
in dem auf der x-Achse die `eruption_duration` und auf der y-Achse die
`waiting_time` liegen soll.
`old-faithful-1978.txt`:
- Die Daten stammen vom 1. August bis zum 8. August, 1978. Der Tag
steht in der ersten Spalte.
- Es ist nicht klar, welche Eruptionen aufeinanderfolgend sind.
- Das Format ist nicht wirklich CSV, da es mit Leerzeichen gefüllt
ist, sodass sich Spalten fester breite ergeben. Verwenden Sie
[`pd.read_fwf`](https://pandas.pydata.org/docs/reference/api/pandas.read_fwf.html)
anstatt `pd.read_csv` um die Datei einzulesen.
- Ändern Sie die Spaltennamen der entsprechenden Spalten zu
`eruption_duration` und `waiting_time`.
Plotten Sie die Daten in den bestehenden Scatter Plot.
`old-faithful-1985.csv`:
- Die Daten stammen vom 1. August bis zum 15. August, 1985.
- Es ist eine kontinuierliche Messung.
- Einige nächtliche Eruptionsdauermesswerte wurden nur als *kurz*,
*mittel* oder *lang* eingetragen. Diese Werte sind wurden auf 2, 3
bzw. 4 Minuten geschätzt.
- Die Spalte `waiting` gibt die Wartezeit **auf** diese Eruption an.
Sie müssen hier vorverarbeiten, damit dieser Datensatz zu den
anderen passt.
Plotten Sie auch diesen Datensatz gemeinsam mit den anderen.
`old-faithful-2018.csv`:
- Die Daten wurden von freiwilligen im Rahmen eines Citizen Science
Projekts aufgezeichnet.
- Es können Fehler enthalten sein. Filtern Sie ggf. offensichtliche
Ausreißer weg.
- Die Zeiteinheiten sind jeweils Sekunden.
Wenn Sie den Datensatz hinzugefügt haben, schauen Sie nach
Auffälligkeiten. Sind Anpassungen im Modell notwendig?
%% Cell type:code id:0074-44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 tags:
```
```
%% Cell type:markdown id:0079-2ae859c1cf9c4b41739525347611ec719266fe284422493bea23d2cbd2f tags:
### Lösung zu e)
Hier in der Lösung wird nur der Plot mit allen Datensätzen gezeigt.
Aber zunächst lesen wir den Datensatz von 1978 ein. Hier die ersten
Zeilen in der Datei:
D Y X
1 78 4.4
1 74 3.9
1 68 4.0
Wir verwerfen die Spalte `D` (Day). Von den Werten erkennen wir, dass
`X` der `eruption_duration` entspricht und `Y` der `waiting_time`.
Dementsprechend setzen wir die Spaltennamen.
%% Cell type:code id:0080-228608610beda35fe30f3e721d40f09fac21bdb1298bc38c0f770a0500b tags:
```
df2 = pd.read_fwf('old-faithful-1978.txt')[['X', 'Y']]
df2.columns = ['eruption_duration', 'waiting_time']
```
%% Cell type:markdown id:0083-915c7798bfb8a99d08209a0de5c08722c3d20ce1d02f31d9ae9367d7e8a tags:
%% Cell type:markdown id:0083-8ce26d6d32b588e1fe10fa6e5f04b19b66593db1d9a5e85a9c740dfd5e0 tags:
Die Datei für 1985 sieht so aus:
waiting,duration
80,4.0167
71,2.15
57,4
Die Spaltennamen müssen wieder geändert werden. Zusätzlich haben wir
aber die Information, dass `waiting` die Wartezeit vor einer Eruption
ist. Da es sich aber um eine kontinuierliche Messung handelt, können wir
das leicht durch Verschiebung der Spalte um eine Zeile nach oben lösen.
Um Alignment zu vermeiden, verwenden wir `to_numpy`. Die letzte Zeile
verwerfen wir, weil wir dort keine Wartezeit nach der Eruption kennen.
Um Alignment zu vermeiden, verwenden wir `to_numpy`. Alternativ hätte
man auch einfach `df3['waiting'] = df3['waiting'].shift(-1)` verwenden
können. Die letzte Zeile verwerfen wir, weil wir dort keine Wartezeit
nach der Eruption kennen.
%% Cell type:code id:0084-80bbe335df8442a6886304ac6ae394e9d385f11b14bbdfdbadce88af351 tags:
```
df3 = pd.read_csv('old-faithful-1985.csv')
df3.columns = ['waiting_time', 'eruption_duration']
df3.iloc[:-1, 0] = df3.iloc[1:, 0].to_numpy()
df3 = df3.iloc[:-1]
```
%% Cell type:markdown id:0087-994b767d70b2cb783ce9eea954d232f876c3a69b35e7bc6e72c0c66b508 tags:
Die Datei für 2018 enthält jeweils einen Zeitstempel und die Daten sind
in Sekunden:
time,duration,waiting
2018-01-01 00:08:00,236,5520
2018-01-02 22:55:00,236,5460
2018-01-06 00:18:00,200,5700
Es gibt einen offensichtlichen fehlerhaften Datensatz mit einer
Eruptionsdauer von 1 sec. Das sieht man spätestens im Plot. Weiterhin
nennen wir die Spalten wieder um und teilen durch 60 um auf Minuten zu
kommen.
%% Cell type:code id:0088-7f366659d82dd25a0c2da7bd49082739b67fb68d317f79c3a87b3df4179 tags:
%% Cell type:code id:0088-f0aecc148065884c85ec80c15954b4e581dde2d58e693acfec3e89411db tags:
```
df4 = pd.read_csv('old-faithful-2018.csv')[['duration', 'waiting']]
df4.columns = ['eruption_duration', 'waiting_time']
df4 = df4[df4['eruption_duration'] < 10] # filter eruption_duration with less than 10 sec
df4 = df4[df4['eruption_duration'] > 10] # only keep eruption_durations with more than 10 sec
df4 /= 60
```
%% Cell type:markdown id:0089-a4e4f1b9ac428aeeb01e0369bdc9a2b7a9198d0842fd2255d8ff16c8813 tags:
Erstellen wir nun den Plot mit verschiedenen Farben und Labels:
%% Cell type:code id:0090-98c722f31a92a07eaac042dc857d266c5463cde6978d860b60f07594588 tags:
```
ax = df1.plot.scatter(x='eruption_duration', y='waiting_time', c='b', label='1938', alpha=0.7)
df2.plot.scatter(x='eruption_duration', y='waiting_time', c='r', label='1978', ax=ax, alpha=0.5)
df3.plot.scatter(x='eruption_duration', y='waiting_time', c='g', label='1985', ax=ax, alpha=0.5)
df4.plot.scatter(x='eruption_duration', y='waiting_time', c='y', label='2018', ax=ax, alpha=0.4)
```
%% Cell type:markdown id:0091-545c2250c3e26b244c3612b96d0a7a4a5dd479e9d62fe937605e56ef4e4 tags:
Bei dem Datensatz von 2018 fällt auf, dass die Wartezeiten sich erhöht
haben und die kurzen Eruptionsdauern mit weniger als drei Minuten kaum
noch vorkommen. Die Verteilung der langen Eruptionsdauern hat sich etwas
stärker um vier Minuten konzentriert. Es gibt Untersuchungen, die
vermuten, dass ein lokales Erdbeben 1998 diese Veränderung ausgelöst
hat. Bis 2008 gab es noch deutlich weniger Eruptionsdauern mit weniger
als drei Minuten.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment