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,87 @@
|
|
1
|
+
|
2
|
+
import matplotlib.pyplot as plt
|
3
|
+
import copy
|
4
|
+
|
5
|
+
from .adjust_gap_for_visibility import adjust_gap_for_visibility
|
6
|
+
from .adjust_to_inner_ring import adjust_to_inner_ring
|
7
|
+
from .annotate_pct_on_pies import annotate_pct_on_pies
|
8
|
+
from .generate_pct_fmt import generate_pct_fmt
|
9
|
+
from .adjust_values_for_better_visibility import adjust_values_for_better_visibility
|
10
|
+
|
11
|
+
|
12
|
+
def plot_ring(sr_orig, ax,
|
13
|
+
colors=None,
|
14
|
+
hatch=None,
|
15
|
+
fontsize=None,
|
16
|
+
as_inner_ring=None,
|
17
|
+
inner_radius=None,
|
18
|
+
outer_radius=None,
|
19
|
+
gap_value=None,
|
20
|
+
ann_pct=None,
|
21
|
+
pct_out=None,
|
22
|
+
pct_hide=None):
|
23
|
+
|
24
|
+
if fontsize is None:
|
25
|
+
fontsize = 13
|
26
|
+
if colors is None:
|
27
|
+
colors = ['#fffffc'] # use this modification of white color to differentiate it from the actual white, for legend handle filter
|
28
|
+
if as_inner_ring is None:
|
29
|
+
as_inner_ring = False
|
30
|
+
if inner_radius is None:
|
31
|
+
inner_radius = 0.5
|
32
|
+
if outer_radius is None:
|
33
|
+
outer_radius = 1
|
34
|
+
if ann_pct is None:
|
35
|
+
ann_pct = True
|
36
|
+
if gap_value is None:
|
37
|
+
gap_value = 0
|
38
|
+
|
39
|
+
sr = adjust_values_for_better_visibility(sr_orig) # to avoid changes made to the original series
|
40
|
+
|
41
|
+
ls_orig_pct_fmt = generate_pct_fmt(sr)
|
42
|
+
|
43
|
+
if gap_value > 0:
|
44
|
+
|
45
|
+
sr_sum_without_gap = sr.sum()
|
46
|
+
|
47
|
+
# to make the non-gap pie or gap pie more visible
|
48
|
+
sr['Gap Value'] = adjust_gap_for_visibility(gap_value, sr_sum_without_gap,
|
49
|
+
min_vis_pct=3)
|
50
|
+
|
51
|
+
sr.plot.pie(ax=ax,
|
52
|
+
autopct='', # needed to generate placeholder for ax.texts
|
53
|
+
colors=colors,
|
54
|
+
hatch=hatch,
|
55
|
+
radius=outer_radius,
|
56
|
+
# frame=True,
|
57
|
+
textprops={"color": 'k',
|
58
|
+
"fontsize": fontsize},
|
59
|
+
pctdistance=0.77,
|
60
|
+
wedgeprops={'linewidth': 1,
|
61
|
+
"edgecolor": 'k'},
|
62
|
+
startangle=90,
|
63
|
+
labels=None)
|
64
|
+
|
65
|
+
if gap_value > 0:
|
66
|
+
patch_for_gap = copy.copy(ax.patches[-1])
|
67
|
+
ax.patches[-1].set(visible=False, gid='no legend')
|
68
|
+
|
69
|
+
if ann_pct:
|
70
|
+
annotate_pct_on_pies(ax, sr, ls_orig_pct_fmt,
|
71
|
+
pct_hide=pct_hide,
|
72
|
+
pct_out=pct_out)
|
73
|
+
|
74
|
+
# plot the circle in the centre of the ring
|
75
|
+
inner_circle = plt.Circle((0, 0), inner_radius,
|
76
|
+
facecolor='w',
|
77
|
+
linewidth=1,
|
78
|
+
edgecolor='k') # edgecolor=other_colours[0],
|
79
|
+
# p = plt.gcf()
|
80
|
+
# p.gca().add_artist(inner_circle)
|
81
|
+
ax.add_artist(inner_circle)
|
82
|
+
|
83
|
+
if gap_value > 0:
|
84
|
+
adjust_to_inner_ring(ax, patch_for_gap, inner_radius, outer_radius,
|
85
|
+
as_inner_ring=as_inner_ring)
|
86
|
+
|
87
|
+
ax.set_ylabel("")
|
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def adjust_gap_for_visibility(gap_value, non_gap_value,
|
4
|
+
min_vis_pct=None):
|
5
|
+
|
6
|
+
if min_vis_pct is None:
|
7
|
+
min_vis_pct = 3
|
8
|
+
|
9
|
+
min_non_gap_pct = min_vis_pct
|
10
|
+
max_non_gap_pct = 100 - min_non_gap_pct
|
11
|
+
|
12
|
+
max_gap_for_visibility = (100 - min_non_gap_pct)*non_gap_value/min_non_gap_pct
|
13
|
+
min_gap_for_visibility = (100 - max_non_gap_pct)*non_gap_value/max_non_gap_pct
|
14
|
+
|
15
|
+
adj_gap_for_visibility = gap_value
|
16
|
+
adj_gap_for_visibility = min(max_gap_for_visibility, adj_gap_for_visibility)
|
17
|
+
adj_gap_for_visibility = max(min_gap_for_visibility, adj_gap_for_visibility)
|
18
|
+
|
19
|
+
return adj_gap_for_visibility
|
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
import matplotlib.pyplot as plt
|
3
|
+
|
4
|
+
def adjust_to_inner_ring(ax, patch_for_gap, inner_radius, outer_radius,
|
5
|
+
as_inner_ring=None):
|
6
|
+
|
7
|
+
if as_inner_ring is None:
|
8
|
+
as_inner_ring = False
|
9
|
+
|
10
|
+
if as_inner_ring:
|
11
|
+
|
12
|
+
# remove the inner line
|
13
|
+
patch_for_gap.set(
|
14
|
+
edgecolor=None,
|
15
|
+
facecolor='w',
|
16
|
+
hatch=None,
|
17
|
+
radius=inner_radius+0.01, # added 0.01 to completely remove/cover the black line
|
18
|
+
gid='no legend',
|
19
|
+
)
|
20
|
+
# p = plt.gcf()
|
21
|
+
# p.gca().add_artist(patch_for_gap)
|
22
|
+
ax.add_artist(patch_for_gap)
|
23
|
+
|
24
|
+
# add the outer line
|
25
|
+
outer_circle = plt.Circle((0, 0), outer_radius,
|
26
|
+
fill=False,
|
27
|
+
linewidth=1,
|
28
|
+
gid='no legend',
|
29
|
+
edgecolor='k') # edgecolor=other_colours[0],
|
30
|
+
# p = plt.gcf()
|
31
|
+
# p.gca().add_artist(outer_circle)
|
32
|
+
ax.add_artist(outer_circle)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def adjust_values_for_better_visibility(sr_orig,
|
4
|
+
thres_invisibity=0.01,
|
5
|
+
adjustment_pct=0.01):
|
6
|
+
|
7
|
+
# ensure that the pct is positive
|
8
|
+
sr_orig_abs = sr_orig.abs()
|
9
|
+
sr_plot_pct = sr_orig_abs/sr_orig_abs.sum()
|
10
|
+
|
11
|
+
# print(f'{sr_plot_pct = }')
|
12
|
+
|
13
|
+
# label the non-visible
|
14
|
+
non_visible_index = sr_plot_pct.loc[sr_plot_pct<thres_invisibity].index
|
15
|
+
all_visible_index = sr_plot_pct.index.difference(non_visible_index)
|
16
|
+
|
17
|
+
# slightly adjust the values to make the non-visible ones more visible
|
18
|
+
previous_non_visiable_pct = sr_plot_pct.loc[non_visible_index].sum()
|
19
|
+
sr_plot_pct.loc[non_visible_index] = sr_plot_pct.loc[non_visible_index] + adjustment_pct
|
20
|
+
improved_non_visiable_pct = sr_plot_pct.loc[non_visible_index].sum()
|
21
|
+
|
22
|
+
sr_plot_pct.loc[all_visible_index] = sr_plot_pct.loc[all_visible_index] * (1-improved_non_visiable_pct)/(1-previous_non_visiable_pct)
|
23
|
+
|
24
|
+
# get the adjusted sum values for plots
|
25
|
+
sr_plot_sum = sr_plot_pct * sr_orig.sum()
|
26
|
+
|
27
|
+
return sr_plot_sum
|
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def annotate_pct_on_pies(ax, sr, ls_orig_pct_fmt,
|
4
|
+
pct_hide=None,
|
5
|
+
pct_out=None):
|
6
|
+
|
7
|
+
if pct_hide is None:
|
8
|
+
pct_hide = 0.04
|
9
|
+
|
10
|
+
if pct_out is None:
|
11
|
+
pct_out = 0.065
|
12
|
+
|
13
|
+
for index, pct_value in enumerate(sr.to_list()):
|
14
|
+
|
15
|
+
ax.texts[index*2+1].update({"text": ls_orig_pct_fmt[index]})
|
16
|
+
|
17
|
+
if abs(pct_value) < pct_hide * sr.sum():
|
18
|
+
ax.texts[index*2+1].update({"text": ''})
|
19
|
+
elif abs(pct_value) < pct_out * sr.sum():
|
20
|
+
ax.texts[index*2].update({"text": f'{ax.texts[index*2+1].get_text()}'})
|
21
|
+
ax.texts[index*2+1].update({"text": ''})
|
@@ -0,0 +1,8 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def generate_pct_fmt(sr):
|
4
|
+
total_before_adding_gap = sr.sum()
|
5
|
+
ls_orig_pct = (sr/total_before_adding_gap).to_list()
|
6
|
+
ls_orig_pct_fmt = ['{:.0f}%'.format(round(p*100)) for p in ls_orig_pct]
|
7
|
+
ls_orig_pct_fmt.append('') # add for potential gap value
|
8
|
+
return ls_orig_pct_fmt
|
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
from .get_legend_handles import get_legend_handles
|
4
|
+
from .generate_legend_labels import generate_legend_labels
|
5
|
+
|
6
|
+
def show_legend(ax, df_pre_pie,
|
7
|
+
fontsize=None,
|
8
|
+
sum_column=None,
|
9
|
+
pct_column=None):
|
10
|
+
|
11
|
+
if fontsize is None:
|
12
|
+
fontsize = 13
|
13
|
+
|
14
|
+
valid_handles = get_legend_handles(ax)
|
15
|
+
legend_labels = generate_legend_labels(df_pre_pie,
|
16
|
+
sum_column=sum_column,
|
17
|
+
pct_column=pct_column)
|
18
|
+
|
19
|
+
x0, y0, width, height = 1.15, 0.5, 0, 0
|
20
|
+
leg_ncol = 1
|
21
|
+
leg_loc = 'center left'
|
22
|
+
|
23
|
+
leg = ax.legend(handles=valid_handles,
|
24
|
+
labels=legend_labels,
|
25
|
+
loc=leg_loc,
|
26
|
+
facecolor='w',
|
27
|
+
edgecolor='w',
|
28
|
+
borderaxespad=0,
|
29
|
+
bbox_to_anchor=(x0, y0, width, height),
|
30
|
+
fontsize=fontsize,
|
31
|
+
ncol=leg_ncol,
|
32
|
+
handleheight=1.2,
|
33
|
+
labelspacing=0.6,
|
34
|
+
title=None)
|
35
|
+
|
36
|
+
leg.set_in_layout(False)
|
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
from .get_formatted_sum import get_formatted_sum
|
4
|
+
from .get_formatted_arrow import get_formatted_arrow
|
5
|
+
from .get_formatted_pct import get_formatted_pct
|
6
|
+
from .get_formatted_name import get_formatted_name
|
7
|
+
|
8
|
+
|
9
|
+
def generate_legend_labels(df_asset_class_monthly_sum_others, # this dataframe is required to have asset class as index and have columns "sub_pct", "sum"
|
10
|
+
sum_column = None,
|
11
|
+
pct_column = None,
|
12
|
+
# space_len_long = 5,
|
13
|
+
space_len_short = None,
|
14
|
+
pct_len = None,
|
15
|
+
kwh_len = None):
|
16
|
+
|
17
|
+
if sum_column is None:
|
18
|
+
sum_column = "sum"
|
19
|
+
if pct_column is None:
|
20
|
+
pct_column = "sub_pct"
|
21
|
+
if space_len_short is None:
|
22
|
+
space_len_short = 1
|
23
|
+
|
24
|
+
labels = []
|
25
|
+
|
26
|
+
# label_space_long = "," + " "*space_len_long
|
27
|
+
label_space_short = " "*space_len_short
|
28
|
+
|
29
|
+
for index, item in df_asset_class_monthly_sum_others.iterrows():
|
30
|
+
|
31
|
+
# print(f'{index = }')
|
32
|
+
|
33
|
+
# print(f'{item = }')
|
34
|
+
# print(f'{pct_column = }')
|
35
|
+
|
36
|
+
label_kwh = get_formatted_sum(item[sum_column],
|
37
|
+
sum_value_len=kwh_len)
|
38
|
+
label_arrow = get_formatted_arrow(item[pct_column])
|
39
|
+
label_pct = get_formatted_pct(item[pct_column],
|
40
|
+
pct_len=pct_len)
|
41
|
+
|
42
|
+
label_name = get_formatted_name(index)
|
43
|
+
|
44
|
+
label = label_kwh + label_space_short + label_arrow+ " " + label_pct + label_space_short + label_name
|
45
|
+
|
46
|
+
# print(f'{label = }')
|
47
|
+
|
48
|
+
labels.append(label)
|
49
|
+
|
50
|
+
return labels
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
def get_formatted_arrow(pct_value):
|
5
|
+
|
6
|
+
if pct_value > 0.005:
|
7
|
+
label_arrow_str = r'${\blacktriangle}$'
|
8
|
+
|
9
|
+
elif pct_value < -0.005:
|
10
|
+
label_arrow_str = r'$\:\!\triangledown\:\!$'
|
11
|
+
|
12
|
+
else:
|
13
|
+
label_arrow_str = r'$\!$--'
|
14
|
+
|
15
|
+
label_arrow_pad = ' '
|
16
|
+
label_arrow = label_arrow_pad + label_arrow_str
|
17
|
+
|
18
|
+
return label_arrow
|
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
def get_formatted_pct(pct_value,
|
5
|
+
pct_len=None):
|
6
|
+
|
7
|
+
if pct_len is None:
|
8
|
+
pct_len = 2
|
9
|
+
|
10
|
+
# format the relative change
|
11
|
+
|
12
|
+
pad_for_3_digit = 1
|
13
|
+
|
14
|
+
if abs(pct_value) <= 1.06:
|
15
|
+
label_pct_str = str(round(abs(pct_value)*100))
|
16
|
+
label_pct_unit = r"%"
|
17
|
+
label_pct_dot = " "*label_pct_str.count('.')
|
18
|
+
label_pct_pad = ' ' *int((pct_len - len(label_pct_str))*2 + pad_for_3_digit)
|
19
|
+
elif abs(pct_value) < 1000:
|
20
|
+
label_pct_str = str(round(abs(pct_value))) # todo: config number of decimals
|
21
|
+
if len(label_pct_str) < 2:
|
22
|
+
label_pct_str = str(round(abs(pct_value)*10)/10) # add one decimal
|
23
|
+
label_pct_unit = r"X"
|
24
|
+
label_pct_dot = " "*label_pct_str.count('.')
|
25
|
+
label_pct_pad = ' ' *int((pct_len - len(label_pct_str))*2 +1 + pad_for_3_digit)
|
26
|
+
elif abs(pct_value) < 1000_000:
|
27
|
+
label_pct_str = str(round(abs(pct_value)/1000)) # todo: config number of decimals
|
28
|
+
if len(label_pct_str) < 2:
|
29
|
+
label_pct_str = str(round(abs(pct_value)/1000*10)/10) # add one decimal
|
30
|
+
label_pct_unit = r"KX"
|
31
|
+
label_pct_dot = " "*label_pct_str.count('.')
|
32
|
+
label_pct_pad = ' ' *int((pct_len - len(label_pct_str))*2 -1 + pad_for_3_digit)
|
33
|
+
else:
|
34
|
+
label_pct_str = str(round(abs(pct_value)/1000_000)) # todo: config number of decimals
|
35
|
+
if len(label_pct_str) < 2:
|
36
|
+
label_pct_str = str(round(abs(pct_value)/1000_1000*10)/10) # add one decimal
|
37
|
+
label_pct_unit = r"MX"
|
38
|
+
label_pct_dot = " "*label_pct_str.count('.')
|
39
|
+
label_pct_pad = ' ' *int((pct_len - len(label_pct_str))*2 -2 + pad_for_3_digit)
|
40
|
+
|
41
|
+
# print(f'label_pct_pad = "{label_pct_pad}"')
|
42
|
+
label_pct = label_pct_dot + label_pct_pad + label_pct_str + label_pct_unit + ',' + ' ' * 5
|
43
|
+
|
44
|
+
return label_pct
|
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def get_formatted_sum(value,
|
4
|
+
sum_value_len=None):
|
5
|
+
|
6
|
+
if sum_value_len is None:
|
7
|
+
sum_value_len = 8
|
8
|
+
|
9
|
+
# adjust the decimal point and the unit based on the actual value
|
10
|
+
sum_abs = abs(value)
|
11
|
+
if sum_abs >= 99_950: # KWH
|
12
|
+
label_kwh_str = f'{value/1000:4.0f} MWh'
|
13
|
+
elif sum_abs >= 1000: # KWH
|
14
|
+
label_kwh_str = f'{value/1000:4.1f} MWh'
|
15
|
+
elif sum_abs >= 99.95: # KWH
|
16
|
+
label_kwh_str = f'{value:4.0f} KWh' # to handle the case that (sum_abs: 99.98276) => (100.0 KWh)
|
17
|
+
elif sum_abs >= 1:
|
18
|
+
label_kwh_str = f'{value:4.1f} KWh'
|
19
|
+
elif sum_abs >= 0.09995:
|
20
|
+
label_kwh_str = f'{value*1000:4.0f} Wh'
|
21
|
+
else:
|
22
|
+
label_kwh_str = f'{value*1000:4.1f} Wh'
|
23
|
+
|
24
|
+
label_kwh_str_strip = label_kwh_str.strip()
|
25
|
+
|
26
|
+
label_kwh_pad_digi = ' ' *int((sum_value_len - len(label_kwh_str_strip))*2)
|
27
|
+
label_kwh_pad_dot = ' '*label_kwh_str_strip.count('.')
|
28
|
+
|
29
|
+
label_kwh = label_kwh_pad_dot + label_kwh_pad_digi + label_kwh_str_strip + ','
|
30
|
+
|
31
|
+
return label_kwh
|
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def get_legend_handles(ax, no_of_labels=50):
|
4
|
+
|
5
|
+
ax.legend(labels=['']*no_of_labels)
|
6
|
+
|
7
|
+
legends = ax.get_legend()
|
8
|
+
|
9
|
+
valid_handles = []
|
10
|
+
|
11
|
+
for handle in legends.legend_handles:
|
12
|
+
|
13
|
+
is_invisible_pie_for_gap = (handle.get_visible()==False)
|
14
|
+
is_white_pie_in_ring_centre = (handle.get_fc() == (1.0, 1.0, 1.0, 1))
|
15
|
+
is_outer_gap_edge_when_as_inner = (handle.get_fc()[3]==0)
|
16
|
+
|
17
|
+
invalid_handle = (is_invisible_pie_for_gap or is_white_pie_in_ring_centre or is_outer_gap_edge_when_as_inner)
|
18
|
+
|
19
|
+
if not invalid_handle:
|
20
|
+
valid_handles.append(handle)
|
21
|
+
|
22
|
+
return valid_handles
|
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def preprocessing_for_phases(df_meta_with_value,
|
4
|
+
reading_interval_in_mins=None):
|
5
|
+
|
6
|
+
if reading_interval_in_mins is None:
|
7
|
+
reading_interval_in_mins=10
|
8
|
+
|
9
|
+
# Conversion into MWh
|
10
|
+
w_to_kw_para = 1./1000
|
11
|
+
min_to_hour_para = 1./60
|
12
|
+
|
13
|
+
wm_to_kwh_parameter = w_to_kw_para * min_to_hour_para
|
14
|
+
reading_to_kwh_parameter = reading_interval_in_mins * wm_to_kwh_parameter
|
15
|
+
|
16
|
+
# consider only the consumed energy
|
17
|
+
df_meta_with_value_positive = df_meta_with_value.loc[df_meta_with_value["W"] > 0]
|
18
|
+
|
19
|
+
# group and pivot operation
|
20
|
+
sr_group_phase = df_meta_with_value_positive.groupby(["phase"])["W"].sum() * reading_to_kwh_parameter
|
21
|
+
|
22
|
+
# extract phase values to list and report possible anomalies
|
23
|
+
existing_phases = sr_group_phase.index.to_list()
|
24
|
+
phase_values_list = []
|
25
|
+
|
26
|
+
for phase in ['L1', 'L2', 'L3']:
|
27
|
+
if phase in existing_phases:
|
28
|
+
phase_values_list.append(sr_group_phase[phase])
|
29
|
+
else:
|
30
|
+
print(f'[WARN]: missing phase "{phase}"!')
|
31
|
+
phase_values_list.append(0)
|
32
|
+
|
33
|
+
for phase in existing_phases:
|
34
|
+
if phase not in ['L1', 'L2', 'L3']:
|
35
|
+
print(f'[WARN]: unexpected phase "{phase}"!')
|
36
|
+
|
37
|
+
return phase_values_list
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
from .group_and_pivot import group_and_pivot
|
3
|
+
from .transform_asset_stats_for_adaptive_piechart import transform_asset_stats_for_adaptive_piechart
|
4
|
+
|
5
|
+
def preprocessing_for_piechart(df_meta_with_value,
|
6
|
+
reading_interval_in_mins=None,
|
7
|
+
asset_group=None,
|
8
|
+
minimum_cnt_for_protection=None,
|
9
|
+
max_display_cnt=None,
|
10
|
+
sum_column=None,
|
11
|
+
pct_column=None,
|
12
|
+
gene_column=None):
|
13
|
+
|
14
|
+
df_pivot_asset_group_by_period = group_and_pivot(df_meta_with_value,
|
15
|
+
reading_interval_in_mins=reading_interval_in_mins,
|
16
|
+
asset_group=asset_group)
|
17
|
+
|
18
|
+
df_sort_idx_trim = transform_asset_stats_for_adaptive_piechart(df_pivot_asset_group_by_period,
|
19
|
+
minimum_cnt_for_protection=minimum_cnt_for_protection,
|
20
|
+
max_display_cnt=max_display_cnt,
|
21
|
+
sum_column=sum_column,
|
22
|
+
pct_column=pct_column,
|
23
|
+
gene_column=gene_column,
|
24
|
+
asset_group=asset_group)
|
25
|
+
|
26
|
+
return df_sort_idx_trim
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def group_and_pivot(df_meta_with_value,
|
4
|
+
asset_group=None,
|
5
|
+
reading_interval_in_mins=None):
|
6
|
+
|
7
|
+
if asset_group is None:
|
8
|
+
asset_group = 'thing_category'
|
9
|
+
|
10
|
+
if reading_interval_in_mins is None:
|
11
|
+
reading_interval_in_mins=10
|
12
|
+
|
13
|
+
# Conversion into MWh
|
14
|
+
w_to_kw_para = 1./1000
|
15
|
+
min_to_hour_para = 1./60
|
16
|
+
|
17
|
+
wm_to_kwh_parameter = w_to_kw_para * min_to_hour_para
|
18
|
+
reading_to_kwh_parameter = reading_interval_in_mins * wm_to_kwh_parameter
|
19
|
+
|
20
|
+
# group and pivot operation
|
21
|
+
sr_pivot_asset_class = df_meta_with_value.groupby([asset_group, "period"])["W"].sum() * reading_to_kwh_parameter
|
22
|
+
df_pivot_asset_group_by_period = sr_pivot_asset_class.unstack(["period"])
|
23
|
+
|
24
|
+
return df_pivot_asset_group_by_period
|
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
from .get_sum_for_curr_and_prev import get_sum_for_curr_and_prev
|
3
|
+
from .get_subgroup_sum_and_rank import get_subgroup_sum_and_rank
|
4
|
+
from .get_rank_overall_protect import get_rank_overall_protect
|
5
|
+
from .get_entries_to_display import get_entries_to_display
|
6
|
+
from .get_change_pct_and_sort_and_trim_cols import get_change_pct_and_sort_and_trim_cols
|
7
|
+
|
8
|
+
|
9
|
+
def transform_asset_stats_for_adaptive_piechart(df_pivot_asset_group_by_period,
|
10
|
+
minimum_cnt_for_protection=None,
|
11
|
+
max_display_cnt=None,
|
12
|
+
sum_column = None,
|
13
|
+
pct_column = None,
|
14
|
+
gene_column=None,
|
15
|
+
asset_group=None):
|
16
|
+
|
17
|
+
df_pivot_asset_group_by_period_renamed = get_sum_for_curr_and_prev(df_pivot_asset_group_by_period)
|
18
|
+
df_pivot_asset_group_by_period_renamed = get_subgroup_sum_and_rank(df_pivot_asset_group_by_period_renamed)
|
19
|
+
df_pivot_asset_group_by_period_renamed_rdx = get_rank_overall_protect(df_pivot_asset_group_by_period_renamed,
|
20
|
+
minimum_cnt_for_protection=minimum_cnt_for_protection)
|
21
|
+
df_pivot_asset_group_by_period_renamed_rdx_to_keep = get_entries_to_display(df_pivot_asset_group_by_period_renamed_rdx,
|
22
|
+
max_display_cnt=max_display_cnt,
|
23
|
+
gene_column=gene_column,
|
24
|
+
asset_group=asset_group)
|
25
|
+
df_sort_idx_trim = get_change_pct_and_sort_and_trim_cols(df_pivot_asset_group_by_period_renamed_rdx_to_keep,
|
26
|
+
sum_column = sum_column,
|
27
|
+
pct_column = pct_column,
|
28
|
+
gene_column = gene_column,
|
29
|
+
asset_group = asset_group)
|
30
|
+
return df_sort_idx_trim
|
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
def get_change_pct_and_sort_and_trim_cols(df_pivot_asset_group_by_period_renamed_rdx_to_keep,
|
5
|
+
sum_column = None,
|
6
|
+
pct_column = None,
|
7
|
+
gene_column = None,
|
8
|
+
asset_group = None):
|
9
|
+
|
10
|
+
if sum_column is None:
|
11
|
+
sum_column = "sum_abs"
|
12
|
+
|
13
|
+
if pct_column is None:
|
14
|
+
pct_column = 'sub_pct'
|
15
|
+
|
16
|
+
if gene_column is None:
|
17
|
+
gene_column = 'generator'
|
18
|
+
|
19
|
+
if asset_group is None:
|
20
|
+
asset_group = 'thing_category'
|
21
|
+
|
22
|
+
# calculate the percentage of changes
|
23
|
+
df_pivot_asset_group_by_period_renamed_rdx_to_keep[pct_column] = df_pivot_asset_group_by_period_renamed_rdx_to_keep['sub'] / df_pivot_asset_group_by_period_renamed_rdx_to_keep['sum']
|
24
|
+
|
25
|
+
# sort the list
|
26
|
+
df_pivot_asset_group_by_period_renamed_rdx_to_keep_sort = df_pivot_asset_group_by_period_renamed_rdx_to_keep.sort_values([gene_column, 'rank_in_group'])
|
27
|
+
|
28
|
+
# the plotting function requires asset_group to be the index
|
29
|
+
df_pivot_asset_group_by_period_renamed_rdx_to_keep_sort_idx = df_pivot_asset_group_by_period_renamed_rdx_to_keep_sort.set_index([asset_group])
|
30
|
+
|
31
|
+
columns_for_export = [sum_column, pct_column, gene_column]
|
32
|
+
df_pivot_asset_group_by_period_renamed_rdx_to_keep_sort_idx_trim = df_pivot_asset_group_by_period_renamed_rdx_to_keep_sort_idx[columns_for_export]
|
33
|
+
|
34
|
+
return df_pivot_asset_group_by_period_renamed_rdx_to_keep_sort_idx_trim
|
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def get_entries_to_display(df_pivot_asset_group_by_period_renamed_rdx,
|
4
|
+
max_display_cnt=None,
|
5
|
+
gene_column=None,
|
6
|
+
asset_group=None):
|
7
|
+
|
8
|
+
if max_display_cnt is None:
|
9
|
+
max_display_cnt = 8
|
10
|
+
|
11
|
+
if gene_column is None:
|
12
|
+
gene_column = 'generator'
|
13
|
+
|
14
|
+
if asset_group is None:
|
15
|
+
asset_group = 'thing_category'
|
16
|
+
|
17
|
+
# get the rows to keep/display and redundant rows to merge
|
18
|
+
df_pivot_asset_group_by_period_renamed_rdx['to_be_merged'] = df_pivot_asset_group_by_period_renamed_rdx['rank_overall_protect'] > max_display_cnt
|
19
|
+
df_pivot_asset_group_by_period_renamed_rdx_to_merge = df_pivot_asset_group_by_period_renamed_rdx.loc[df_pivot_asset_group_by_period_renamed_rdx['to_be_merged']]
|
20
|
+
df_pivot_asset_group_by_period_renamed_rdx_to_keep = df_pivot_asset_group_by_period_renamed_rdx.loc[~df_pivot_asset_group_by_period_renamed_rdx['to_be_merged']]
|
21
|
+
df_pivot_asset_group_by_period_renamed_rdx_to_merge_grp = df_pivot_asset_group_by_period_renamed_rdx_to_merge.groupby([gene_column]).agg({'sum': 'sum',
|
22
|
+
'sum_pre': 'sum',
|
23
|
+
'sub': 'sum'})
|
24
|
+
|
25
|
+
# merge the redundant rows to "others" in the rows to keep
|
26
|
+
for gene, sr_gene in df_pivot_asset_group_by_period_renamed_rdx_to_merge_grp.iterrows():
|
27
|
+
|
28
|
+
idx_last_row = df_pivot_asset_group_by_period_renamed_rdx_to_keep.loc[df_pivot_asset_group_by_period_renamed_rdx_to_keep[gene_column]==gene].index.max()
|
29
|
+
df_pivot_asset_group_by_period_renamed_rdx_to_keep.loc[idx_last_row, asset_group] = 'Other Assets' if gene==False else 'Other Sources'
|
30
|
+
|
31
|
+
for column in df_pivot_asset_group_by_period_renamed_rdx_to_merge_grp.columns:
|
32
|
+
df_pivot_asset_group_by_period_renamed_rdx_to_keep.loc[idx_last_row, column] += sr_gene[column]
|
33
|
+
|
34
|
+
return df_pivot_asset_group_by_period_renamed_rdx_to_keep
|
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def get_rank_overall_protect(df_pivot_asset_group_by_period_renamed,
|
4
|
+
minimum_cnt_for_protection=None):
|
5
|
+
|
6
|
+
if minimum_cnt_for_protection is None:
|
7
|
+
minimum_cnt_for_protection = 3
|
8
|
+
|
9
|
+
# get the overall ranking considering the minimum entries to protect
|
10
|
+
df_pivot_asset_group_by_period_renamed['protect_in_group'] = (df_pivot_asset_group_by_period_renamed['rank_in_group'] <= minimum_cnt_for_protection)
|
11
|
+
df_pivot_asset_group_by_period_renamed_rdx = df_pivot_asset_group_by_period_renamed.sort_values(by=['protect_in_group', 'sum_abs'], ascending=False).reset_index()
|
12
|
+
df_pivot_asset_group_by_period_renamed_rdx['rank_overall_protect'] = df_pivot_asset_group_by_period_renamed_rdx.index + 1
|
13
|
+
|
14
|
+
return df_pivot_asset_group_by_period_renamed_rdx
|
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def get_subgroup_sum_and_rank(df_pivot_asset_group_by_period_renamed,
|
4
|
+
sum_column = None,
|
5
|
+
gene_column = None):
|
6
|
+
|
7
|
+
if sum_column is None:
|
8
|
+
sum_column = "sum_abs"
|
9
|
+
|
10
|
+
if gene_column is None:
|
11
|
+
gene_column = 'generator'
|
12
|
+
|
13
|
+
# label the entries based on whether generator or not and add sub-group total
|
14
|
+
df_pivot_asset_group_by_period_renamed[gene_column] = df_pivot_asset_group_by_period_renamed['sum'] < 0
|
15
|
+
# df_pivot_asset_group_by_period_tot = df_pivot_asset_group_by_period_renamed.groupby([gene_column])['sum'].sum().rename('generator_tot')
|
16
|
+
# df_pivot_asset_group_by_period_renamed = df_pivot_asset_group_by_period_renamed.merge(df_pivot_asset_group_by_period_tot, left_on=[gene_column], right_index=True)
|
17
|
+
|
18
|
+
# get the rank in sub-group
|
19
|
+
df_pivot_asset_group_by_period_renamed[sum_column] = df_pivot_asset_group_by_period_renamed['sum'].abs()
|
20
|
+
df_pivot_asset_group_by_period_renamed['rank_in_group'] = df_pivot_asset_group_by_period_renamed.groupby(gene_column)[sum_column].rank(ascending=False, method="dense")
|
21
|
+
|
22
|
+
return df_pivot_asset_group_by_period_renamed
|