107 lines
3.3 KiB
Python
107 lines
3.3 KiB
Python
|
#!/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()
|