openlamb/openlamb.py

107 lines
3.3 KiB
Python
Executable File

#!/usr/bin/env python
# pylint: skip-file
import argparse
import traceback
import sys
import subprocess
import pandas as pd
import numpy as np
from sodapy import Socrata
import matplotlib.pyplot as plt
datasets_ambiente = {"2020": "nicp-bhqi",
"2019": "kujm-kavy",
"2018": "bgqm-yq56",
"2017": "j8j8-qsb2"}
def _connect():
client = Socrata("www.dati.lombardia.it", None)
return client
def process_dataset(dataset, sensore):
client = _connect()
results = client.get(dataset, IdSensore=sensore)
results_df = pd.DataFrame.from_records(results)
try:
results_df = results_df.astype({'valore': 'float64'})
except:
print('\nspiacente, dati non disponibili per il sensore %s') % sensore
sys.exit(-1)
results_df["data"] = pd.to_datetime(results_df["data"])
results_df = results_df.replace(-9999, np.nan)
results_df.sort_values(by=['data'], inplace=True)
results_df.rename(columns = {'valore':sensore}, inplace = True)
results_df.drop(columns=['idoperatore', 'idsensore', 'stato'], inplace = True)
return results_df
def merge_df(dataframes, sensori):
df = dataframes[sensori[0]]
for sensore in sensori[1:]:
df = pd.merge(df, dataframes[sensore])
return df
def get_dataframes(datasets, sensori):
dataframes = {}
for sensore in sensori:
df = process_dataset(datasets[0], sensore)
for dataset in datasets[1:]:
df = pd.concat([df, process_dataset(dataset, sensore)], axis=0)
dataframes[sensore] = df
return dataframes
def plot_dataframe(dataframe):
dataframe.plot(x='data')
plt.axhline(y=50, color='black', linestyle='-', label='24-hour average EU limit')
plt.show()
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--dataset", nargs='+', required=True, help="ricerca dei datasets")
parser.add_argument('--sensori', nargs='+', required=True, help="specifica i sensori")
args = parser.parse_args()
try:
datasets = []
if "all" in args.dataset:
for k in datasets_ambiente.keys():
datasets.append(datasets_ambiente[k])
else:
for d in args.dataset:
datasets.append(datasets_ambiente[d])
sensori = args.sensori
dataframes = get_dataframes(datasets, sensori)
datamerged = merge_df(dataframes, sensori)
import stazioni
s = stazioni.get_stazioni()
for sensore in sensori:
location = s.loc[s['idsensore'] == sensore, 'nomestazione'].iloc[0]
print('Valore medio per il sensore %s %s: %s' % (sensore, location, datamerged[sensore].mean().round(1)))
plot_dataframe(datamerged)
except KeyError:
print("\nErrore:")
#print("Datasets disponibili:")
#print('\n'.join([str(lst) for lst in sorted(datasets_ambiente.keys())]))
traceback.print_exc()
except KeyboardInterrupt:
print("program terminated by user")
except SystemExit:
print("program terminated, bye")
except:
print("\nAn unhandled exception occured, here's the traceback!\n")
traceback.print_exc()
print("\nReport this to putro@autistici.org")
sys.exit()
if __name__ == '__main__':
main()