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