#!/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()