energy-reports-pkg 0.6.14__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- energy_reports_pkg-0.6.14.dist-info/METADATA +10 -0
- energy_reports_pkg-0.6.14.dist-info/RECORD +221 -0
- energy_reports_pkg-0.6.14.dist-info/WHEEL +5 -0
- energy_reports_pkg-0.6.14.dist-info/top_level.txt +1 -0
- mindsett_energy_reports_pkg/config/__init__.py +6 -0
- mindsett_energy_reports_pkg/config/email/__init__.py +37 -0
- mindsett_energy_reports_pkg/config/monday/__init__.py +8 -0
- mindsett_energy_reports_pkg/config/monday/auth/__init__.py +7 -0
- mindsett_energy_reports_pkg/config/monday/columns_concerned/__init__.py +22 -0
- mindsett_energy_reports_pkg/config/postgresdb/__init__.py +33 -0
- mindsett_energy_reports_pkg/config/postgresdb/table/__init__.py +2 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_building/__init__.py +1 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_building_total/__init__.py +1 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_cache/__init__.py +30 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_iot/__init__.py +1 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_mailing/__init__.py +15 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_meta/__init__.py +2 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_occupancy/__init__.py +3 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_on_off/__init__.py +2 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_org/__init__.py +1 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_price/__init__.py +2 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_schedule/__init__.py +1 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_sqm/__init__.py +2 -0
- mindsett_energy_reports_pkg/config/postgresdb/table_timezone/__init__.py +2 -0
- mindsett_energy_reports_pkg/config/sharepoint/__init__.py +12 -0
- mindsett_energy_reports_pkg/config/sharepoint/excel/__init__.py +5 -0
- mindsett_energy_reports_pkg/config/sharepoint/excel/columns_concerned/__init__.py +7 -0
- mindsett_energy_reports_pkg/config/smtp/__init__.py +10 -0
- mindsett_energy_reports_pkg/jobs/databricks_job.py +31 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/DataProcessor/__init__.py +14 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/DataProcessor/launchInteractiveProcess.py +6 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorBoardColumnNotMatch/__init__.py +6 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorBoardNotFound/__init__.py +5 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorException/__init__.py +4 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorNoColumInBoard/__init__.py +5 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorNoGroupsInBoard/__init__.py +5 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorNoItemInGroup/__init__.py +6 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorPageNotSupported/__init__.py +7 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/__init__.py +8 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/__init__.py +40 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchBoardById.py +13 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchBoardLogsById.py +33 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchColumnValueByGroup.py +103 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchGroups.py +19 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchPrismConf.py +10 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchPrismConfByBoard.py +83 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchPrismConfByGroup.py +89 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_searchColumnIdsByName.py +23 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_searchConfColumnIds.py +30 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/_searchConfColumnIdsMatch.py +20 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/__init__.py +11 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/__init__.py +12 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/__init__.py +11 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/__init__.py +10 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/items/__init__.py +12 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/items/column_values/__init__.py +10 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/items/column_values/column/__init__.py +2 -0
- mindsett_energy_reports_pkg/libs/MondayProcessor/launchInteractiveProcess.py +7 -0
- mindsett_energy_reports_pkg/libs/__init__.py +4 -0
- mindsett_energy_reports_pkg/libs/cache_return/__init__.py +47 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/__init__.py +29 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/load_cf_from_db/__init__.py +17 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/__init__.py +52 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/cache_cf_to_db/__init__.py +11 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/cache_cf_to_db/append_df_to_table/__init__.py +29 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/cache_cf_to_db/empty_table/__init__.py +11 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/__init__.py +57 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/get_mailing_list/__init__.py +25 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/load_mailing_list/__init__.py +50 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/load_mailing_list/columns_concerned/__init__.py +22 -0
- mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/get_last_update_time/__init__.py +26 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/__init__.py +27 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/load_cf_from_db/__init__.py +17 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/__init__.py +28 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/cache_cf_to_db/__init__.py +11 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/cache_cf_to_db/append_df_to_table/__init__.py +29 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/cache_cf_to_db/empty_table/__init__.py +11 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/__init__.py +13 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/__init__.py +57 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/columns_concerned/__init__.py +8 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/extract_id/# __init__.py +11 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/extract_id/__init__.py +19 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/get_mailing_list/__init__.py +10 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/uuid_for_nona/__init__.py +12 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/load_mailing_list/__init__.py +30 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/load_mailing_list/get_excel_file_from_link/__init__.py +30 -0
- mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/load_mailing_list/load_excel_as_df/__init__.py +45 -0
- mindsett_energy_reports_pkg/libs/generate_dag_id/__init__.py +20 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/__init__.py +42 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/__version__.py +8 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_airflow/__init__.py +47 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/__init__.py +25 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/get_credential_url/__init__.py +17 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/get_credential_url/databricks/__init__.py +10 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/get_credential_url/local/__init__.py +13 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_synapse/__init__.py +15 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_synapse/connect_lake_and_fetch_json/__init__.py +19 -0
- mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_synapse/datalake/__init__.py +7 -0
- mindsett_energy_reports_pkg/mdl/__init__.py +2 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/__init__.py +119 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_end_time/__init__.py +8 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_period_range/__init__.py +8 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_schedule_records/__init__.py +34 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_start_time/__init__.py +6 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_start_time_co2_barchart/__init__.py +7 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/__init__.py +93 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/email_report/__init__.py +47 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/__init__.py +75 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/apply_price_from_db/__init__.py +13 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/apply_price_from_db/load_energy_price/__init__.py +14 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/attach_id_to_buildings/__init__.py +24 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/attach_id_to_buildings/load_building/__init__.py +19 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/attach_id_to_buildings/load_org/__init__.py +13 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/check_and_keep_valid/__init__.py +36 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/load_sqm/__init__.py +11 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/load_timezone/__init__.py +11 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/__init__.py +43 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/__init__.py +47 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/__init__.py +40 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/__init__.py +71 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/plot_temperature_graph/__init__.py +35 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/plot_the_legend/__init__.py +26 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/setup_x_tick_lim/__init__.py +26 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/setup_x_tick_lim/generate_day_code/__init__.py +18 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/setup_x_tick_lim/generate_day_code/generate_day_code_list/__init__.py +38 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/setup_y_label_and_get_pos_bot_range/__init__.py +40 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/setup_y_label_and_get_pos_bot_range/get_pos_bot_and_ylim/__init__.py +30 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/plot_shifted_daily_barchart_with_temp/setup_y_tick_lim_label_zero_line/__init__.py +23 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/preprocessing_for_barchart/__init__.py +21 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/preprocessing_for_barchart/groupby_date_and_ooh_current_period/__init__.py +39 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/preprocessing_for_barchart/patch_missing_columns_for_ooh_and_sign/__init__.py +18 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/preprocessing_for_barchart/patch_missing_dates/__init__.py +28 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_energy_meter_with_benchmarking/__init__.py +42 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_energy_meter_with_benchmarking/energy_meter_with_benchmarking/__init__.py +66 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_energy_meter_with_benchmarking/energy_meter_with_benchmarking/benchmarking_design/__init__.py +194 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_energy_meter_with_benchmarking/energy_meter_with_benchmarking/benchmarking_design/ruler_anno_shink_cf/__init__.py +24 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_energy_meter_with_benchmarking/energy_meter_with_benchmarking/energy_meter_design/__init__.py +233 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_energy_meter_with_benchmarking/preprocessing_for_energy_meter_with_benchmarking/__init__.py +23 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/__init__.py +42 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/insight_statements/__init__.py +41 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/insight_statements/statement_for_avg_action_time/__init__.py +61 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/insight_statements/statement_for_biggest_ooh/__init__.py +31 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/insight_statements/statement_for_total_ooh/__init__.py +18 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/preprocessing_for_statement/__init__.py +85 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/__init__.py +29 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/plot_shifted_period_barchart/__init__.py +49 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/plot_shifted_period_barchart/set_x_label_prepare_xtick/__init__.py +24 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/plot_shifted_period_barchart/set_x_tick_and_lim/__init__.py +26 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/plot_shifted_period_barchart/setup_y_tick_lim_label_zero_line/__init__.py +31 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/preprocessing_for_period_barchart/__init__.py +43 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/preprocessing_for_period_barchart/patch_missing_ooh_periods_sign/__init__.py +23 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/__init__.py +56 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/__init__.py +109 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/colors/__init__.py +28 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/hatches/__init__.py +2 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_centre_pct/__init__.py +28 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_phase_balance/__init__.py +42 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_phase_balance/get_phase_markers/__init__.py +28 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_phase_balance/get_tick_values/__init__.py +44 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_phase_balance/plot_phase_balance_part/__init__.py +108 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_phase_balance/plot_phase_balance_part/ruler_anno_shink_cf/__init__.py +29 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_phase_balance/plot_phase_balance_part/ruler_symbol_cf/__init__.py +35 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_ring/__init__.py +87 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_ring/adjust_gap_for_visibility/__init__.py +19 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_ring/adjust_to_inner_ring/__init__.py +32 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_ring/adjust_values_for_better_visibility/__init__.py +27 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_ring/annotate_pct_on_pies/__init__.py +21 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/plot_ring/generate_pct_fmt/__init__.py +8 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/show_legend/__init__.py +36 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/show_legend/generate_legend_labels/__init__.py +50 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/show_legend/generate_legend_labels/get_formatted_arrow/__init__.py +18 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/show_legend/generate_legend_labels/get_formatted_name/__init__.py +14 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/show_legend/generate_legend_labels/get_formatted_pct/__init__.py +44 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/show_legend/generate_legend_labels/get_formatted_sum/__init__.py +31 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/plot_adaptive_ring_with_phase/show_legend/get_legend_handles/__init__.py +22 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_phases/__init__.py +37 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/__init__.py +26 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/group_and_pivot/__init__.py +24 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/transform_asset_stats_for_adaptive_piechart/__init__.py +30 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/transform_asset_stats_for_adaptive_piechart/get_change_pct_and_sort_and_trim_cols/__init__.py +34 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/transform_asset_stats_for_adaptive_piechart/get_entries_to_display/__init__.py +34 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/transform_asset_stats_for_adaptive_piechart/get_rank_overall_protect/__init__.py +14 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/transform_asset_stats_for_adaptive_piechart/get_subgroup_sum_and_rank/__init__.py +22 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/transform_asset_stats_for_adaptive_piechart/get_sum_for_curr_and_prev/__init__.py +20 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_report/PDF/__init__.py +44 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_report/PDF/write_multicell_with_styles.py +30 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_report/__init__.py +162 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/__init__.py +78 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/__init__.py +32 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/import_data_with_meta_postgres/__init__.py +47 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/import_data_with_meta_postgres/load_iot_data/__init__.py +28 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/import_data_with_meta_postgres/load_iot_data/load_iot_data_partition/__init__.py +24 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/import_data_with_meta_postgres/load_metadata/__init__.py +34 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/import_data_with_meta_postgres/load_metadata/get_meta_statement/__init__.py +32 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/query_building_total/__init__.py +40 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/refine_group_name/__init__.py +20 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/refine_group_name/exchange_group_name_column/__init__.py +10 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/validate_data_not_empty/__init__.py +9 -0
- mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/select_sites_and_emails/__init__.py +19 -0
- mindsett_energy_reports_pkg/mdl/utils_/__init__.py +17 -0
- mindsett_energy_reports_pkg/mdl/utils_/cache_df_to_db/__init__.py +11 -0
- mindsett_energy_reports_pkg/mdl/utils_/cache_df_to_db/append_df_to_table/__init__.py +29 -0
- mindsett_energy_reports_pkg/mdl/utils_/cache_df_to_db/empty_table/__init__.py +11 -0
- mindsett_energy_reports_pkg/mdl/utils_/cache_obj/__init__.py +50 -0
- mindsett_energy_reports_pkg/mdl/utils_/color_dict/__init__.py +13 -0
- mindsett_energy_reports_pkg/mdl/utils_/delete_files_in_directory/__init__.py +15 -0
- mindsett_energy_reports_pkg/mdl/utils_/enriching_time_features/__init__.py +66 -0
- mindsett_energy_reports_pkg/mdl/utils_/enriching_time_features/__version__.py +4 -0
- mindsett_energy_reports_pkg/mdl/utils_/generate_time_partition_list/__init__.py +14 -0
- mindsett_energy_reports_pkg/mdl/utils_/get_group_with_others/__init__.py +7 -0
- mindsett_energy_reports_pkg/mdl/utils_/get_pos_bot_range_unit_format/__init__.py +37 -0
- mindsett_energy_reports_pkg/mdl/utils_/get_pos_bot_range_unit_format/get_pos_bot_and_ylim/__init__.py +31 -0
- mindsett_energy_reports_pkg/mdl/utils_/modify_group_names/__init__.py +17 -0
- mindsett_energy_reports_pkg/mdl/utils_/patch_missing_periods/__init__.py +34 -0
- mindsett_energy_reports_pkg/mdl/utils_/plot_stacked_barchart/__init__.py +50 -0
- mindsett_energy_reports_pkg/mdl/utils_/send_email/__init__.py +73 -0
- mindsett_energy_reports_pkg/mdl/utils_/setup_table/__init__.py +40 -0
- mindsett_energy_reports_pkg/mdl/utils_/setup_table/check_table_existence/__init__.py +25 -0
- mindsett_energy_reports_pkg/mdl/utils_/setup_table/create_new_schema/__init__.py +8 -0
- mindsett_energy_reports_pkg/mdl/utils_/setup_table/create_table/__init__.py +73 -0
- mindsett_energy_reports_pkg/mdl/utils_/setup_table/empty_table/__init__.py +11 -0
@@ -0,0 +1,233 @@
|
|
1
|
+
|
2
|
+
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
|
3
|
+
|
4
|
+
import matplotlib.image as mpimg
|
5
|
+
import matplotlib.patches as mpatches
|
6
|
+
import matplotlib.text as mpltext
|
7
|
+
|
8
|
+
from os import path
|
9
|
+
|
10
|
+
cd = {"tomato": '#FF836A',"aquablue": '#6DC2B3',"peach": '#FED6D2',"darkgrey": '#9F9D9C',"potato": '#FEF8C8',
|
11
|
+
"cyan": '#B6E4E1',"dimgray":'#696969',"Seafoam":'#87e0cf',"gainsboro":'#DCDCDC'}
|
12
|
+
|
13
|
+
def energy_meter_design(ax, consumption_mwh_cur, consumption_mwh_pre, image_folder,
|
14
|
+
conv_mwh_co2 = 0.233,
|
15
|
+
conv_mwh_price = 190,
|
16
|
+
fx = 0.2, # fancy box x-axis value
|
17
|
+
fy = 0.3, # fancy box y-axis value
|
18
|
+
fs = 0.6, # fancy box scale factor
|
19
|
+
currency = 'GBP',
|
20
|
+
fontsize = 13
|
21
|
+
):
|
22
|
+
|
23
|
+
ax.set_xlim(0.2, 0.9)
|
24
|
+
ax.set_ylim(0.2, 0.9)
|
25
|
+
iz = 0.06 * fs # icon zooming factor
|
26
|
+
|
27
|
+
# add a fancy box as the energy meter outline
|
28
|
+
|
29
|
+
fancybox_width = fs
|
30
|
+
fancybox_height = fs
|
31
|
+
fancybox = mpatches.FancyBboxPatch(
|
32
|
+
[fx, fy], fancybox_width, fancybox_height, fc="w", ec='k', lw=1.5, ls= 'dotted',
|
33
|
+
boxstyle=mpatches.BoxStyle("Round", rounding_size=0.07, pad=0.02))
|
34
|
+
ax.add_artist(fancybox)
|
35
|
+
|
36
|
+
notes_fontsize = fontsize - 2
|
37
|
+
# text sub-title
|
38
|
+
text_title = mpltext.Text(x=fx+0.45*fs, y=fy+0.7*fs, text=f'Equivalent$^*$',
|
39
|
+
va=u'baseline', color='grey', ha=u'right', fontweight='light',fontstyle='italic', fontsize=notes_fontsize)
|
40
|
+
ax.add_artist(text_title)
|
41
|
+
|
42
|
+
# text footnote
|
43
|
+
|
44
|
+
## currency_symbol selection
|
45
|
+
currency_symbol_dict = {
|
46
|
+
'GBP': '£',
|
47
|
+
'EUR': '€',
|
48
|
+
'USD': '\$',
|
49
|
+
'SGD': 'S\$'
|
50
|
+
}
|
51
|
+
try:
|
52
|
+
currency_symbol = currency_symbol_dict[currency]
|
53
|
+
except:
|
54
|
+
raise Exception('There is no symbol provided for this currency!')
|
55
|
+
|
56
|
+
## symbol selection
|
57
|
+
text_footnote_with_co2 = f'* {conv_mwh_co2:1.3f}$t$ CO2e $\Leftrightarrow$ 1MWh $\Leftrightarrow$ {currency_symbol}{conv_mwh_price:1.1f}' # not used for now - 2024 Sep 23th
|
58
|
+
text_footnote_without_co2 = f'* 1MWh $\Leftrightarrow$ {currency_symbol}{conv_mwh_price:1.1f}'
|
59
|
+
text_footnote = mpltext.Text(x=fx+0.5*fs, y=fy+0.04*fs, text=text_footnote_without_co2,
|
60
|
+
va=u'baseline', color='k', ha=u'center', fontsize=notes_fontsize)
|
61
|
+
ax.add_artist(text_footnote)
|
62
|
+
|
63
|
+
## text readings settings
|
64
|
+
re_w = 0.80 # reading width
|
65
|
+
re_x = 0.127 # reading x-axis value
|
66
|
+
re_y = 0.80 # reading y-axis value
|
67
|
+
re_c = "k" # reading colour
|
68
|
+
r_fs = fontsize + 3 # reading fontsize # please note that the other sizes except default 13 haven't been tested yet
|
69
|
+
mr_fs = fontsize + 5 # main reading fontsize # please note that the other sizes except default 13 haven't been tested yet
|
70
|
+
|
71
|
+
## reading - energy
|
72
|
+
reading = consumption_mwh_cur
|
73
|
+
|
74
|
+
reading_abs = abs(reading) # the default unit is MWh
|
75
|
+
|
76
|
+
# adjust the decimal point and the unit based on the actual value
|
77
|
+
if reading_abs > 10:
|
78
|
+
reading_value = f"{reading:.0f} MWh"
|
79
|
+
elif reading_abs > 1:
|
80
|
+
reading_value = f"{reading:.1f} MWh"
|
81
|
+
elif reading_abs*1000 > 10:
|
82
|
+
reading_value = f"{reading*1000:.0f} KWh"
|
83
|
+
elif reading_abs*1000 > 1:
|
84
|
+
reading_value = f"{reading*1000:.1f} KWh"
|
85
|
+
elif reading_abs*1000_000 > 10:
|
86
|
+
reading_value = f"{reading*1000_000:.0f} Wh"
|
87
|
+
else:
|
88
|
+
reading_value = f"{reading*1000_000:.1f} Wh"
|
89
|
+
# reading - energy - text - monthly total
|
90
|
+
rt_x = re_x + 0.15 + 0.03
|
91
|
+
rt_y = re_y
|
92
|
+
readingtext = mpltext.Text(x=fx+rt_x*fs, y=fy+rt_y*fs, text=f'{reading_value}',
|
93
|
+
va=u'bottom', color=re_c, ha=u'center', fontweight="bold", fontsize=mr_fs)
|
94
|
+
|
95
|
+
# reading - energy - text - monthly change
|
96
|
+
rt_x = re_x + 0.65
|
97
|
+
rt_y = re_y + 0.02
|
98
|
+
|
99
|
+
|
100
|
+
change_value = (consumption_mwh_cur - consumption_mwh_pre) / abs(consumption_mwh_pre)
|
101
|
+
change_value_int = int(change_value*100)
|
102
|
+
|
103
|
+
# print(f'{consumption_mwh_cur = }')
|
104
|
+
# print(f'{consumption_mwh_pre = }')
|
105
|
+
# print(f'{change_value = }')
|
106
|
+
|
107
|
+
|
108
|
+
if change_value_int > 0:
|
109
|
+
change_arrow_str = r'${\blacktriangle}$'
|
110
|
+
elif change_value_int < 0:
|
111
|
+
change_arrow_str = r'$\:\!\triangledown\:\!$'
|
112
|
+
else :
|
113
|
+
change_arrow_str = r'--'
|
114
|
+
|
115
|
+
|
116
|
+
change_in_percentage_value = int(abs(change_value)*100)
|
117
|
+
|
118
|
+
if change_in_percentage_value > 999:
|
119
|
+
change_in_percentage_value_str = r"$\,$" + ">999" + "%"
|
120
|
+
elif change_in_percentage_value > 99:
|
121
|
+
change_in_percentage_value_str = r"$\,$" + str(change_in_percentage_value) + "%"
|
122
|
+
elif change_in_percentage_value > 9:
|
123
|
+
change_in_percentage_value_str = " " + str(change_in_percentage_value) + r"$\,$" + "%"
|
124
|
+
else:
|
125
|
+
change_in_percentage_value_str = " " + str(change_in_percentage_value) + r"$\;$" + "%"
|
126
|
+
|
127
|
+
|
128
|
+
change_in_percentage = change_arrow_str + change_in_percentage_value_str
|
129
|
+
text_percentage = mpltext.Text(x=fx+rt_x*fs, y=fy+rt_y*fs, text=f'{change_in_percentage}',
|
130
|
+
va=u'baseline', color='k', ha=u'center', fontweight="bold", fontsize=mr_fs)
|
131
|
+
ax.add_artist(text_percentage)
|
132
|
+
|
133
|
+
# horizontal line to separate the different readings
|
134
|
+
rl_x = re_x * 0.2 # the x-axis value of the line at the bottom of the reading
|
135
|
+
rl_y = re_y - 0.15 # the y-axis value of the line at the bottom of the reading
|
136
|
+
rl_w = re_w * 1.2 # the width value of the line at the bottom of the reading
|
137
|
+
horizontal_line = mpatches.Rectangle([fx+rl_x*fs, fy+rl_y*fs],
|
138
|
+
rl_w*fs, 0, facecolor="k", edgecolor='k', lw=1, ls= 'dotted')
|
139
|
+
ax.add_artist(readingtext)
|
140
|
+
ax.add_artist(horizontal_line)
|
141
|
+
|
142
|
+
|
143
|
+
## reading - co2
|
144
|
+
re_y = 0.48
|
145
|
+
reading = consumption_mwh_cur * conv_mwh_co2
|
146
|
+
|
147
|
+
# adjust the unit based on value
|
148
|
+
reading_value = f"{reading:1.1f} tons"
|
149
|
+
if reading_value == '0.0 tons':
|
150
|
+
reading_value = f"{round(reading*1000)} kg"
|
151
|
+
|
152
|
+
image_name = 'co2.png'
|
153
|
+
|
154
|
+
# reading - co2 - icon
|
155
|
+
ri_x = re_x + 0.09 # reading icon x-axis value
|
156
|
+
ri_y = re_y + 0.042
|
157
|
+
icon = mpimg.imread(image_folder + image_name)
|
158
|
+
ibox = OffsetImage(icon, zoom=2*iz)
|
159
|
+
readingicon = AnnotationBbox(ibox, (fx+ri_x*fs, fy+ri_y*fs), frameon = False)
|
160
|
+
|
161
|
+
# reading - co2 - text
|
162
|
+
rt_x = re_x + 0.342
|
163
|
+
rt_y = re_y
|
164
|
+
readingtext = mpltext.Text(x=fx+rt_x*fs, y=fy+rt_y*fs, text=f'{reading_value}',
|
165
|
+
va=u'bottom', color=re_c, ha=u'left', fontweight="bold", fontsize=r_fs)
|
166
|
+
|
167
|
+
# horizontal line to separate the different readings
|
168
|
+
rl_x = re_x # the x-axis value of the line at the bottom of the reading
|
169
|
+
rl_y = re_y - 0.07 # the y-axis value of the line at the bottom of the reading
|
170
|
+
rl_w = re_w * 0.9 # the width value of the line at the bottom of the reading
|
171
|
+
horizontal_line = mpatches.Rectangle([fx+rl_x*fs, fy+rl_y*fs],
|
172
|
+
rl_w*fs, 0, facecolor="k", edgecolor='k', lw=1, ls= 'dotted')
|
173
|
+
|
174
|
+
ax.add_artist(readingicon)
|
175
|
+
ax.add_artist(readingtext)
|
176
|
+
ax.add_artist(horizontal_line)
|
177
|
+
|
178
|
+
|
179
|
+
## reading - billing
|
180
|
+
re_y = 0.23
|
181
|
+
reading = consumption_mwh_cur * conv_mwh_price
|
182
|
+
reading_value = f"{reading:,.2f}".replace(".", ". ")
|
183
|
+
|
184
|
+
# adjust the size for visual effect
|
185
|
+
if len(reading_value) > 8:
|
186
|
+
reading_value = reading_value.replace(". ", ".")
|
187
|
+
if len(reading_value) > 8:
|
188
|
+
reading_value = reading_value[:-2]
|
189
|
+
|
190
|
+
# reading - billing - icon
|
191
|
+
|
192
|
+
## icon selection
|
193
|
+
currency_icon_dict = { # please note that the format has to be 512px png
|
194
|
+
'GBP': 'pound-sterling.png',
|
195
|
+
'EUR': 'euros.png',
|
196
|
+
'USD': 'dollar-symbol.png', # https://www.flaticon.com/free-icon/dollar-symbol_1140418?term=dollar+symbol&page=1&position=22&origin=search&related_id=1140418
|
197
|
+
'SGD': 'singapore-dollar.png' # https://www.flaticon.com/free-icon/singapore-dollar_9921422?term=singapore+dollar&page=3&position=73&origin=search&related_id=9921422
|
198
|
+
}
|
199
|
+
try:
|
200
|
+
image_name = currency_icon_dict[currency]
|
201
|
+
except:
|
202
|
+
raise Exception('There is no icon provided for this currency!')
|
203
|
+
|
204
|
+
## icon plotting
|
205
|
+
ri_x = re_x + 0.09 # reading icon x-axis value
|
206
|
+
ri_y = re_y + 0.06
|
207
|
+
icon = mpimg.imread(image_folder + image_name)
|
208
|
+
ibox = OffsetImage(icon, zoom=1.6*iz)
|
209
|
+
readingicon = AnnotationBbox(ibox, (fx+ri_x*fs, fy+ri_y*fs), frameon = False)
|
210
|
+
|
211
|
+
# reading - billing - text
|
212
|
+
rt_x = re_x + 0.342
|
213
|
+
rt_y = re_y
|
214
|
+
readingtext = mpltext.Text(x=fx+rt_x*fs, y=fy+rt_y*fs, text=f'{reading_value}',
|
215
|
+
va=u'bottom', color=re_c, ha=u'left', fontweight="bold", fontsize=r_fs)
|
216
|
+
|
217
|
+
# horizontal line to separate the different readings
|
218
|
+
rl_x = re_x # the x-axis value of the line at the bottom of the reading
|
219
|
+
rl_y = re_y - 0.07 # the y-axis value of the line at the bottom of the reading
|
220
|
+
rl_w = re_w * 0.9 # the width value of the line at the bottom of the reading
|
221
|
+
horizontal_line = mpatches.Rectangle([fx+rl_x*fs, fy+rl_y*fs],
|
222
|
+
rl_w*fs, 0, facecolor="k", edgecolor='k', lw=1, ls= 'dotted')
|
223
|
+
|
224
|
+
ax.add_artist(readingicon)
|
225
|
+
ax.add_artist(readingtext)
|
226
|
+
ax.add_artist(horizontal_line)
|
227
|
+
|
228
|
+
|
229
|
+
## benchmarking design
|
230
|
+
re_y = 0.65
|
231
|
+
ri_y = re_y + 0.07*fs
|
232
|
+
|
233
|
+
ax.axis('equal')
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def preprocessing_for_energy_meter_with_benchmarking(df_meta_with_value_building,
|
4
|
+
period_column="period",
|
5
|
+
kwh_column="kwh"):
|
6
|
+
|
7
|
+
df_period_total = df_meta_with_value_building.groupby([period_column])[kwh_column].sum().div(1000).tail(2)
|
8
|
+
|
9
|
+
# for avoiding the case that we don't have data for the previous week
|
10
|
+
if df_period_total.shape[0] < 2:
|
11
|
+
consumption_mwh_cur = df_period_total.to_list()[0]
|
12
|
+
consumption_mwh_pre = consumption_mwh_cur
|
13
|
+
else:
|
14
|
+
consumption_mwh_pre, consumption_mwh_cur = df_period_total.to_list()
|
15
|
+
|
16
|
+
period_freqstr = df_period_total.index[-1].freqstr
|
17
|
+
|
18
|
+
if period_freqstr == "M":
|
19
|
+
days_in_period = df_period_total.index[-1].daysinmonth
|
20
|
+
else:
|
21
|
+
days_in_period = 7
|
22
|
+
|
23
|
+
return consumption_mwh_cur, consumption_mwh_pre, days_in_period
|
@@ -0,0 +1,42 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
import pickle
|
3
|
+
|
4
|
+
from .preprocessing_for_statement import preprocessing_for_statement
|
5
|
+
from .insight_statements import insight_statements
|
6
|
+
|
7
|
+
|
8
|
+
def generate_insight_statements(db, df_meta_with_value,
|
9
|
+
asset_group = "asset_class",
|
10
|
+
# fixed_group_to_filter = [],
|
11
|
+
directory_to_savefile=None): # todo: update the default value for directory
|
12
|
+
|
13
|
+
df_for_statements = preprocessing_for_statement(df_meta_with_value, asset_group=asset_group)
|
14
|
+
|
15
|
+
# print('df_for_statements: ', df_for_statements) # debug
|
16
|
+
|
17
|
+
if df_for_statements is not None:
|
18
|
+
# get the readable name of period frequency
|
19
|
+
current_period_obj = df_meta_with_value.period.max()
|
20
|
+
period_type = current_period_obj.freqstr[0]
|
21
|
+
period_freq_str_dict = {'W': 'week', 'M': 'month'}
|
22
|
+
period_freq_str = period_freq_str_dict[period_type]
|
23
|
+
|
24
|
+
statements_list = insight_statements(db, df_for_statements, df_meta_with_value, period_freq_str=period_freq_str)
|
25
|
+
else:
|
26
|
+
statements_list = ['Auto observations for 24/7 sites are not yet available!']
|
27
|
+
|
28
|
+
# Specify the directory to save figures, if it does not exist, create it
|
29
|
+
# Path(directory_to_savefile).mkdir(parents=True, exist_ok=True)
|
30
|
+
|
31
|
+
# with open(directory_to_savefile+'statements.pkl', 'wb') as f:
|
32
|
+
# pickle.dump(statements_list, f)
|
33
|
+
|
34
|
+
pkl_name = 'statements.pkl'
|
35
|
+
if directory_to_savefile == None:
|
36
|
+
# obj_object = io.BytesIO()
|
37
|
+
return {pkl_name: statements_list}
|
38
|
+
else:
|
39
|
+
pkl_path = directory_to_savefile + pkl_name
|
40
|
+
with open(pkl_path, 'wb') as f:
|
41
|
+
pickle.dump(statements_list, f)
|
42
|
+
return {pkl_name: pkl_path}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
from .statement_for_biggest_ooh import statement_for_biggest_ooh
|
3
|
+
from .statement_for_total_ooh import statement_for_total_ooh
|
4
|
+
from .statement_for_avg_action_time import statement_for_avg_action_time
|
5
|
+
|
6
|
+
|
7
|
+
def insight_statements(db, df_for_statements, df_meta_with_value, period_freq_str='week'): #df_meta_with_value is only used to get metadata information
|
8
|
+
|
9
|
+
statements_list = []
|
10
|
+
|
11
|
+
statement_str_total_ooh = statement_for_total_ooh(df_for_statements,
|
12
|
+
period_freq_str=period_freq_str)
|
13
|
+
statements_list.append(statement_str_total_ooh)
|
14
|
+
|
15
|
+
# preparation for the third statement
|
16
|
+
|
17
|
+
thing_name = 'Pizza Oven'
|
18
|
+
|
19
|
+
if thing_name in df_meta_with_value['thing_name'].str.lstrip().str.rstrip("0123456789 ").unique():
|
20
|
+
|
21
|
+
building_name = df_meta_with_value['building_name'].unique()[0]
|
22
|
+
max_period = df_meta_with_value["period"].max()
|
23
|
+
start_time_str = max_period.start_time
|
24
|
+
end_time_str = max_period.end_time
|
25
|
+
|
26
|
+
statement_str_avg_action_time = statement_for_avg_action_time(db, building_name, thing_name, start_time_str, end_time_str,
|
27
|
+
action=1,
|
28
|
+
period_freq_str=period_freq_str) # None will be returned if no on/off data is found
|
29
|
+
if statement_str_avg_action_time is not None:
|
30
|
+
|
31
|
+
statements_list.append(statement_str_avg_action_time)
|
32
|
+
|
33
|
+
# Statement for biggest OOH
|
34
|
+
|
35
|
+
# print('df_for_statements: ', df_for_statements)
|
36
|
+
|
37
|
+
statement_str_biggest_ooh = statement_for_biggest_ooh(df_for_statements,
|
38
|
+
period_freq_str=period_freq_str)
|
39
|
+
statements_list.append(statement_str_biggest_ooh)
|
40
|
+
|
41
|
+
return statements_list
|
@@ -0,0 +1,61 @@
|
|
1
|
+
from datetime import timedelta
|
2
|
+
import pandas as pd
|
3
|
+
# from sqlalchemy import create_engine
|
4
|
+
|
5
|
+
from mdl.utils_ import enriching_time_features
|
6
|
+
|
7
|
+
def statement_for_avg_action_time(db, building_name, thing_name, start_time, end_time,
|
8
|
+
action=1,
|
9
|
+
period_freq_str='week'):
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
time_restriction = f"""(time >= '{start_time}') and (time < '{end_time}')"""
|
14
|
+
|
15
|
+
statement_list = [f""""root_name"='{building_name}'"""]
|
16
|
+
statement_full = " and ".join(statement_list)
|
17
|
+
|
18
|
+
query = f"""select time,action,root_name,thing_name from {db.table_on_off.name} where {statement_full} and {time_restriction};"""
|
19
|
+
|
20
|
+
engine = db.engine
|
21
|
+
|
22
|
+
with engine.connect() as conn:
|
23
|
+
df_on_off = pd.read_sql_query(query, con=conn)
|
24
|
+
|
25
|
+
df_on_off['thing_name'] = df_on_off['thing_name'].str.lstrip().str.rstrip("0123456789 ")
|
26
|
+
|
27
|
+
df_on_off_selected = df_on_off.loc[df_on_off['thing_name']==thing_name]
|
28
|
+
|
29
|
+
|
30
|
+
if df_on_off_selected.shape[0] > 0: # handle the case that no on/off data is returned
|
31
|
+
|
32
|
+
df_on_off_selected = enriching_time_features(df_on_off_selected)
|
33
|
+
|
34
|
+
df_on_off_avg = df_on_off_selected.groupby(['action']).time_of_day_in_float.mean()
|
35
|
+
|
36
|
+
avg_start_time = str(timedelta(hours=df_on_off_avg[action])).split('.')[0][:-3]
|
37
|
+
|
38
|
+
# AM/PM to the time
|
39
|
+
|
40
|
+
time_list = avg_start_time.split(":")
|
41
|
+
|
42
|
+
hour_digit = int(time_list[0])
|
43
|
+
if hour_digit < 12:
|
44
|
+
letter = " AM"
|
45
|
+
else:
|
46
|
+
letter = " PM"
|
47
|
+
if hour_digit >= 13:
|
48
|
+
time_list[0] = str(hour_digit-12)
|
49
|
+
|
50
|
+
time_list.append(letter)
|
51
|
+
time_list[1] = ":"+time_list[1]
|
52
|
+
avg_start_time_with_letter = "".join(time_list)
|
53
|
+
|
54
|
+
start_finish_dict = {1: 'start', -1: 'finish'}
|
55
|
+
|
56
|
+
|
57
|
+
statement = f"{avg_start_time_with_letter} was the average {start_finish_dict[action]} time for the {thing_name} over this {period_freq_str}." # temp fix
|
58
|
+
else:
|
59
|
+
statement = None
|
60
|
+
|
61
|
+
return statement
|
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def statement_for_biggest_ooh(df_asset_group_period_sum_others, number_for_pick_out=3, period_freq_str='week'):
|
4
|
+
|
5
|
+
# print('df_asset_group_period_sum_others: ', df_asset_group_period_sum_others) # debug
|
6
|
+
|
7
|
+
if (number_for_pick_out+1) > df_asset_group_period_sum_others.shape[0]: # there are two rows for "Total" and "Others", this is to avoid them to be shown.
|
8
|
+
|
9
|
+
number_for_pick_out = df_asset_group_period_sum_others.shape[0] - 2
|
10
|
+
|
11
|
+
print(f'[WARN]: in func [statement_for_biggest_ooh], the no. of entries in df_asset_group_period_sum_others [{df_asset_group_period_sum_others.shape[0]}] is smaller then the expected number_for_pick_out [ {number_for_pick_out}]', number_for_pick_out)
|
12
|
+
|
13
|
+
df_ooh_biggest = df_asset_group_period_sum_others.head(number_for_pick_out+1).tail(number_for_pick_out).drop(columns=['gt_pct_others','sum_for_sort'])
|
14
|
+
|
15
|
+
# pdb.set_trace()
|
16
|
+
|
17
|
+
statement = f"""The largest out-of-hours consumers of energy over the previous {period_freq_str} were: """ #temp fix
|
18
|
+
|
19
|
+
for index, item in enumerate(df_ooh_biggest['sum'].round().astype('int').items()):
|
20
|
+
|
21
|
+
if item[0] not in ['Total', 'Others']: # only add valid entries, not total and others.
|
22
|
+
|
23
|
+
statement_item = " \t \t \t \t"+str(index+1)+'. '+item[0]+' '+str(item[1])+' kwh,'
|
24
|
+
|
25
|
+
statement += statement_item
|
26
|
+
else:
|
27
|
+
print(f'[WARN]: statement_for_biggest_ooh - Please note that ooh category [{item[0]}] has been skipped')
|
28
|
+
|
29
|
+
statement = statement[:-1]+'.'
|
30
|
+
|
31
|
+
return statement
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def statement_for_total_ooh(df_asset_group_period_sum_others, row_index_for_total='Total', period_freq_str='week'):
|
4
|
+
|
5
|
+
sub_pct_value = df_asset_group_period_sum_others['sub_pct'][row_index_for_total]
|
6
|
+
sub_pct_abs_value = round(abs(sub_pct_value * 100))
|
7
|
+
|
8
|
+
if sub_pct_abs_value > 1:
|
9
|
+
if sub_pct_value > 0:
|
10
|
+
statement_direction = "up"
|
11
|
+
else:
|
12
|
+
statement_direction = "down"
|
13
|
+
statement = f"""The out-of-hours use has gone {statement_direction} by {sub_pct_abs_value}% compared to the {period_freq_str} before.""" #temp fix
|
14
|
+
|
15
|
+
else:
|
16
|
+
statement = f"""The out-of-hours use has been similar to the {period_freq_str} before.""" #temp fix
|
17
|
+
|
18
|
+
return statement
|
@@ -0,0 +1,85 @@
|
|
1
|
+
|
2
|
+
from datetime import date
|
3
|
+
import pandas as pd
|
4
|
+
|
5
|
+
from mdl.utils_ import get_group_with_others
|
6
|
+
|
7
|
+
def preprocessing_for_statement(df_meta_with_value,
|
8
|
+
asset_group='asset_class',
|
9
|
+
# fixed_group_to_filter = [], # should be all in lower case charactor # applying the variable column directly
|
10
|
+
row_index_for_total = "Total",
|
11
|
+
reading_interval_in_mins=10,
|
12
|
+
pct_level_tobe_others = 0):
|
13
|
+
|
14
|
+
#Conversion into MWh
|
15
|
+
w_to_kw_para = 1./1000
|
16
|
+
min_to_hour_para = 1./60
|
17
|
+
|
18
|
+
wm_to_kwh_parameter = w_to_kw_para * min_to_hour_para
|
19
|
+
reading_to_kwh_parameter = reading_interval_in_mins * wm_to_kwh_parameter
|
20
|
+
|
21
|
+
df_meta_with_value[asset_group] = df_meta_with_value[asset_group].str.strip()
|
22
|
+
# print('df_meta_with_value: ', df_meta_with_value)
|
23
|
+
|
24
|
+
df_meta_with_value_variable = df_meta_with_value.loc[df_meta_with_value['variable']==True]
|
25
|
+
|
26
|
+
sr_pivot_asset_group = df_meta_with_value_variable.groupby([asset_group, 'period', 'out_of_hours'])["W"].sum() * reading_to_kwh_parameter # Div 1000 for convertion to MWh
|
27
|
+
|
28
|
+
# print('sr_pivot_asset_groupindex: ', sr_pivot_asset_group.index)
|
29
|
+
sr_pivot_asset_group_unstack_ooh = sr_pivot_asset_group.unstack(["out_of_hours"])
|
30
|
+
|
31
|
+
if True not in sr_pivot_asset_group_unstack_ooh.columns:
|
32
|
+
return None
|
33
|
+
else:
|
34
|
+
df_pivot_asset_group_by_period_full = sr_pivot_asset_group_unstack_ooh[True].unstack(["period"])
|
35
|
+
|
36
|
+
df_pivot_asset_group_by_period_no_fixed = df_pivot_asset_group_by_period_full
|
37
|
+
|
38
|
+
# print("df_pivot_asset_group_by_period: ", df_pivot_asset_group_by_period) # debug
|
39
|
+
|
40
|
+
# using the 'period' information from the dataframe
|
41
|
+
period_range = df_pivot_asset_group_by_period_no_fixed.columns
|
42
|
+
period_current = period_range[-1]
|
43
|
+
|
44
|
+
# for avoiding the case that we don't have data for the previous week
|
45
|
+
if len(period_range) < 2:
|
46
|
+
period_tobe_compared = period_range[-1]
|
47
|
+
else:
|
48
|
+
period_tobe_compared = period_range[-2]
|
49
|
+
|
50
|
+
# todo: check whether the result can be obtained by unstack directly
|
51
|
+
# remove the assets that are generating energy
|
52
|
+
df_pivot_asset_group_by_period = df_pivot_asset_group_by_period_no_fixed.loc[df_pivot_asset_group_by_period_no_fixed[period_current]>0].copy()
|
53
|
+
df_pivot_asset_group_by_period_renamed = df_pivot_asset_group_by_period.loc[:,period_current].to_frame().rename(columns={period_current: "sum"})
|
54
|
+
df_pivot_asset_group_by_period_renamed["sum_pre"] = df_pivot_asset_group_by_period.loc[:,period_tobe_compared]
|
55
|
+
|
56
|
+
sr_total = df_pivot_asset_group_by_period_renamed.loc[df_pivot_asset_group_by_period_renamed['sum']>0].sum() # exclude the negative values
|
57
|
+
|
58
|
+
df_total = sr_total.to_frame().transpose()
|
59
|
+
df_total.index = [row_index_for_total]
|
60
|
+
|
61
|
+
df_total.index.name = df_pivot_asset_group_by_period_renamed.index.name
|
62
|
+
df_pivot_asset_group_by_period_renamed = pd.concat([df_pivot_asset_group_by_period_renamed, df_total])
|
63
|
+
|
64
|
+
df_pivot_asset_group_by_period_renamed['sub'] = df_pivot_asset_group_by_period_renamed.loc[:,'sum'] - df_pivot_asset_group_by_period_renamed.loc[:,'sum_pre']
|
65
|
+
|
66
|
+
df_pivot_asset_group_by_period_renamed["pct"] = df_pivot_asset_group_by_period_renamed["sum"]/df_pivot_asset_group_by_period_renamed.loc[row_index_for_total, "sum"]
|
67
|
+
df_pivot_asset_group_by_period_renamed["gt_pct_others"] = df_pivot_asset_group_by_period_renamed["pct"].gt(pct_level_tobe_others)
|
68
|
+
|
69
|
+
df_asset_group_period_sum = df_pivot_asset_group_by_period_renamed.reset_index()
|
70
|
+
|
71
|
+
df_asset_group_period_sum["group_with_others"] = df_asset_group_period_sum.apply(get_group_with_others,asset_group=asset_group,axis=1)
|
72
|
+
|
73
|
+
df_asset_group_period_sum_others = df_asset_group_period_sum.groupby(["group_with_others"]).sum(numeric_only=True)
|
74
|
+
|
75
|
+
df_asset_group_period_sum_others["sum_for_sort"] = df_asset_group_period_sum_others["sum"]
|
76
|
+
|
77
|
+
df_asset_group_period_sum_others.loc["Others", "sum_for_sort"] = 0
|
78
|
+
|
79
|
+
df_asset_group_period_sum_others.sort_values(["sum_for_sort"], ascending=False, inplace=True)
|
80
|
+
df_asset_group_period_sum_others["sub_pct"] = df_asset_group_period_sum_others["sub"]/df_asset_group_period_sum_others["sum_pre"]
|
81
|
+
|
82
|
+
return df_asset_group_period_sum_others
|
83
|
+
|
84
|
+
|
85
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import matplotlib.pyplot as plt
|
2
|
+
import io
|
3
|
+
|
4
|
+
from .preprocessing_for_period_barchart import preprocessing_for_period_barchart
|
5
|
+
from .plot_shifted_period_barchart import plot_shifted_period_barchart
|
6
|
+
|
7
|
+
|
8
|
+
def generate_period_barchart(df_meta_with_value_building,
|
9
|
+
fontsize = None,
|
10
|
+
directory_to_savefig=None):
|
11
|
+
|
12
|
+
df_grouped_working_hours_period_unstacked = preprocessing_for_period_barchart(df_meta_with_value_building)
|
13
|
+
|
14
|
+
# for testing
|
15
|
+
# df_grouped_working_hours_period_unstacked[True] = -0.3 * df_grouped_working_hours_period_unstacked[False]
|
16
|
+
|
17
|
+
plot_shifted_period_barchart(df_grouped_working_hours_period_unstacked, fontsize=fontsize)
|
18
|
+
|
19
|
+
png_name = 'period_barchart.png'
|
20
|
+
if directory_to_savefig == None:
|
21
|
+
png_object = io.BytesIO()
|
22
|
+
plt.savefig(png_object, format='png', dpi=200)
|
23
|
+
plt.close()
|
24
|
+
return {png_name: png_object}
|
25
|
+
else:
|
26
|
+
png_path = directory_to_savefig + png_name
|
27
|
+
plt.savefig(png_path, format='png', dpi=200)
|
28
|
+
plt.close()
|
29
|
+
return {png_name: png_path}
|
@@ -0,0 +1,49 @@
|
|
1
|
+
import matplotlib.pyplot as plt
|
2
|
+
|
3
|
+
from .set_x_label_prepare_xtick import set_x_label_prepare_xtick
|
4
|
+
from .setup_y_tick_lim_label_zero_line import setup_y_tick_lim_label_zero_line
|
5
|
+
from .set_x_tick_and_lim import set_x_tick_and_lim
|
6
|
+
|
7
|
+
from mdl.utils_ import get_pos_bot_range_unit_format
|
8
|
+
from mdl.utils_ import plot_stacked_barchart
|
9
|
+
|
10
|
+
def plot_shifted_period_barchart(df_grouped_working_hours_period_unstacked,
|
11
|
+
fs=None,
|
12
|
+
fontsize=None):
|
13
|
+
|
14
|
+
if fs is None:
|
15
|
+
fs = (3.51, 3.07)
|
16
|
+
|
17
|
+
plt.style.use('seaborn-v0_8-white')
|
18
|
+
fig, ax = plt.subplots(1, 1, figsize=fs)
|
19
|
+
|
20
|
+
df_grouped_working_hours_period_reset_with_sign = df_grouped_working_hours_period_unstacked.reset_index(drop=True)
|
21
|
+
freqstr = df_grouped_working_hours_period_unstacked.index.freqstr
|
22
|
+
|
23
|
+
df_grouped_working_hours_sorted_reset_pos, \
|
24
|
+
df_grouped_working_hours_sorted_reset_bot, \
|
25
|
+
ylim, \
|
26
|
+
display_unit, \
|
27
|
+
formatter = get_pos_bot_range_unit_format(df_grouped_working_hours_period_reset_with_sign,
|
28
|
+
pad_pct_above_max=0.2)
|
29
|
+
|
30
|
+
setup_y_tick_lim_label_zero_line(ax, ylim, display_unit, formatter,
|
31
|
+
freqstr=freqstr,
|
32
|
+
fontsize=fontsize)
|
33
|
+
|
34
|
+
x_ticks_labels = set_x_label_prepare_xtick(ax, df_grouped_working_hours_period_unstacked,
|
35
|
+
fontsize=fontsize)
|
36
|
+
|
37
|
+
plot_stacked_barchart(ax, df_grouped_working_hours_sorted_reset_pos,
|
38
|
+
bottom=df_grouped_working_hours_sorted_reset_bot,
|
39
|
+
tick_range=ylim)
|
40
|
+
|
41
|
+
set_x_tick_and_lim(ax, x_ticks_labels, df_grouped_working_hours_period_unstacked,
|
42
|
+
fontsize=fontsize)
|
43
|
+
|
44
|
+
fig.tight_layout(rect =(0.01, 0, 1, 1))
|
45
|
+
subplots_adjust_left = None
|
46
|
+
subplots_adjust_right = 0.68 # 0.92 #
|
47
|
+
|
48
|
+
fig.subplots_adjust(left=subplots_adjust_left,
|
49
|
+
right=subplots_adjust_right)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
import matplotlib.pyplot as plt
|
3
|
+
|
4
|
+
|
5
|
+
def set_x_label_prepare_xtick(ax, df_grouped_working_hours_period_unstacked,
|
6
|
+
fontsize=None):
|
7
|
+
|
8
|
+
if fontsize is None:
|
9
|
+
fontsize = 13
|
10
|
+
|
11
|
+
if df_grouped_working_hours_period_unstacked.index.freqstr == 'M':
|
12
|
+
x_ticks_labels = df_grouped_working_hours_period_unstacked.index.strftime("%b %y").tolist()
|
13
|
+
ax.set_xlabel("Month", labelpad = 13, fontsize = fontsize)
|
14
|
+
plt.xticks(rotation=45) # please note: plt cannot be replace by ax, as it will throw errors
|
15
|
+
else:
|
16
|
+
ls_week_str = (df_grouped_working_hours_period_unstacked.index).strftime("%W").tolist()
|
17
|
+
x_ticks_labels = [f"{(int(week)+1):02d}" for week in ls_week_str] # add 1 week to the current_period_obj so that the start week is not Week 00
|
18
|
+
ax.set_xlabel("Week Number", labelpad = 13, fontsize = fontsize)
|
19
|
+
plt.xticks(rotation=0)
|
20
|
+
|
21
|
+
x_ticks_labels.insert(0,"")
|
22
|
+
x_ticks_labels.append("")
|
23
|
+
|
24
|
+
return x_ticks_labels
|