From bfd25db02bd1f851626374ef56c6627e910bef41 Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 3 Aug 2025 16:47:28 +0000 Subject: [PATCH] Upload files to "/" --- covid19.py | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 covid19.py diff --git a/covid19.py b/covid19.py new file mode 100644 index 0000000..70ef5e1 --- /dev/null +++ b/covid19.py @@ -0,0 +1,70 @@ +#Ingest Data from JHU CCSE Covid19 Repository https://github.com/CSSEGISandData/COVID-19 +#Confirmed +#https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv +#Deaths +#https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Deaths.csv +#Recovered +#https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Recovered.csv +import csv +import requests +import itertools +import geohash +from datetime import datetime, tzinfo, timedelta +from influxdb import InfluxDBClient +class Zone(tzinfo): + def __init__(self, offset, isdst, name): + self.offset = offset + self.isdst = isdst + self.name = name + + def utcoffset(self, dt): + return timedelta(hours=self.offset) + self.dst(dt) + + def dst(self, dt): + return timedelta(hours=1) if self.isdst else timedelta(0) + + def tzname(self, dt): + return self.name +INFLUX_HOST = '192.168.10.6' +INFLUX_DB = 'covid19' +INFLUX_DBPORT = 8086 +INFLUX_USER = '' +INFUX_PASS = '' +client = InfluxDBClient(INFLUX_HOST, INFLUX_DBPORT,INFLUX_USER,INFUX_PASS, INFLUX_DB) +GMT = Zone(0, False, 'GMT') +#Direct Links to the 3 CSV Files maintained by JHU CCSE +inputfiles = {"confirmed":"https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv","deaths":"https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Deaths.csv","recovered":"https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Recovered.csv"} +measurements = [] +measurements_hash = {} +#Iterate through each Source File and build hash table +for i in sorted(inputfiles.keys()): + field = i + url = inputfiles[i] + response = requests.get(url) + if response.status_code != 200: + print('Failed to get data:', response.status_code) + else: + wrapper = csv.DictReader(response.text.strip().split('\n')) + results = [] + for record in wrapper: + today = datetime.today().replace(hour=23, minute=59, second=59, microsecond=59).replace(tzinfo=GMT).timestamp() + country = record['Country/Region'] + province = record['Province/State'] + location_hash = "{} {}".format(country, province) + datekeys=len(record)-4 + for k in sorted(record.keys())[:datekeys]: + datemdy = datetime.strptime(k, '%m/%d/%y').replace(hour=23, minute=59, second=59, microsecond=59).replace(tzinfo=GMT).timestamp() + time_loc_hash = "{}:{}".format(datemdy, location_hash) + if time_loc_hash not in measurements_hash: + measurements_hash[time_loc_hash] = {'measurement': 'covid19', 'tags': {}, 'fields': {}, 'time': int(datemdy) * 1000 * 1000 * 1000} + measurements_hash[time_loc_hash]['tags']['location'] = location_hash + measurements_hash[time_loc_hash]['tags']['country'] = country + measurements_hash[time_loc_hash]['tags']['province'] = province.strip() + measurements_hash[time_loc_hash]['tags']['geohash'] = geohash.encode(float(record['Lat']),float(record['Long'])) # Generate Geohash for use with Grafana Plugin + measurements_hash[time_loc_hash]['fields'][field] = int(record[k]) +#Iterate through Hash table and format for Influxdb Client +for m in measurements_hash: + measurements.append(measurements_hash[m]) +#Commit to Influxdb +if measurements: + client.write_points(measurements)