def save_json(json_data: str, filename: str): conn_string = get_setting("AZURE_STORAGE_ACCOUNT") container = get_setting("BLOB_CONTAINER_NAME") blob_service_client = BlobServiceClient.from_connection_string(conn_string) blob_client = blob_service_client.get_blob_client(container=container, blob=filename) blob_client.upload_blob(json_data)
def read_DB_table(tableName): conn = pyodbc.connect('Driver={ODBC Driver 17 for SQL Server};' 'Server=' + get_setting("SERVER") + ';' 'Database=' + get_setting("DATABASE") + ';' 'Uid=' + get_setting("DB_USER") + ';' 'Pwd=' + get_setting("DB_PWD") + ';' 'Connection Timeout=30') cursor = conn.cursor() df_database = pd.read_sql_query('SELECT * FROM [dbo].[' + tableName + ']', conn) return df_database
def side_menu(): table_name = st.sidebar.text_input("Inserire il nome della tabella su cui fare la predizione") if(st.sidebar.button('Esegui Predizione')): with st.sidebar: try: if table_name == "": st.error("Errore: nome tabella non valido") else: df = read_data.read_DB_table(table_name) ###Senza trigger### # df_transform = preprocessing.dataset_transform(df) # df_preprocess = preprocessing.preprocessing(df_transform) # prediction = predict_model.score_model(df_preprocess) # df['Prediction'] = prediction # json_result = df.to_json(orient='split') # utc_timestamp = datetime.datetime.utcnow().strftime("%Y%m%d%H%M%S") # json_filename = f"prediction_{utc_timestamp}.json" # save_prediction.save_json(json_result, json_filename) ###Con trigger### utc_timestamp = datetime.datetime.utcnow().strftime("%Y%m%d%H%M%S") json_filename = f"prediction_{utc_timestamp}.json" response = requests.get(get_setting("TRIGGER_URL"), params={'table_name': table_name, 'json_filename': json_filename}) data = response.json().get("data") columns = response.json().get("columns") df = pd.DataFrame.from_dict(data) df.columns = columns outliers = df['Prediction'].loc[df.Prediction == -1].count()/df['Prediction'].count() * 100 st.write('La predizione effettuata sui dati, ha rilevato la presenza di outlier nella misura del %1.1f%%.' % outliers) labels = 'Outliers', 'Inliers' sizes = df.groupby('Prediction').count().Value if sizes.count() == 1: sizes[0] = 0 explode = (0.1, 0) fig, ax = plt.subplots(figsize=(15,10)) ax.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', startangle=90, textprops={'fontsize': 25}) ax.axis('equal') st.pyplot(fig) st.markdown(f'Per maggiori dettagli, è stato salvato nello storage il file *{json_filename}*') except Exception as e: st.error(f'Errore durante la predizione. \n{e}')
def score_model(data: pd.DataFrame): model_url = get_setting("MODEL_URL") headers = {'Authorization': f'Bearer {get_setting("DATABRICKS_TOKEN")}'} data_json = data.to_dict(orient='split') response = requests.request(method='POST', headers=headers, url=model_url, json=data_json) if response.status_code != 200: raise Exception( f'Request failed with status {response.status_code}, {response.text}' ) return response.json()