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,29 @@
|
|
1
|
+
def append_df_to_table(engine, table_name, df):
|
2
|
+
|
3
|
+
table_schema_name_list = table_name.split(".")
|
4
|
+
|
5
|
+
if len(table_schema_name_list) > 1:
|
6
|
+
table_schema = table_schema_name_list[0]
|
7
|
+
table_non_schema_name = table_schema_name_list[1]
|
8
|
+
else:
|
9
|
+
table_schema = "public"
|
10
|
+
table_non_schema_name = table_name
|
11
|
+
|
12
|
+
total_records = len(df)
|
13
|
+
|
14
|
+
|
15
|
+
with engine.connect() as conn:
|
16
|
+
|
17
|
+
df.to_sql(
|
18
|
+
name=table_non_schema_name,
|
19
|
+
con=conn,
|
20
|
+
if_exists="append",
|
21
|
+
schema=table_schema,
|
22
|
+
chunksize=5000,
|
23
|
+
index=False
|
24
|
+
)
|
25
|
+
|
26
|
+
print(f'The config cache in database table [{table_name}] is updated with [{total_records}] records.')
|
27
|
+
# print(f'[{total_records}] records have been written to Table [{table_name}] successfully.')
|
28
|
+
|
29
|
+
return
|
@@ -0,0 +1,11 @@
|
|
1
|
+
def empty_table(engine, table_name, with_log=True):
|
2
|
+
|
3
|
+
with engine.connect() as conn:
|
4
|
+
|
5
|
+
# delete data (empty) in the table
|
6
|
+
query_empty_table = f"""DELETE FROM {table_name};"""
|
7
|
+
conn.execute(query_empty_table)
|
8
|
+
|
9
|
+
if with_log:
|
10
|
+
print(f'The table [{table_name}] is empty now.')
|
11
|
+
return
|
@@ -0,0 +1,50 @@
|
|
1
|
+
import os
|
2
|
+
import pickle
|
3
|
+
import inspect
|
4
|
+
import re
|
5
|
+
import traceback
|
6
|
+
# from varname import nameof
|
7
|
+
|
8
|
+
def cache_obj(varible, var_name=None, cache_dir='./_cache_', max_count=10000, mode='w', pkg_name=None, print_on=True):
|
9
|
+
|
10
|
+
if not os.path.exists(cache_dir):
|
11
|
+
os.makedirs(cache_dir)
|
12
|
+
|
13
|
+
if mode == 'r':
|
14
|
+
if pkg_name is None:
|
15
|
+
|
16
|
+
pkl_path = f'{cache_dir}/{varible}.pkl'
|
17
|
+
else:
|
18
|
+
pkl_path = f'../{pkg_name}_pkg//{cache_dir[1:]}/{varible}.pkl'
|
19
|
+
|
20
|
+
with open(pkl_path, 'rb') as file:
|
21
|
+
var_value = pickle.load(file)
|
22
|
+
return var_value
|
23
|
+
|
24
|
+
if var_name is None: # get the variable name by looping the parent function
|
25
|
+
# lcls = inspect.stack()[2][0].f_locals
|
26
|
+
# for name in lcls:
|
27
|
+
# if id(varible) == id(lcls[name]):
|
28
|
+
# var_name = name
|
29
|
+
|
30
|
+
stack = traceback.extract_stack()
|
31
|
+
filename, lineno, function_name, code = stack[-2]
|
32
|
+
var_name_raw = re.compile(r'\((.*?)\).*$').search(code).groups()[0] # the default name is everything in the bracket, like: 'None_0', mode='w'
|
33
|
+
var_name = var_name_raw.split(',')[0]
|
34
|
+
pkl_path = f'{cache_dir}/{var_name}.pkl'
|
35
|
+
|
36
|
+
if var_name is None: # get the name by adding incremental number on the default name
|
37
|
+
# dir_path = os.path.dirname(os.path.realpath(__file__))
|
38
|
+
var_name = 'cached_variable'
|
39
|
+
for count_of_cached_obj in range(max_count):
|
40
|
+
pkl_path = f'{cache_dir}/{var_name}_{count_of_cached_obj}.pkl'
|
41
|
+
if not os.path.exists(pkl_path):
|
42
|
+
break
|
43
|
+
|
44
|
+
with open(pkl_path, 'wb') as file:
|
45
|
+
pickle.dump(varible, file)
|
46
|
+
|
47
|
+
if print_on:
|
48
|
+
print(var_name+": ", varible)
|
49
|
+
|
50
|
+
print(f'[INFO]: the value of variable [{var_name}] has been cached under ./_cache_!')
|
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
color_dict = {"tomato": '#FF836A',
|
3
|
+
"aquablue": '#6DC2B3',
|
4
|
+
"peach": '#FED6D2',
|
5
|
+
"darkgrey": '#9F9D9C',
|
6
|
+
"potato": '#FEF8C8',
|
7
|
+
"cyan": '#B6E4E1',
|
8
|
+
"Mindsett Blue": '#132F57',
|
9
|
+
"Black": '#000000',
|
10
|
+
"Mindsett Grey":'#b3b3b3',
|
11
|
+
"White": '#ffffff',
|
12
|
+
"Mindsett Green": '#00A19A',
|
13
|
+
"Mindsett Red":'#E6354C'}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
import os
|
4
|
+
|
5
|
+
def delete_files_in_directory(directory_path, ignore=[]):
|
6
|
+
try:
|
7
|
+
files = os.listdir(directory_path)
|
8
|
+
filtered_files = C = list(set(files) - set(ignore))
|
9
|
+
for file in filtered_files:
|
10
|
+
file_path = os.path.join(directory_path, file)
|
11
|
+
if os.path.isfile(file_path):
|
12
|
+
os.remove(file_path)
|
13
|
+
print(f"\nAll files in path [{directory_path}] were deleted successfully.")
|
14
|
+
except OSError:
|
15
|
+
print("Error occurred while deleting files.")
|
@@ -0,0 +1,66 @@
|
|
1
|
+
import pandas as pd
|
2
|
+
|
3
|
+
def enriching_time_features(df_meta_with_value, period_freq='M',
|
4
|
+
schedule_records = None,
|
5
|
+
ooh_values=['OUT OF HOURS', 'POST TRADE', 'closed'],
|
6
|
+
weekend=None,
|
7
|
+
working_end_time=None,
|
8
|
+
working_start_time=None,
|
9
|
+
timezone='UTC'):
|
10
|
+
|
11
|
+
if weekend == None:
|
12
|
+
weekend = 5
|
13
|
+
if working_end_time == None:
|
14
|
+
working_end_time = "18:00:00"
|
15
|
+
if working_start_time == None:
|
16
|
+
working_start_time = "08:00:00"
|
17
|
+
|
18
|
+
# manipulate and clean the data
|
19
|
+
|
20
|
+
# print('df_meta_with_value.head(3).time: ', df_meta_with_value.head(3).time)
|
21
|
+
|
22
|
+
df_meta_with_value.time = pd.to_datetime(df_meta_with_value.time).dt.tz_convert(timezone)
|
23
|
+
|
24
|
+
# print('df_meta_with_value.head(3): ', df_meta_with_value.head(3)) # test
|
25
|
+
df_meta_with_value = df_meta_with_value.set_index("time")
|
26
|
+
|
27
|
+
# enrich_time_information
|
28
|
+
df_meta_with_value["date"] = df_meta_with_value.index.date
|
29
|
+
df_meta_with_value["day_of_month"] = df_meta_with_value.index.day
|
30
|
+
df_meta_with_value["time_of_day"] = df_meta_with_value.index.time
|
31
|
+
|
32
|
+
df_meta_with_value['time_of_day_in_float'] = df_meta_with_value.index.hour+df_meta_with_value.index.minute/60+df_meta_with_value.index.second/3600
|
33
|
+
|
34
|
+
df_meta_with_value["weekday"] = df_meta_with_value.index.weekday
|
35
|
+
df_meta_with_value["day_name"] = df_meta_with_value.index.day_name()
|
36
|
+
df_meta_with_value["day_code"] = df_meta_with_value["day_name"].str[0]
|
37
|
+
df_meta_with_value["month"] = df_meta_with_value.index.month
|
38
|
+
df_meta_with_value["month_name"] = df_meta_with_value.index.month_name() #new change/implementation -RP
|
39
|
+
|
40
|
+
# print('schedule_records: ', schedule_records)
|
41
|
+
|
42
|
+
if schedule_records is not None:
|
43
|
+
|
44
|
+
df_meta_with_value["out_of_hours"] = False
|
45
|
+
|
46
|
+
for schedule_record in schedule_records:
|
47
|
+
# print('schedule_record: ', schedule_record)
|
48
|
+
if schedule_record['name'] in ooh_values:
|
49
|
+
df_meta_with_value["out_of_hours"] |= (df_meta_with_value['day_name'] == schedule_record['day']) & \
|
50
|
+
(df_meta_with_value["time_of_day"] >= schedule_record['start_time']) & \
|
51
|
+
(df_meta_with_value["time_of_day"] < schedule_record['end_time'])
|
52
|
+
|
53
|
+
# print('ooh exist:', sr_ooh_record.unique())
|
54
|
+
## For out of hour - POST TRADE, OUT OF HOUR
|
55
|
+
## For In Hour - PRE TRADE, TRADE
|
56
|
+
|
57
|
+
# If out of hour - then run the below files, checkpoint - POST TRADE & OUT OF HOUR
|
58
|
+
# if !out of hour - checkpoint - POST TRADE | OUT OF HOUR, run different file
|
59
|
+
else:
|
60
|
+
df_meta_with_value["out_of_hours"] = df_meta_with_value['weekday'].ge(weekend) | \
|
61
|
+
(df_meta_with_value["time_of_day"] > pd.to_datetime(working_end_time).time()) | \
|
62
|
+
(df_meta_with_value["time_of_day"] < pd.to_datetime(working_start_time).time())
|
63
|
+
|
64
|
+
df_meta_with_value["period"] = df_meta_with_value.index.tz_localize(None).to_period(freq=period_freq)
|
65
|
+
|
66
|
+
return df_meta_with_value
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import pandas as pd
|
2
|
+
|
3
|
+
def generate_time_partition_list(time_range, freq='1D'):
|
4
|
+
|
5
|
+
start_time_str = time_range[0]
|
6
|
+
end_time_str = time_range[1]
|
7
|
+
|
8
|
+
time_list = pd.date_range(start=start_time_str, end=end_time_str, freq=freq).to_list()
|
9
|
+
|
10
|
+
time_str_list = [time.strftime("%Y-%m-%d %X%z") for time in time_list]
|
11
|
+
|
12
|
+
time_range_list = list(zip(time_str_list[:-1], time_str_list[1:]))
|
13
|
+
|
14
|
+
return time_range_list
|
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
from .get_pos_bot_and_ylim import get_pos_bot_and_ylim
|
3
|
+
|
4
|
+
def get_pos_bot_range_unit_format(df_pivot_working_hours_sorted,
|
5
|
+
pad_pct_above_max=None):
|
6
|
+
|
7
|
+
df_pivot_working_hours_sorted_reset = df_pivot_working_hours_sorted.reset_index(drop=True)
|
8
|
+
|
9
|
+
df_pivot_working_hours_sorted_reset_pos, \
|
10
|
+
df_pivot_working_hours_sorted_reset_bot, \
|
11
|
+
ytick_range = get_pos_bot_and_ylim(df_pivot_working_hours_sorted_reset,
|
12
|
+
pad_pct_above_max = pad_pct_above_max)
|
13
|
+
|
14
|
+
max_y_tick = max([abs(y_tick) for y_tick in ytick_range])
|
15
|
+
|
16
|
+
if max_y_tick > 0.1: # 100 kwh = 0.1 mwh as switching point for unit as kwh or mwh
|
17
|
+
display_unit = 'MWh'
|
18
|
+
formatter = '%.1f'
|
19
|
+
|
20
|
+
#ax_l.set_yticks(np.arange(0, tick_range_e, 0.1))
|
21
|
+
# ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1f'))
|
22
|
+
else:
|
23
|
+
df_pivot_working_hours_sorted_reset = df_pivot_working_hours_sorted_reset.mul(1000)
|
24
|
+
|
25
|
+
# after the change of units, the dfs and limits should be updated
|
26
|
+
df_pivot_working_hours_sorted_reset_pos, \
|
27
|
+
df_pivot_working_hours_sorted_reset_bot, \
|
28
|
+
ytick_range = get_pos_bot_and_ylim(df_pivot_working_hours_sorted_reset,
|
29
|
+
pad_pct_above_max = pad_pct_above_max)
|
30
|
+
|
31
|
+
display_unit = 'kWh'
|
32
|
+
formatter = '%.0f'
|
33
|
+
|
34
|
+
#ax_l.set_yticks(np.arange(0, tick_range_e, 0.1))
|
35
|
+
# ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.0f'))
|
36
|
+
|
37
|
+
return df_pivot_working_hours_sorted_reset_pos, df_pivot_working_hours_sorted_reset_bot, ytick_range, display_unit, formatter
|
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def get_pos_bot_and_ylim(df_pivot_working_hours_sorted_reset,
|
4
|
+
pad_pct_above_max = None):
|
5
|
+
|
6
|
+
if pad_pct_above_max is None:
|
7
|
+
pad_pct_above_max = 0.2
|
8
|
+
|
9
|
+
# make the index unique for later processing
|
10
|
+
df_pivot_working_hours_sorted_reset_pos = df_pivot_working_hours_sorted_reset[False]
|
11
|
+
sr_pivot_working_hours_sorted_reset_bot = df_pivot_working_hours_sorted_reset[True].sum(axis=1)
|
12
|
+
|
13
|
+
# get the maximum and minimum values
|
14
|
+
zero_line = 0
|
15
|
+
tick_value_e_max = max(zero_line, df_pivot_working_hours_sorted_reset.sum(axis=1).max()) # ensure that the 0 line is still showing
|
16
|
+
tick_value_e_min = min(zero_line, sr_pivot_working_hours_sorted_reset_bot.min()) # ensure that the 0 line is still showing
|
17
|
+
tick_value_e_var = tick_value_e_max - tick_value_e_min
|
18
|
+
|
19
|
+
# add padding to the boundary values to make the range
|
20
|
+
|
21
|
+
if abs(tick_value_e_min) > (tick_value_e_max*0.01): # if the abs value of tick_value_e_min is very small, then set zero as the lowest range
|
22
|
+
pad_pct_below_min = 0.05
|
23
|
+
else:
|
24
|
+
pad_pct_below_min = 0
|
25
|
+
|
26
|
+
tick_range_e_max = tick_value_e_max + tick_value_e_var*pad_pct_above_max
|
27
|
+
tick_range_e_min = tick_value_e_min - tick_value_e_var*pad_pct_below_min
|
28
|
+
|
29
|
+
ls_ylim = [tick_range_e_min, tick_range_e_max]
|
30
|
+
|
31
|
+
return df_pivot_working_hours_sorted_reset_pos, sr_pivot_working_hours_sorted_reset_bot, ls_ylim
|
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
# modify the names in asset_group based on the provided dictionary
|
3
|
+
|
4
|
+
def modify_group_names(df_meta_with_value, group_name_column="asset_type", modification_dict={}):
|
5
|
+
|
6
|
+
# the letter cases and spaces prefix/sufix will not affect the result
|
7
|
+
df_meta_with_value[group_name_column] = df_meta_with_value[group_name_column].str.strip()
|
8
|
+
|
9
|
+
modification_dict_with_lowercase_key = {}
|
10
|
+
for group in modification_dict:
|
11
|
+
modification_dict_with_lowercase_key[group.lower().strip()] = modification_dict[group]
|
12
|
+
|
13
|
+
df_meta_with_value[group_name_column] = df_meta_with_value[group_name_column] \
|
14
|
+
.str.lower() \
|
15
|
+
.map(modification_dict_with_lowercase_key) \
|
16
|
+
.fillna(df_meta_with_value[group_name_column])
|
17
|
+
return df_meta_with_value
|
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
import pandas as pd
|
3
|
+
|
4
|
+
def patch_missing_periods(df_source, start_time, end_time,
|
5
|
+
time_col='time',
|
6
|
+
value_col='kwh',
|
7
|
+
period_freq='W',
|
8
|
+
timezone='UTC'):
|
9
|
+
|
10
|
+
# print('start_time, end_time:', start_time, end_time)
|
11
|
+
|
12
|
+
end_time_inclusive = end_time - pd.Timedelta(microseconds=1)
|
13
|
+
|
14
|
+
# print('df_source: ', df_source.sort_values(by=['time'], ascending=False).head())
|
15
|
+
actual_periods_ls = pd.to_datetime(df_source.time, utc=True).dt.tz_convert(tz=timezone).dt.tz_localize(None).dt.to_period(freq=period_freq).unique()
|
16
|
+
expect_periods_ls = pd.period_range(start=start_time, end=end_time_inclusive, freq=period_freq)
|
17
|
+
|
18
|
+
# print('actual_periods_ls: ', actual_periods_ls)
|
19
|
+
# print('expect_periods_ls: ', expect_periods_ls)
|
20
|
+
|
21
|
+
for period_obj in expect_periods_ls:
|
22
|
+
if period_obj not in actual_periods_ls:
|
23
|
+
|
24
|
+
print(f'There is no data in period {period_obj}. A placeholder with zero consumption has been added!')
|
25
|
+
print('start_time', period_obj.start_time)
|
26
|
+
df_placeholder = df_source.head(1)
|
27
|
+
with pd.option_context('mode.chained_assignment', None):
|
28
|
+
df_placeholder[value_col] = 0
|
29
|
+
df_placeholder[time_col] = pd.Timestamp(period_obj.start_time, tz=timezone)
|
30
|
+
df_source = pd.concat([df_source, df_placeholder], ignore_index=True)
|
31
|
+
df_source.loc[:, time_col] = pd.to_datetime(df_source[time_col], utc=True)
|
32
|
+
|
33
|
+
# print('df_source: ', df_source.head())
|
34
|
+
return df_source
|
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
import numpy as np
|
3
|
+
|
4
|
+
def plot_stacked_barchart(ax, df_pivot_working_hours, bottom=None,
|
5
|
+
tick_range=None,
|
6
|
+
top_hours=None):
|
7
|
+
|
8
|
+
if tick_range is None:
|
9
|
+
tick_value_e_max = max(0, df_pivot_working_hours.sum(axis=1).max())
|
10
|
+
tick_value_e_min = min(0, df_pivot_working_hours.sum(axis=1).min())
|
11
|
+
tick_range = [tick_value_e_min, tick_value_e_max]
|
12
|
+
|
13
|
+
if bottom is None:
|
14
|
+
bottom = 0
|
15
|
+
if top_hours is None:
|
16
|
+
top_hours = True
|
17
|
+
|
18
|
+
tick_value_e_var = tick_range[1] - tick_range[0]
|
19
|
+
white_padding_below_bar = abs(tick_value_e_var/100)
|
20
|
+
|
21
|
+
bar_padding_adjustment = 0.01 # used when the paddings on the left/right are different
|
22
|
+
|
23
|
+
bot_hours = not top_hours
|
24
|
+
|
25
|
+
bar_edgecolour = ['k','w']
|
26
|
+
bar_fillcolour = ['k','w']
|
27
|
+
bar_color = '#6DC2B3'
|
28
|
+
|
29
|
+
hours_labels = {True: "Out Of Hours", False: "In Hours"}
|
30
|
+
hours_colors = {True: "w", False: bar_color}
|
31
|
+
|
32
|
+
# white edge/pad of bar
|
33
|
+
ax.bar(df_pivot_working_hours.index, df_pivot_working_hours[top_hours].fillna(0)+df_pivot_working_hours[bot_hours].fillna(0),
|
34
|
+
bottom=bottom,
|
35
|
+
width=0.7,
|
36
|
+
lw=1.3,
|
37
|
+
edgecolor=bar_edgecolour[0],
|
38
|
+
color=bar_fillcolour[1],
|
39
|
+
label=hours_labels[top_hours])
|
40
|
+
|
41
|
+
# bottom bar inner part
|
42
|
+
inner_bar_bot_pad = tick_value_e_var*0.01
|
43
|
+
df_white_padding_below_bar_conditional = np.sign(df_pivot_working_hours[bot_hours])*(white_padding_below_bar+inner_bar_bot_pad)
|
44
|
+
ax.bar(df_pivot_working_hours.index+bar_padding_adjustment, df_pivot_working_hours[bot_hours].fillna(0) - df_white_padding_below_bar_conditional,
|
45
|
+
bottom=bottom+inner_bar_bot_pad,
|
46
|
+
width=0.4,
|
47
|
+
lw=0,
|
48
|
+
color= hours_colors[bot_hours],
|
49
|
+
edgecolor=bar_edgecolour[1],
|
50
|
+
label=hours_labels[bot_hours])
|
@@ -0,0 +1,73 @@
|
|
1
|
+
import smtplib
|
2
|
+
from pathlib import Path
|
3
|
+
from email.mime.multipart import MIMEMultipart
|
4
|
+
from email.mime.base import MIMEBase
|
5
|
+
from email.mime.text import MIMEText
|
6
|
+
from email.utils import COMMASPACE, formatdate
|
7
|
+
from email import encoders
|
8
|
+
import io
|
9
|
+
|
10
|
+
def send_email(send_from, send_to, subject, message, signature=None, cc=None, bcc=None, files={},
|
11
|
+
server="localhost", port=587, username='', password='',
|
12
|
+
use_tls=True):
|
13
|
+
"""Compose and send email with provided info and attachments.
|
14
|
+
|
15
|
+
Args:
|
16
|
+
send_from (str): from name
|
17
|
+
send_to (list[str]): to name(s)
|
18
|
+
subject (str): message title
|
19
|
+
message (str): message body
|
20
|
+
files (dict{str:str|obj}): list of file paths to be attached to email
|
21
|
+
server (str): mail server host name
|
22
|
+
port (int): port number
|
23
|
+
username (str): server auth username
|
24
|
+
password (str): server auth password
|
25
|
+
use_tls (bool): use TLS mode
|
26
|
+
"""
|
27
|
+
|
28
|
+
msg = MIMEMultipart()
|
29
|
+
msg['From'] = send_from
|
30
|
+
msg['To'] = COMMASPACE.join(send_to)
|
31
|
+
|
32
|
+
if cc is not None:
|
33
|
+
msg['Cc'] = COMMASPACE.join(cc)
|
34
|
+
|
35
|
+
if bcc is not None:
|
36
|
+
msg['Bcc'] = COMMASPACE.join(bcc)
|
37
|
+
|
38
|
+
msg['Date'] = formatdate(localtime=True)
|
39
|
+
msg['Subject'] = subject
|
40
|
+
|
41
|
+
html_msg = MIMEText(message, 'html')
|
42
|
+
msg.attach(html_msg)
|
43
|
+
|
44
|
+
if signature != None:
|
45
|
+
sgn = MIMEText(signature, "html")
|
46
|
+
msg.attach(sgn)
|
47
|
+
|
48
|
+
for filename in files:
|
49
|
+
part = MIMEBase('application', "octet-stream")
|
50
|
+
|
51
|
+
file_path_obj = files[filename]
|
52
|
+
|
53
|
+
if isinstance(file_path_obj, io.BytesIO):
|
54
|
+
part.set_payload(file_path_obj.getvalue())
|
55
|
+
encoders.encode_base64(part)
|
56
|
+
part.add_header('Content-Disposition',
|
57
|
+
f'attachment; filename={filename}')
|
58
|
+
else:
|
59
|
+
with open(file_path_obj, 'rb') as file:
|
60
|
+
part.set_payload(file.read())
|
61
|
+
encoders.encode_base64(part)
|
62
|
+
part.add_header('Content-Disposition',
|
63
|
+
f'attachment; filename={filename}')
|
64
|
+
msg.attach(part)
|
65
|
+
|
66
|
+
smtp = smtplib.SMTP(server, port)
|
67
|
+
if use_tls:
|
68
|
+
smtp.starttls()
|
69
|
+
smtp.login(username, password)
|
70
|
+
smtp.sendmail(send_from, send_to, msg.as_string())
|
71
|
+
smtp.quit()
|
72
|
+
|
73
|
+
print(f'[smtp]: email sent successfully to {str(send_to)}!')
|
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
from .check_table_existence import check_table_existence
|
3
|
+
from .create_new_schema import create_new_schema
|
4
|
+
from .empty_table import empty_table
|
5
|
+
from .create_table import create_table
|
6
|
+
|
7
|
+
def setup_table(engine, table_name, columns_dict,
|
8
|
+
hypertable=False,
|
9
|
+
index=None,
|
10
|
+
constraint=None,
|
11
|
+
redo_from_start=False,
|
12
|
+
with_log=True):
|
13
|
+
"""
|
14
|
+
Function Name: setup_table
|
15
|
+
Parameters : sql connection engine, table name, redo_from_start flag
|
16
|
+
Description : if redo from start set inconfiguration file - emptys table
|
17
|
+
otherwise creates a new table and schema if required
|
18
|
+
"""
|
19
|
+
|
20
|
+
is_exist = check_table_existence(engine, table_name)
|
21
|
+
|
22
|
+
if is_exist:
|
23
|
+
if redo_from_start:
|
24
|
+
empty_table(engine, table_name,
|
25
|
+
with_log=with_log)
|
26
|
+
else:
|
27
|
+
table_schema_name_list = table_name.split(".")
|
28
|
+
|
29
|
+
if len(table_schema_name_list) > 1:
|
30
|
+
|
31
|
+
# TODO: add check_schema_existence
|
32
|
+
table_schema = table_schema_name_list[0]
|
33
|
+
create_new_schema(engine, table_schema)
|
34
|
+
|
35
|
+
create_table(engine, table_name, columns_dict,
|
36
|
+
constraint=constraint,
|
37
|
+
index=index,
|
38
|
+
hypertable=hypertable)
|
39
|
+
|
40
|
+
return
|
@@ -0,0 +1,25 @@
|
|
1
|
+
def check_table_existence(engine, table_name):
|
2
|
+
|
3
|
+
table_schema_name_list = table_name.split('.')
|
4
|
+
|
5
|
+
if len(table_schema_name_list) > 1:
|
6
|
+
table_schema = table_schema_name_list[0]
|
7
|
+
table_non_schema_name = table_schema_name_list[1]
|
8
|
+
else:
|
9
|
+
table_schema = 'public'
|
10
|
+
table_non_schema_name = table_name
|
11
|
+
|
12
|
+
query_check_existing_tables = f"""select table_name from information_schema.tables where table_schema = '{table_schema}'
|
13
|
+
and table_name = '{table_non_schema_name}'"""
|
14
|
+
|
15
|
+
with engine.connect() as conn:
|
16
|
+
list_tables = conn.execute(query_check_existing_tables)
|
17
|
+
|
18
|
+
table_name_list = [table_name[0] for table_name in list_tables]
|
19
|
+
|
20
|
+
if len(table_name_list) == 1:
|
21
|
+
# print(f'The table [{table_name}] already exists')
|
22
|
+
return True
|
23
|
+
else:
|
24
|
+
# print(f'The table [{table_name}] does not exist')
|
25
|
+
return False
|
@@ -0,0 +1,73 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
def create_table(engine, table_name, columns_dict, hypertable=False, time_column='time', index=None, constraint=None):
|
4
|
+
"""
|
5
|
+
Function Name: create_table
|
6
|
+
Parameters : sql connection engine, table name, column dictionay, hypertable required flag
|
7
|
+
Description : creates a new table
|
8
|
+
|
9
|
+
"""
|
10
|
+
|
11
|
+
if hypertable:
|
12
|
+
if time_column not in columns_dict:
|
13
|
+
raise "For hypertable requires a valid time column in columns_dict defined with schema timestamp"
|
14
|
+
|
15
|
+
with engine.connect() as conn:
|
16
|
+
|
17
|
+
if hypertable:
|
18
|
+
# enable the timescaledb extension, so function create_hypertable can be used
|
19
|
+
query_create_extensions = "CREATE EXTENSION IF NOT EXISTS timescaledb;"
|
20
|
+
conn.execute(query_create_extensions)
|
21
|
+
|
22
|
+
columns_list = [f"{column_name} {columns_dict[column_name]}" for column_name in columns_dict]
|
23
|
+
|
24
|
+
query_columns_statement = ", ".join(columns_list)
|
25
|
+
|
26
|
+
query_create_normaltable = f"""CREATE TABLE {table_name} ({query_columns_statement});"""
|
27
|
+
|
28
|
+
conn.execute(query_create_normaltable)
|
29
|
+
|
30
|
+
table_feature_statement = ''
|
31
|
+
|
32
|
+
if hypertable:
|
33
|
+
query_create_hypertable = f"SELECT create_hypertable('{table_name}', '{time_column}');"
|
34
|
+
conn.execute(query_create_hypertable)
|
35
|
+
table_feature_statement += ', as hypertable'
|
36
|
+
|
37
|
+
if index is not None:
|
38
|
+
index_name = list(index)[0]
|
39
|
+
if isinstance(index[index_name], list):
|
40
|
+
index_columns_list = index[index_name]
|
41
|
+
else:
|
42
|
+
index_columns_list = [index[index_name]] # convert variable to list
|
43
|
+
|
44
|
+
index_columns_str = ", ".join(index_columns_list)
|
45
|
+
|
46
|
+
query_create_index = f"CREATE INDEX {index_name} ON {table_name} ({index_columns_str});"
|
47
|
+
conn.execute(query_create_index)
|
48
|
+
table_feature_statement += f', with index: {index_name} - [{index_columns_str}]'
|
49
|
+
|
50
|
+
if constraint is not None:
|
51
|
+
for constraint_name in list(constraint):
|
52
|
+
if isinstance(constraint[constraint_name], list):
|
53
|
+
constraint_columns_list = constraint[constraint_name]
|
54
|
+
else:
|
55
|
+
constraint_columns_list = [constraint[constraint_name]] # convert variable to list
|
56
|
+
|
57
|
+
constraint_columns_str = ", ".join(constraint_columns_list)
|
58
|
+
|
59
|
+
query_create_constraint = f"ALTER TABLE {table_name} ADD CONSTRAINT {constraint_name} UNIQUE ({constraint_columns_str});"
|
60
|
+
|
61
|
+
# print('query_create_constraint: ', query_create_constraint)
|
62
|
+
conn.execute(query_create_constraint)
|
63
|
+
|
64
|
+
table_feature_statement += f', with constraint: {constraint_name} - [{constraint_columns_str}]'
|
65
|
+
# conn.commit()
|
66
|
+
|
67
|
+
# example:
|
68
|
+
# ALTER TABLE table_name
|
69
|
+
# ADD CONSTRAINT constraint_name
|
70
|
+
# UNIQUE(column1,column2,..)
|
71
|
+
|
72
|
+
print(f'New table [{table_name}] is created' + table_feature_statement + '.')
|
73
|
+
return
|
@@ -0,0 +1,11 @@
|
|
1
|
+
def empty_table(engine, table_name, with_log=True):
|
2
|
+
|
3
|
+
with engine.connect() as conn:
|
4
|
+
|
5
|
+
# delete data (empty) in the table
|
6
|
+
query_empty_table = f"""DELETE FROM {table_name};"""
|
7
|
+
conn.execute(query_empty_table)
|
8
|
+
|
9
|
+
if with_log:
|
10
|
+
print(f'The table [{table_name}] is empty now.')
|
11
|
+
return
|