!pip install requests

!pip install pandas

"""
Explanation: APIs Modules - ein erste Blick auf "Requests"
Gezielt und automatisiert Daten im Web auslesen
Zuerst installieren wir pandas und requests. Das können wir von der Command line mit den Befehlen pip install requests und pip install pandas die beiden Module installieren. Oder direkt hier in Jupyter Notebook mit !pip install requests und !pip install pandas.
End of explanation
"""


import requests
import pandas as pd
import calendar, datetime, time

"""
Explanation: Unsere Imports
End of explanation
"""


url = 'https://earthquake.usgs.gov/fdsnws/event/1/count?starttime=2017-09-20&endtime=2017-09-21'

response = requests.get(url)

response

response.text

"""
Explanation: Zur Dokumentation von requestst geht es hier lang.
Notes
In einer ersten Übung arbeiten wir mit der API des USGS arbeiten. Für die meisten API muss man sich heutezutage eine eigene API-Key kreieren. Das werden wir zu einem späteren Zeitpunkt tun. Diese API braucht keine Keys. Deshalb ist es ein gutes Kennenlernbeispiel.
Falls Probleme mit dem Output auftauchen, hier ein Work around für die Meldung, dass der Output limitiert wurde. Reconfigure line output and opening stuff from the command line
Dokumentation
Bevor man mit deiner API arbeitet, lohnt es sich immer zuerst, die Dokumentation anzuschauen. 
Erste Abfragen
Kleinere Abfrage. Wieviele Erdbeben hat es in einem bestimmten Zeitraum gegeben?#APIs die genutzt werden wollen, dokumentieren ihren Aufbau auf der Website - zB ws-old.parlament
End of explanation
"""


url = 'https://earthquake.usgs.gov/fdsnws/event/1/count?starttime=2017-09-20T22:00:00&endtime=2017-09-21T06:00:00'#Funktion bis ? Dann Parameter mit & verbunden

"""
Explanation: Wieviele hat es letzte Nacht von 22 bis 6 Uhr morgens gegeben? Dafür müssen wir in der Dokumentation Time nachfragen.
End of explanation
"""


url = 'https://earthquake.usgs.gov/fdsnws/event/1/count?starttime=2017-09-20T24:00:00&endtime=2017-09-21T08:00:00'

response = requests.get(url)
response.text

"""
Explanation: Wegen Zeitverschiebung Zeit anpassen.
End of explanation
"""


url1 = 'https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson'#query heisst wir suchen bestimmte erdbeben

urlzeit = '&starttime=2017-09-17T24:00:00&endtime=2017-09-21T08:00:00'

response = requests.get(url1+urlzeit)#Ich hänge die beiden Variablen zusammen
response.text#Alle Erdbeben auf der ganzen Welt in diesem Zeitraum

"""
Explanation: Grosse, komibinierte Abfrage
Details zu allen Erbeben in den über drei Tage, 17-9-2017 bis 21-9-2017.
End of explanation
"""


urlloc = '&minlatitude=13&maxlatitude=33&minlongitude=-120&maxlongitude=-85'

response = requests.get(url1+urlzeit+urlloc)
response.text

"""
Explanation: Alle Erbeben mit den ungefähren Koordinaten von Mexiko. Hier könnte man die ungefähr nachschlagen.
End of explanation
"""


response.json()#json strukturiert die daten. Ich sehe es ist ein dictionyry von zwei listen, die wiederum dictionaries enthält mit keys  und values - wo beginnt sie; es nur zwei keys: bbox und features. features ist interessanter

dct = response.json()

"""
Explanation: Dieser Wulst lässt sich aber ziemlich schwer lesen. Deshalb müssen wir das zuerst umformatieren und dann verstehen, wie das ganze strukturiert ist.
End of explanation
"""


type(dct)

"""
Explanation: Um sicher zu gehen, prüfen wir nochmals den Datentyp.
End of explanation
"""


for key, value in dct.items() :# mit .items angehängt an dictionnary-name druckt value und keys aus
    print (key, value)

"""
Explanation: Schauen wir uns alle keys und values an
End of explanation
"""


type(dct['features'][0])#type zeigt mir den Datentyp; mit (0) sage ich, dass er mir erstes der Features

len(dct['features'])

"""
Explanation: Features interessiert uns.
End of explanation
"""


for key in dct['features'][0]:#so frage ich die Keys im Value Feature ab
    print(key)

dct['features'][0]#so frage ich das erste element von features ab

"""
Explanation: Schauen wir uns das erste Element an
End of explanation
"""


earthquakes = []#Leere Liste kreieren

for elem in dct['features']:
    t = elem['properties']['type']#in den properties (die ich ja vorhin als element gefunden habe) will ich 
    m = elem['properties']['mag']
    p = elem['properties']['place']
    tm = elem['properties']['time']
    
    mini_dict = {'Type': t,
                 'Mag': m,
                 'Place': p,
                 'Time': tm}#Hier baue ich mein eigenes Dictionary auf; die Begriffe kann ich selbst wählen
    
    earthquakes.append(mini_dict)

"""
Explanation: Lesen wir folgendes aus:
1. Type
2. Magnitude
4. Örtlichkeit
5. Time
End of explanation
"""


earthquakes

earthquakes = []

for elem in dct['features']:
    t = elem['properties']['type']
    m = elem['properties']['mag']
    p = elem['properties']['place']
    
    #Ints bearbeiten, die letzten drei Stellen abschneiden (weil der Converter von Unixtime in Normalzeit die Angabe nur lesen kann, wenn die letzten drei Zahlen weg sind); ich muss zahl zuerst in string verwandeln, weil man nur dort die drei letzten zeichen abschneiden kann; dann verwandle ich es wieder in eine zahl zurück und mit dt
    tm = dt(int(str(elem['properties']['time'])[:-3])) 
    
    mini_dict = {'Type': t,
                 'Mag': m,
                 'Place': p,
                 'Time': tm}
    
    earthquakes.append(mini_dict)

earthquakes

"""
Explanation: Dealing with Unix time
End of explanation
"""


pd.DataFrame(earthquakes)#es muss aber eine dictionary-Liste sein; kann auch nur eine Liste sein, dann gibt es nur eine Spalte

df = pd.DataFrame(earthquakes)

df.sort_values(by='Mag', ascending=False)#startet von 'Mag'; default Einstellung: beginnt beim kleinsten, wenn ich beim stärksten beginnen will, muss ich ascending=false eingeben

"""
Explanation: Erste Erfahrung mit Pandas
End of explanation
"""


df.to_csv('erdbeben.csv')

"""
Explanation: Speichern wir das ab.
End of explanation
"""


