Create ApiCall.py
Browse files- pages/ApiCall.py +94 -0
pages/ApiCall.py
ADDED
@@ -0,0 +1,94 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
## Imports ##
|
2 |
+
import requests
|
3 |
+
import pandas as pd
|
4 |
+
from datetime import datetime
|
5 |
+
from datetime import timezone
|
6 |
+
from Location import *
|
7 |
+
|
8 |
+
class ApiCall:
|
9 |
+
def getData(self):
|
10 |
+
## Api Variablen für NINA
|
11 |
+
api_variablen = {
|
12 |
+
"hochwasser": "/lhp/mapData",
|
13 |
+
"polizei": "/police/mapData",
|
14 |
+
"wetter": "/dwd/mapData",
|
15 |
+
"katwarn": "/katwarn/mapData",
|
16 |
+
"mowas": "/mowas/mapData"
|
17 |
+
}
|
18 |
+
|
19 |
+
# Dataframe Collumns definieren
|
20 |
+
columns = ['ID', 'Urgency','Area', 'Titel', 'Event', 'Datum']
|
21 |
+
|
22 |
+
# NINA Api URLs
|
23 |
+
ninaBaseUrl = "https://warnung.bund.de/api31"
|
24 |
+
ninaWarningsUrl = "https://nina.api.proxy.bund.dev/api31/warnings/"
|
25 |
+
|
26 |
+
# Einzelne NINA Warnings abfragen
|
27 |
+
def get_api_warning(meldung):
|
28 |
+
response = requests.get(ninaBaseUrl+meldung+".json")
|
29 |
+
return response.json()
|
30 |
+
|
31 |
+
# Details zu NINA Warning abfragen: Return DataFrame mit allen Ergebnissen
|
32 |
+
def get_api_details(warning):
|
33 |
+
n = 0
|
34 |
+
response = get_api_warning(warning)
|
35 |
+
df = pd.DataFrame(columns=columns)
|
36 |
+
# GetDetails for warning
|
37 |
+
for responses in response:
|
38 |
+
id = responses["id"]
|
39 |
+
warningDetails = requests.get(ninaWarningsUrl+id+".json").json()
|
40 |
+
meldungsText = warningDetails["info"][0]["headline"]+ ": "+warningDetails["info"][0]["description"]
|
41 |
+
warnung = warningDetails["info"][0]["event"]
|
42 |
+
start = warningDetails["sent"]
|
43 |
+
urgency = warningDetails["info"][0]["urgency"]
|
44 |
+
area = warningDetails["info"][0]["area"][0]["areaDesc"]
|
45 |
+
d = datetime.fromisoformat(start).astimezone(timezone.utc)
|
46 |
+
d.strftime('%Y-%m-%d %H:%M:')
|
47 |
+
time = d.replace(tzinfo=None)
|
48 |
+
df.loc[n] = [id, urgency, area, meldungsText, warnung, time]
|
49 |
+
n = n+1
|
50 |
+
return df
|
51 |
+
|
52 |
+
## Dataframe to CSV
|
53 |
+
def df_to_csv(data, filename):
|
54 |
+
data.to_csv(filename+'.csv')
|
55 |
+
|
56 |
+
# Dataframe definieren
|
57 |
+
data = pd.DataFrame(columns=columns)
|
58 |
+
|
59 |
+
## API abfragen für alle NINA Variablen/Warnings ##
|
60 |
+
for x in api_variablen:
|
61 |
+
data_api = get_api_details(api_variablen[x])
|
62 |
+
data = pd.concat([data, data_api])
|
63 |
+
|
64 |
+
# DataFrame df2 erstellen
|
65 |
+
data['Area'] = data['Area'].str.split(', ')
|
66 |
+
df2 = data.explode('Area')
|
67 |
+
|
68 |
+
# Neue Zeile mit Plz erstellen
|
69 |
+
def berechnung_func(row):
|
70 |
+
loca = row['Area']
|
71 |
+
ort = loca.replace("Gemeinde", "")
|
72 |
+
ort = loca.replace("Stadt", "")
|
73 |
+
ort = loca.replace("Mitgliedsgemeinde in Verwaltungsgemeinschaft", "")
|
74 |
+
|
75 |
+
###### TODO #####
|
76 |
+
# Orte klein schreiben und filtern nach und ... #
|
77 |
+
###### TODO #####
|
78 |
+
location = Location(ort.strip()).getPostalCode()
|
79 |
+
plz = location.iloc[0]['name']
|
80 |
+
|
81 |
+
return plz
|
82 |
+
|
83 |
+
df2['Plz'] = df2.apply(berechnung_func, axis=1)
|
84 |
+
|
85 |
+
# API Daten in CSV speichern
|
86 |
+
df_to_csv(df2, "Data")
|
87 |
+
|
88 |
+
# Return
|
89 |
+
return df2
|
90 |
+
|
91 |
+
# Testing
|
92 |
+
# l1 = ApiCall().getData()
|
93 |
+
|
94 |
+
|