Files
Corona/verdoppelungsrate.py
T

93 lines
3.9 KiB
Python
Raw Normal View History

2020-04-03 09:39:48 +02:00
import toml
import os
import db_model as db
2020-04-03 13:42:08 +02:00
from peewee import PostgresqlDatabase
2020-04-03 09:39:48 +02:00
import datetime
2020-04-03 13:42:08 +02:00
from sshtunnel import SSHTunnelForwarder
2020-10-26 20:17:19 +01:00
from corona_statistik import CoronaStatistik
2020-04-03 09:39:48 +02:00
def config_laden():
configfile = os.path.join(SKRIPTPFAD, "config.toml")
with open(configfile) as file:
return toml.loads(file.read())
SKRIPTPFAD = os.path.abspath(os.path.dirname(__file__))
CONFIG = config_laden()
QUELLEN = ["jhu", "who", "rki"]
2020-10-26 20:17:19 +01:00
TYP = "verdoppelungsrate"
def letzten_eintrag_ermitteln(quelle, country_region):
ts = db.CoronaStatistik.select(
db.CoronaStatistik.ts).where((db.CoronaStatistik.typ == TYP) &
(db.CoronaStatistik.quelle == quelle) &
(db.CoronaStatistik.country_region == country_region)
).order_by(db.CoronaStatistik.ts.desc()).limit(1).scalar()
return ts
2020-04-03 09:39:48 +02:00
def verdoppelungsrate_ermitteln(quelle, land, confirmed, confirmed_ts):
halbe_infizierte = confirmed / 2
ts_halbe = db.CoronaDaten.select(db.CoronaDaten.ts).where(
(db.CoronaDaten.quelle == quelle) & (db.CoronaDaten.country_region == land) &
(db.CoronaDaten.confirmed < halbe_infizierte)).order_by(db.CoronaDaten.confirmed.desc()).limit(1).scalar()
try:
verdoppelungstage = (confirmed_ts - ts_halbe).total_seconds()
except TypeError:
verdoppelungstage = None
return verdoppelungstage
2020-10-26 20:17:19 +01:00
def letzte_verdopplungsraten_berechnen(quelle, land, ts):
kein_passender_eintrag = False
daten = []
2020-04-03 09:39:48 +02:00
query = db.CoronaDaten.select(db.CoronaDaten.ts, db.CoronaDaten.confirmed).where(
2020-04-03 13:42:08 +02:00
(db.CoronaDaten.quelle == quelle) & (db.CoronaDaten.country_region == land) & (db.CoronaDaten.ts > ts)).dicts()
2020-04-03 09:39:48 +02:00
for datensatz in query:
2020-04-03 13:42:08 +02:00
verdoppelungsrate = verdoppelungsrate_ermitteln(quelle, land, datensatz["confirmed"], datensatz["ts"])
2020-04-03 09:39:48 +02:00
if verdoppelungsrate is not None:
2020-04-03 13:42:08 +02:00
verdoppelungsrate_tage = round(verdoppelungsrate_in_tagen(verdoppelungsrate), 3)
2020-10-26 20:17:19 +01:00
print(f"Verdoppelungsrate für {land} ({quelle}) am {datensatz['ts']}: {verdoppelungsrate_tage}")
daten.append(CoronaStatistik(datensatz["ts"], quelle, land, TYP, verdoppelungsrate_tage))
else:
print(f"Kein passender Eintrag gefunden für {land} ({quelle})")
kein_passender_eintrag = True
if kein_passender_eintrag:
print(f"Setze -1 für {land} ({quelle})")
daten.append(CoronaStatistik(datetime.datetime.now(), quelle, land, TYP, -1))
return daten
2020-04-03 09:39:48 +02:00
def verdoppelungsrate_in_tagen(verdoppelungsrate):
try:
return verdoppelungsrate / (60 * 60 * 24)
except TypeError:
return None
def main():
2020-04-03 13:42:08 +02:00
with SSHTunnelForwarder(
(CONFIG["ssh"]["ip_server"], CONFIG["ssh"]["ssh_port"]), ssh_username=CONFIG["ssh"]["user"],
ssh_password=CONFIG["ssh"]["pw"], remote_bind_address=('127.0.0.1', CONFIG["pg"]["pgport"])) as server:
db.database.initialize(PostgresqlDatabase(CONFIG["pg"]["pgdb"],
user=CONFIG["pg"]["pguser"], password=CONFIG["pg"]["pgpw"],
host="127.0.0.1",
port=server.local_bind_port))
query_quelle = db.CoronaDaten.select(db.CoronaDaten.quelle).group_by(db.CoronaDaten.quelle)
for data in query_quelle:
query_country = db.CoronaDaten.select(
db.CoronaDaten.country_region).where(db.CoronaDaten.quelle == data.quelle
).group_by(db.CoronaDaten.country_region)
for datensatz in query_country:
if data.quelle == "jhu" and datensatz.country_region == "Germany":
2020-10-26 20:17:19 +01:00
letzte_verdopplungsraten_berechnen(data.quelle, datensatz.country_region, datetime.datetime(2020, 4, 3))
db.Database.close(db.database)
2020-04-03 09:39:48 +02:00
if __name__ == "__main__":
main()