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.
Files changed (221) hide show
  1. energy_reports_pkg-0.6.14.dist-info/METADATA +10 -0
  2. energy_reports_pkg-0.6.14.dist-info/RECORD +221 -0
  3. energy_reports_pkg-0.6.14.dist-info/WHEEL +5 -0
  4. energy_reports_pkg-0.6.14.dist-info/top_level.txt +1 -0
  5. mindsett_energy_reports_pkg/config/__init__.py +6 -0
  6. mindsett_energy_reports_pkg/config/email/__init__.py +37 -0
  7. mindsett_energy_reports_pkg/config/monday/__init__.py +8 -0
  8. mindsett_energy_reports_pkg/config/monday/auth/__init__.py +7 -0
  9. mindsett_energy_reports_pkg/config/monday/columns_concerned/__init__.py +22 -0
  10. mindsett_energy_reports_pkg/config/postgresdb/__init__.py +33 -0
  11. mindsett_energy_reports_pkg/config/postgresdb/table/__init__.py +2 -0
  12. mindsett_energy_reports_pkg/config/postgresdb/table_building/__init__.py +1 -0
  13. mindsett_energy_reports_pkg/config/postgresdb/table_building_total/__init__.py +1 -0
  14. mindsett_energy_reports_pkg/config/postgresdb/table_cache/__init__.py +30 -0
  15. mindsett_energy_reports_pkg/config/postgresdb/table_iot/__init__.py +1 -0
  16. mindsett_energy_reports_pkg/config/postgresdb/table_mailing/__init__.py +15 -0
  17. mindsett_energy_reports_pkg/config/postgresdb/table_meta/__init__.py +2 -0
  18. mindsett_energy_reports_pkg/config/postgresdb/table_occupancy/__init__.py +3 -0
  19. mindsett_energy_reports_pkg/config/postgresdb/table_on_off/__init__.py +2 -0
  20. mindsett_energy_reports_pkg/config/postgresdb/table_org/__init__.py +1 -0
  21. mindsett_energy_reports_pkg/config/postgresdb/table_price/__init__.py +2 -0
  22. mindsett_energy_reports_pkg/config/postgresdb/table_schedule/__init__.py +1 -0
  23. mindsett_energy_reports_pkg/config/postgresdb/table_sqm/__init__.py +2 -0
  24. mindsett_energy_reports_pkg/config/postgresdb/table_timezone/__init__.py +2 -0
  25. mindsett_energy_reports_pkg/config/sharepoint/__init__.py +12 -0
  26. mindsett_energy_reports_pkg/config/sharepoint/excel/__init__.py +5 -0
  27. mindsett_energy_reports_pkg/config/sharepoint/excel/columns_concerned/__init__.py +7 -0
  28. mindsett_energy_reports_pkg/config/smtp/__init__.py +10 -0
  29. mindsett_energy_reports_pkg/jobs/databricks_job.py +31 -0
  30. mindsett_energy_reports_pkg/libs/MondayProcessor/DataProcessor/__init__.py +14 -0
  31. mindsett_energy_reports_pkg/libs/MondayProcessor/DataProcessor/launchInteractiveProcess.py +6 -0
  32. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorBoardColumnNotMatch/__init__.py +6 -0
  33. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorBoardNotFound/__init__.py +5 -0
  34. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorException/__init__.py +4 -0
  35. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorNoColumInBoard/__init__.py +5 -0
  36. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorNoGroupsInBoard/__init__.py +5 -0
  37. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorNoItemInGroup/__init__.py +6 -0
  38. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/MondayProcessorPageNotSupported/__init__.py +7 -0
  39. mindsett_energy_reports_pkg/libs/MondayProcessor/MondayProcessorExceptions_/__init__.py +8 -0
  40. mindsett_energy_reports_pkg/libs/MondayProcessor/__init__.py +40 -0
  41. mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchBoardById.py +13 -0
  42. mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchBoardLogsById.py +33 -0
  43. mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchColumnValueByGroup.py +103 -0
  44. mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchGroups.py +19 -0
  45. mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchPrismConf.py +10 -0
  46. mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchPrismConfByBoard.py +83 -0
  47. mindsett_energy_reports_pkg/libs/MondayProcessor/_fetchPrismConfByGroup.py +89 -0
  48. mindsett_energy_reports_pkg/libs/MondayProcessor/_searchColumnIdsByName.py +23 -0
  49. mindsett_energy_reports_pkg/libs/MondayProcessor/_searchConfColumnIds.py +30 -0
  50. mindsett_energy_reports_pkg/libs/MondayProcessor/_searchConfColumnIdsMatch.py +20 -0
  51. mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/__init__.py +11 -0
  52. mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/__init__.py +12 -0
  53. mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/__init__.py +11 -0
  54. mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/__init__.py +10 -0
  55. mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/items/__init__.py +12 -0
  56. mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/items/column_values/__init__.py +10 -0
  57. mindsett_energy_reports_pkg/libs/MondayProcessor/dev/graphql_query/boards/groups/items_page/items/column_values/column/__init__.py +2 -0
  58. mindsett_energy_reports_pkg/libs/MondayProcessor/launchInteractiveProcess.py +7 -0
  59. mindsett_energy_reports_pkg/libs/__init__.py +4 -0
  60. mindsett_energy_reports_pkg/libs/cache_return/__init__.py +47 -0
  61. mindsett_energy_reports_pkg/libs/fetch_monday_info/__init__.py +29 -0
  62. mindsett_energy_reports_pkg/libs/fetch_monday_info/load_cf_from_db/__init__.py +17 -0
  63. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/__init__.py +52 -0
  64. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/cache_cf_to_db/__init__.py +11 -0
  65. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/cache_cf_to_db/append_df_to_table/__init__.py +29 -0
  66. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/cache_cf_to_db/empty_table/__init__.py +11 -0
  67. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/__init__.py +57 -0
  68. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/get_mailing_list/__init__.py +25 -0
  69. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/load_mailing_list/__init__.py +50 -0
  70. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/extract_contacts/load_mailing_list/columns_concerned/__init__.py +22 -0
  71. mindsett_energy_reports_pkg/libs/fetch_monday_info/sync_with_monday/get_last_update_time/__init__.py +26 -0
  72. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/__init__.py +27 -0
  73. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/load_cf_from_db/__init__.py +17 -0
  74. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/__init__.py +28 -0
  75. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/cache_cf_to_db/__init__.py +11 -0
  76. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/cache_cf_to_db/append_df_to_table/__init__.py +29 -0
  77. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/cache_cf_to_db/empty_table/__init__.py +11 -0
  78. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/__init__.py +13 -0
  79. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/__init__.py +57 -0
  80. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/columns_concerned/__init__.py +8 -0
  81. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/extract_id/# __init__.py +11 -0
  82. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/extract_id/__init__.py +19 -0
  83. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/get_mailing_list/__init__.py +10 -0
  84. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/format_contacts/uuid_for_nona/__init__.py +12 -0
  85. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/load_mailing_list/__init__.py +30 -0
  86. 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
  87. mindsett_energy_reports_pkg/libs/fetch_sharepoint_info/sync_with_sharepoint/extract_contacts/load_mailing_list/load_excel_as_df/__init__.py +45 -0
  88. mindsett_energy_reports_pkg/libs/generate_dag_id/__init__.py +20 -0
  89. mindsett_energy_reports_pkg/libs/get_conn_by_id/__init__.py +42 -0
  90. mindsett_energy_reports_pkg/libs/get_conn_by_id/__version__.py +8 -0
  91. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_airflow/__init__.py +47 -0
  92. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/__init__.py +25 -0
  93. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/get_credential_url/__init__.py +17 -0
  94. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/get_credential_url/databricks/__init__.py +10 -0
  95. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_json/get_credential_url/local/__init__.py +13 -0
  96. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_synapse/__init__.py +15 -0
  97. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_synapse/connect_lake_and_fetch_json/__init__.py +19 -0
  98. mindsett_energy_reports_pkg/libs/get_conn_by_id/get_conn_by_id_synapse/datalake/__init__.py +7 -0
  99. mindsett_energy_reports_pkg/mdl/__init__.py +2 -0
  100. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/__init__.py +119 -0
  101. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_end_time/__init__.py +8 -0
  102. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_period_range/__init__.py +8 -0
  103. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_schedule_records/__init__.py +34 -0
  104. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_start_time/__init__.py +6 -0
  105. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/ClientSite/get_start_time_co2_barchart/__init__.py +7 -0
  106. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/__init__.py +93 -0
  107. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/email_report/__init__.py +47 -0
  108. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/__init__.py +75 -0
  109. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/apply_price_from_db/__init__.py +13 -0
  110. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/apply_price_from_db/load_energy_price/__init__.py +14 -0
  111. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/attach_id_to_buildings/__init__.py +24 -0
  112. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/attach_id_to_buildings/load_building/__init__.py +19 -0
  113. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/attach_id_to_buildings/load_org/__init__.py +13 -0
  114. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/check_and_keep_valid/__init__.py +36 -0
  115. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/load_sqm/__init__.py +11 -0
  116. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/load_config/load_timezone/__init__.py +11 -0
  117. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/__init__.py +43 -0
  118. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/__init__.py +47 -0
  119. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_daily_barchart_with_temp/__init__.py +40 -0
  120. 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
  121. 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
  122. 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
  123. 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
  124. 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
  125. 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
  126. 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
  127. 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
  128. 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
  129. 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
  130. 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
  131. 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
  132. 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
  133. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_energy_meter_with_benchmarking/__init__.py +42 -0
  134. 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
  135. 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
  136. 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
  137. 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
  138. 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
  139. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/__init__.py +42 -0
  140. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/insight_statements/__init__.py +41 -0
  141. 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
  142. 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
  143. 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
  144. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_insight_statements/preprocessing_for_statement/__init__.py +85 -0
  145. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/__init__.py +29 -0
  146. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/plot_shifted_period_barchart/__init__.py +49 -0
  147. 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
  148. 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
  149. 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
  150. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_period_barchart/preprocessing_for_period_barchart/__init__.py +43 -0
  151. 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
  152. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/__init__.py +56 -0
  153. 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
  154. 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
  155. 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
  156. 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
  157. 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
  158. 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
  159. 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
  160. 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
  161. 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
  162. 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
  163. 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
  164. 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
  165. 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
  166. 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
  167. 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
  168. 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
  169. 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
  170. 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
  171. 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
  172. 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
  173. 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
  174. 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
  175. 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
  176. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_phases/__init__.py +37 -0
  177. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_components/generate_piechart_with_phase/preprocessing_for_piechart/__init__.py +26 -0
  178. 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
  179. 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
  180. 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
  181. 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
  182. 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
  183. 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
  184. 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
  185. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_report/PDF/__init__.py +44 -0
  186. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_report/PDF/write_multicell_with_styles.py +30 -0
  187. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/generate_report/__init__.py +162 -0
  188. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/__init__.py +78 -0
  189. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/__init__.py +32 -0
  190. 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
  191. 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
  192. 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
  193. 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
  194. 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
  195. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/load_source_data/query_building_total/__init__.py +40 -0
  196. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/refine_group_name/__init__.py +20 -0
  197. 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
  198. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/prepare_report/preparing_source_data/validate_data_not_empty/__init__.py +9 -0
  199. mindsett_energy_reports_pkg/mdl/prepare_and_email_reports/select_sites_and_emails/__init__.py +19 -0
  200. mindsett_energy_reports_pkg/mdl/utils_/__init__.py +17 -0
  201. mindsett_energy_reports_pkg/mdl/utils_/cache_df_to_db/__init__.py +11 -0
  202. mindsett_energy_reports_pkg/mdl/utils_/cache_df_to_db/append_df_to_table/__init__.py +29 -0
  203. mindsett_energy_reports_pkg/mdl/utils_/cache_df_to_db/empty_table/__init__.py +11 -0
  204. mindsett_energy_reports_pkg/mdl/utils_/cache_obj/__init__.py +50 -0
  205. mindsett_energy_reports_pkg/mdl/utils_/color_dict/__init__.py +13 -0
  206. mindsett_energy_reports_pkg/mdl/utils_/delete_files_in_directory/__init__.py +15 -0
  207. mindsett_energy_reports_pkg/mdl/utils_/enriching_time_features/__init__.py +66 -0
  208. mindsett_energy_reports_pkg/mdl/utils_/enriching_time_features/__version__.py +4 -0
  209. mindsett_energy_reports_pkg/mdl/utils_/generate_time_partition_list/__init__.py +14 -0
  210. mindsett_energy_reports_pkg/mdl/utils_/get_group_with_others/__init__.py +7 -0
  211. mindsett_energy_reports_pkg/mdl/utils_/get_pos_bot_range_unit_format/__init__.py +37 -0
  212. mindsett_energy_reports_pkg/mdl/utils_/get_pos_bot_range_unit_format/get_pos_bot_and_ylim/__init__.py +31 -0
  213. mindsett_energy_reports_pkg/mdl/utils_/modify_group_names/__init__.py +17 -0
  214. mindsett_energy_reports_pkg/mdl/utils_/patch_missing_periods/__init__.py +34 -0
  215. mindsett_energy_reports_pkg/mdl/utils_/plot_stacked_barchart/__init__.py +50 -0
  216. mindsett_energy_reports_pkg/mdl/utils_/send_email/__init__.py +73 -0
  217. mindsett_energy_reports_pkg/mdl/utils_/setup_table/__init__.py +40 -0
  218. mindsett_energy_reports_pkg/mdl/utils_/setup_table/check_table_existence/__init__.py +25 -0
  219. mindsett_energy_reports_pkg/mdl/utils_/setup_table/create_new_schema/__init__.py +8 -0
  220. mindsett_energy_reports_pkg/mdl/utils_/setup_table/create_table/__init__.py +73 -0
  221. 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,14 @@
1
+
2
+
3
+ def get_formatted_name(name_text,
4
+ max_len=None):
5
+
6
+ if max_len is None:
7
+ max_len = 15
8
+
9
+ if len(name_text) > max_len:
10
+ label_name = name_text[:(max_len-3)]+"..."
11
+ else:
12
+ label_name = name_text
13
+
14
+ return label_name
@@ -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