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,75 @@
1
+
2
+ from fetch_sharepoint_info import fetch_sharepoint_info
3
+
4
+ from .check_and_keep_valid import check_and_keep_valid
5
+ from .load_timezone import load_timezone
6
+ from .load_sqm import load_sqm
7
+ from .attach_id_to_buildings import attach_id_to_buildings
8
+ from .apply_price_from_db import apply_price_from_db
9
+
10
+ def load_config(engine,
11
+ sharepoint,
12
+ table_name_org,
13
+ table_name_building,
14
+ table_name_timezone,
15
+ table_name_sqm,
16
+ table_name_price,
17
+ table_name_cache,
18
+ table_columns_cache,
19
+ monday=None, # making if optional here, so in the future it can be ignored from the outer layer of functions
20
+ sync_source=None,
21
+ cfg_src_type=None):
22
+
23
+ if cfg_src_type is None:
24
+ cfg_src_type = 'sharepoint' # default to sharepoint as suggested by Pat
25
+
26
+
27
+ if cfg_src_type == 'sharepoint':
28
+
29
+ df_config_raw = fetch_sharepoint_info(engine,
30
+ sharepoint,
31
+ table_name_cache,
32
+ table_columns_cache,
33
+ sync_source=sync_source)
34
+
35
+ elif cfg_src_type == 'monday':
36
+
37
+ from fetch_monday_info import fetch_monday_info
38
+
39
+ if monday is None:
40
+ raise Exception('[ERROR]: the config for monday is not provided, but cfg_src_type is monday!')
41
+
42
+ df_config_raw = fetch_monday_info(engine,
43
+ monday.auth.TOKEN,
44
+ table_name_cache,
45
+ table_columns_cache,
46
+ monday.board_id,
47
+ columns_concerned=monday.columns_concerned,
48
+ email_prefix=monday.email_prefix,
49
+ sync_monday=sync_source)
50
+
51
+ else:
52
+ raise Exception('[ERROR]: please choose the cfg_src_type from options [sharepoint, monday].')
53
+
54
+
55
+ df_config = attach_id_to_buildings(engine, df_config_raw, table_name_org, table_name_building,
56
+ caching=False) # df_config has to be the same name, so not renaming it here
57
+
58
+ df_tz = load_timezone(engine, table_name_timezone)
59
+ df_config_tz = df_config.merge(df_tz, on='building_id', how='left')
60
+
61
+ df_sqm = load_sqm(engine, table_name_sqm)
62
+ df_config_tz_sqm = df_config_tz.merge(df_sqm, on='building_id', how='left')
63
+
64
+ df_config_tz_price = apply_price_from_db(engine, table_name_price, df_config_tz_sqm)
65
+ # df_price = load_energy_price(engine, table_name_price)
66
+ # df_config_tz_sqm = df_config_tz_sqm.rename(columns={'conv_mwh_price': 'conv_mwh_price_bak'})
67
+ # # df_config_tz_sqm_no_price = df_config_tz_sqm.drop(columns=['conv_mwh_price'])
68
+ # df_config_tz_price = df_config_tz_sqm.merge(df_price, on='building_id', how='left')
69
+ # df_config_tz_price['conv_mwh_price'] = df_config_tz_price['conv_mwh_price'].fillna(df_config_tz_price['conv_mwh_price_bak'])
70
+ # df_config_tz_price = df_config_tz_price.drop(columns=['conv_mwh_price_bak'])
71
+
72
+ df_config_vld = check_and_keep_valid(df_config_tz_price)
73
+
74
+ return df_config_vld
75
+
@@ -0,0 +1,13 @@
1
+
2
+ from .load_energy_price import load_energy_price
3
+
4
+ def apply_price_from_db(engine, table_name_price, df_config_tz_sqm):
5
+
6
+ df_price = load_energy_price(engine, table_name_price)
7
+ df_config_tz_sqm = df_config_tz_sqm.rename(columns={'conv_mwh_price': 'conv_mwh_price_bak'})
8
+ # df_config_tz_sqm_no_price = df_config_tz_sqm.drop(columns=['conv_mwh_price'])
9
+ df_config_tz_price = df_config_tz_sqm.merge(df_price, on='building_id', how='left')
10
+ df_config_tz_price['conv_mwh_price'] = df_config_tz_price['conv_mwh_price'].fillna(df_config_tz_price['conv_mwh_price_bak'])
11
+ df_config_tz_price = df_config_tz_price.drop(columns=['conv_mwh_price_bak'])
12
+
13
+ return df_config_tz_price
@@ -0,0 +1,14 @@
1
+ import pandas as pd
2
+
3
+ def load_energy_price(engine, table_name):
4
+
5
+ with engine.connect() as conn:
6
+
7
+ query = f"""select space_id as building_id, price*1000 as conv_mwh_price, start as start_time from {table_name};""" # meta.space_annotations
8
+ df_price_all = pd.read_sql_query(query, con=conn)
9
+
10
+ df_price_latest = df_price_all.loc[df_price_all.groupby('building_id').start_time.idxmax()].drop(columns='start_time')
11
+
12
+ return df_price_latest
13
+
14
+ # def load_energy_price():
@@ -0,0 +1,24 @@
1
+
2
+ from .load_building import load_building
3
+ from .load_org import load_org
4
+
5
+ from cache_return import cache_return
6
+
7
+ @cache_return
8
+ def attach_id_to_buildings(engine, df_config, table_org_name, table_building_name):
9
+
10
+ df_org = load_org(engine, table_org_name)
11
+ df_building = load_building(engine, table_building_name, caching=False)
12
+ df_bld_org = df_building.merge(df_org, on='org_id', how='left').dropna()
13
+ # df_config_bld_id = df_config.merge(df_bld_org, on=['building_name', 'org'], how='left')
14
+ # df_config = df_config.drop(columns=['building_name', 'org'])
15
+ df_config_bld_id = df_config.merge(df_bld_org, on='building_id', how='left')
16
+ is_missing_bld_name = df_config_bld_id.building_id.isna().any()
17
+
18
+ if is_missing_bld_name: # this part may not be very necessary after change the mergy on building_id
19
+ df_config_bld_name_missing = df_config_bld_id.loc[df_config_bld_id['building_name'].isna()]
20
+
21
+ missed_buildings = df_config_bld_name_missing['item_name'].to_list()
22
+ raise Exception(f"The name(s) for building id(s) {missed_buildings} cannot be found!")
23
+
24
+ return df_config_bld_id.drop(columns=['item_name', 'group_name'])
@@ -0,0 +1,19 @@
1
+ import pandas as pd
2
+
3
+ from cache_return import cache_return
4
+
5
+ @cache_return
6
+ def load_building(engine, table_name):
7
+
8
+ with engine.connect() as conn:
9
+
10
+ query = f""" select id as building_id
11
+ ,name as building_name
12
+ ,org_id
13
+ from {table_name} """ # meta.space_annotations
14
+
15
+ df_building = pd.read_sql_query(query, con=conn)
16
+
17
+ df_building.building_name = df_building.building_name.str.strip()
18
+
19
+ return df_building
@@ -0,0 +1,13 @@
1
+ import pandas as pd
2
+
3
+ def load_org(engine, table_name):
4
+
5
+ with engine.connect() as conn:
6
+
7
+ query = f""" select id as org_id, name as org from {table_name} """ # meta.space_annotations
8
+
9
+ df_org = pd.read_sql_query(query, con=conn)
10
+
11
+ df_org.org = df_org.org.str.strip()
12
+
13
+ return df_org
@@ -0,0 +1,36 @@
1
+
2
+ def check_and_keep_valid(df_config):
3
+
4
+ df_config = df_config.fillna('')
5
+
6
+ # df_config = keep_valid(df_config, columns=['industry', 'floor_size', 'conv_mwh_price', 'timezone'])
7
+
8
+ no_industry = (df_config.industry == '')
9
+ no_floor_size = (df_config.floor_size.isna())
10
+
11
+ # print('df_config.conv_mwh_price: ', df_config.conv_mwh_price)
12
+
13
+ no_conv_mwh_price = (df_config.conv_mwh_price == 0)
14
+ no_timezone = (df_config.timezone.isna())
15
+
16
+ not_ready = (no_industry | no_floor_size | no_conv_mwh_price | no_timezone)
17
+
18
+ to_report = (df_config.publish | df_config.testing)
19
+
20
+ not_ready_but_report = (not_ready & to_report)
21
+
22
+ df_not_ready_but_report = df_config.loc[not_ready_but_report]
23
+
24
+ if df_not_ready_but_report.shape[0] > 0:
25
+
26
+ print('df_not_ready_but_report.T: ', df_not_ready_but_report.T)
27
+
28
+ raise Exception('df_not_ready_but_report is not empty, please double check the config of [industry, floor_size, conv_mwh_price, timezone] for these sites!')
29
+
30
+ df_config_ready = df_config.loc[~not_ready]
31
+
32
+ # quit()
33
+
34
+ return df_config_ready
35
+
36
+
@@ -0,0 +1,11 @@
1
+ import pandas as pd
2
+
3
+ def load_sqm(engine, table_name):
4
+
5
+ with engine.connect() as conn:
6
+
7
+ query = f""" select space_id as building_id, sqm as floor_size from {table_name};""" # meta.space_annotations
8
+
9
+ df_tz = pd.read_sql_query(query, con=conn)
10
+
11
+ return df_tz
@@ -0,0 +1,11 @@
1
+ import pandas as pd
2
+
3
+ def load_timezone(engine, table_name):
4
+
5
+ with engine.connect() as conn:
6
+
7
+ query = f""" select space_id as building_id, value as timezone from {table_name} where key ='timezone' """ # meta.space_annotations
8
+
9
+ df_tz = pd.read_sql_query(query, con=conn)
10
+
11
+ return df_tz
@@ -0,0 +1,43 @@
1
+ import pandas as pd
2
+ import matplotlib
3
+ matplotlib.use('Agg') # turn off the display graphs
4
+
5
+ from .preparing_source_data import preparing_source_data
6
+ from .generate_components import generate_components
7
+ from .generate_report import generate_report
8
+
9
+ def prepare_report(cf, site_obj,
10
+ debug=False,
11
+ report_file_folder=None,
12
+ directory_to_savefile=None):
13
+
14
+ df_meta_with_value, df_meta_with_value_building = preparing_source_data(cf.postgresdb,
15
+ site_obj,
16
+ debug=debug,
17
+ caching=False)
18
+
19
+ # currently site_name is used for building_occupancy
20
+ components = generate_components(cf.postgresdb, df_meta_with_value, df_meta_with_value_building, site_obj,
21
+ fontsize=13,
22
+ directory_to_savefile=directory_to_savefile)
23
+
24
+
25
+ current_period = df_meta_with_value.period.max() # + pd.offsets.Week()
26
+
27
+ try: # handle the case where insights statement is not provided
28
+ report_file_dict = generate_report(site_obj.site_name, current_period,
29
+ statements_list=site_obj.insight_statements,
30
+ organisation=site_obj.org_name,
31
+ components=components,
32
+ files_folder=directory_to_savefile,
33
+ figures_folder=directory_to_savefile,
34
+ report_file_folder=report_file_folder)
35
+ except:
36
+ report_file_dict = generate_report(site_obj.site_name, current_period,
37
+ organisation=site_obj.org_name,
38
+ components=components,
39
+ files_folder=directory_to_savefile,
40
+ figures_folder=directory_to_savefile,
41
+ report_file_folder=report_file_folder)
42
+
43
+ return report_file_dict, current_period
@@ -0,0 +1,47 @@
1
+ import matplotlib.pyplot as plt
2
+ plt.rcParams['figure.max_open_warning'] = 300
3
+
4
+ from .generate_insight_statements import generate_insight_statements
5
+ from .generate_piechart_with_phase import generate_piechart_with_phase
6
+ from .generate_energy_meter_with_benchmarking import generate_energy_meter_with_benchmarking
7
+ from .generate_daily_barchart_with_temp import generate_daily_barchart_with_temp
8
+ from .generate_period_barchart import generate_period_barchart
9
+
10
+ def generate_components(postgresdb, df_meta_with_value, df_meta_with_value_building, site_obj,
11
+ fontsize=None,
12
+ directory_to_savefile=None):
13
+
14
+ insight_statements = generate_insight_statements(postgresdb, df_meta_with_value,
15
+ asset_group=site_obj.asset_group,
16
+ # fixed_group_to_filter=site_obj.fixed_group_to_filter,
17
+ directory_to_savefile=directory_to_savefile)
18
+
19
+ piechart_with_phase = generate_piechart_with_phase(df_meta_with_value,
20
+ fontsize=fontsize,
21
+ directory_to_savefig=directory_to_savefile)
22
+
23
+ energy_meter_with_benchmarking = generate_energy_meter_with_benchmarking(df_meta_with_value_building, site_obj.floor_size,
24
+ size_in_sqm=site_obj.size_in_sqm,
25
+ conv_mwh_price=site_obj.conv_mwh_price,
26
+ industry=site_obj.industry,
27
+ currency=site_obj.currency,
28
+ fontsize=fontsize,
29
+ directory_to_savefig=directory_to_savefile)
30
+
31
+ daily_barchart_with_temp = generate_daily_barchart_with_temp(df_meta_with_value,
32
+ fontsize=fontsize,
33
+ directory_to_savefig=directory_to_savefile)
34
+
35
+ period_barchart = generate_period_barchart(df_meta_with_value_building,
36
+ fontsize=fontsize,
37
+ directory_to_savefig=directory_to_savefile)
38
+
39
+ # if directory_to_savefile == None:
40
+ components = {
41
+ **insight_statements,
42
+ **piechart_with_phase,
43
+ **energy_meter_with_benchmarking,
44
+ **daily_barchart_with_temp,
45
+ **period_barchart
46
+ }
47
+ return components
@@ -0,0 +1,40 @@
1
+ from pathlib import Path
2
+ import matplotlib.pyplot as plt
3
+ from datetime import date
4
+ import io
5
+
6
+ from .preprocessing_for_barchart import preprocessing_for_barchart
7
+ from .plot_shifted_daily_barchart_with_temp import plot_shifted_daily_barchart_with_temp
8
+
9
+ def generate_daily_barchart_with_temp(df_meta_with_value,
10
+ sr_temp=None,
11
+ fontsize=None, # please note that the other fontsizes haven't been tested yet
12
+ directory_to_savefig=None):
13
+
14
+ df_pivot_working_hours_sorted, period_current = preprocessing_for_barchart(df_meta_with_value)
15
+
16
+ # df_pivot_working_hours_sorted[(True, True)] -= [0.2, 0.1, 0.05, 0.15, 0.08, 0.12, 0.21]
17
+ # df_pivot_working_hours_sorted[(True, False)] -= [0.12, 0.16, 0.08, 0.12, 0.21, 0.05, 0.15]
18
+ # df_pivot_working_hours_sorted[True] = df_pivot_working_hours_sorted[True] *0.5
19
+ # df_pivot_working_hours_sorted[True] -= 0.4*df_pivot_working_hours_sorted[False]
20
+
21
+ # df_pivot_working_hours_sorted_reset = df_pivot_working_hours_sorted.reset_index(drop=True)
22
+ # sr_temp = df_pivot_working_hours_sorted_reset[True].sum(axis=1).abs()
23
+
24
+
25
+ plot_shifted_daily_barchart_with_temp(df_pivot_working_hours_sorted,
26
+ sr_temp=sr_temp,
27
+ fontsize=fontsize)
28
+
29
+ png_name = 'daily_barchart_with_temp.png'
30
+
31
+ if directory_to_savefig == None:
32
+ png_object = io.BytesIO()
33
+ plt.savefig(png_object, format='png', dpi=200)
34
+ plt.close()
35
+ return {png_name: png_object}
36
+ else:
37
+ png_path = directory_to_savefig + png_name
38
+ plt.savefig(png_path, format='png', dpi=200)
39
+ plt.close()
40
+ return {png_name: png_path}
@@ -0,0 +1,71 @@
1
+
2
+ import matplotlib.pyplot as plt
3
+
4
+ from .setup_x_tick_lim import setup_x_tick_lim
5
+ from .setup_y_tick_lim_label_zero_line import setup_y_tick_lim_label_zero_line
6
+ from .plot_temperature_graph import plot_temperature_graph
7
+ from .plot_the_legend import plot_the_legend
8
+
9
+ from mdl.utils_ import get_pos_bot_range_unit_format
10
+ from mdl.utils_ import plot_stacked_barchart
11
+
12
+
13
+ def plot_shifted_daily_barchart_with_temp(df_pivot_working_hours_sorted,
14
+ sr_temp=None,
15
+ tick_range_temp=None,
16
+ fs=None,
17
+ fontsize=None):
18
+
19
+ if fs is None:
20
+ fs = (8, 3.5)
21
+
22
+ fig, ax = plt.subplots(1, 1, figsize=fs)
23
+
24
+ plt.style.use('seaborn-v0_8-white')# set ggplot style
25
+
26
+ # df_pivot_working_hours_sorted_reset_pos, \
27
+ # sr_pivot_working_hours_sorted_reset_bot, \
28
+ # ytick_range = setup_y_label_and_get_pos_bot_range(ax, df_pivot_working_hours_sorted,
29
+ # fontsize=fontsize)
30
+
31
+ df_pivot_working_hours_sorted_reset_pos, \
32
+ sr_pivot_working_hours_sorted_reset_bot, \
33
+ ytick_range, \
34
+ display_unit, \
35
+ formatter = get_pos_bot_range_unit_format(df_pivot_working_hours_sorted,
36
+ pad_pct_above_max=0.3)
37
+
38
+ # plot the positive part with the bottom line shifted
39
+ plot_stacked_barchart(ax, df_pivot_working_hours_sorted_reset_pos,
40
+ bottom=sr_pivot_working_hours_sorted_reset_bot,
41
+ tick_range=ytick_range)
42
+
43
+ # setup x, y tick, limit, label, and zero lines
44
+ setup_x_tick_lim(ax, df_pivot_working_hours_sorted,
45
+ fontsize=fontsize)
46
+
47
+ # set the layout and adjust if the temperature data exists
48
+ legend_bbox_to_anchor = None # default to: (0.5, 0.99)
49
+ tight_layout_rect = (0, 0, 0.93, 1) # intentionally add some padding on the right hand side
50
+ subplots_adjust_left = None
51
+ subplots_adjust_right = 0.785 # 0.92 #
52
+
53
+ if sr_temp is not None:
54
+ if sr_temp.shape[0] > 0:
55
+ plot_temperature_graph(ax, sr_temp,
56
+ fontsize=fontsize,
57
+ tick_range=tick_range_temp)
58
+ # tight_layout_rect=(0, 0, 0.94, 1)
59
+ legend_bbox_to_anchor=(0.37, 0.99)
60
+ # subplots_adjust_left = 0.08
61
+
62
+ setup_y_tick_lim_label_zero_line(ax, ytick_range, display_unit, formatter,
63
+ fontsize=fontsize)
64
+
65
+ # plot the legend
66
+ plot_the_legend(ax, fontsize=fontsize,
67
+ bbox_to_anchor=legend_bbox_to_anchor)
68
+
69
+ fig.tight_layout(rect=tight_layout_rect)
70
+ fig.subplots_adjust(left=subplots_adjust_left,
71
+ right=subplots_adjust_right)
@@ -0,0 +1,35 @@
1
+
2
+ import matplotlib.ticker as ticker
3
+
4
+
5
+ def plot_temperature_graph(ax, sr_temp, fontsize=None, tick_range=None, label=None):
6
+
7
+ if label is None:
8
+ label = 'Temperature'
9
+
10
+ if fontsize is None:
11
+ fontsize = 13
12
+
13
+ # todo: month information can be removed df_occupancy
14
+
15
+ # df_occupancy_cur.reset_index(drop=True, inplace=True)
16
+
17
+ # the right y axis
18
+ ax_r = ax.twinx() # instantiate a second axes that shares the same x-axis
19
+ ax_r.yaxis.tick_left()
20
+ ax_r.yaxis.set_label_position("left")
21
+ ax_r.tick_params(axis='y', left=True, length=2, labelsize=fontsize)
22
+ ax_r.set_ylabel(u'\N{DEGREE SIGN}'+'C', labelpad=5, fontsize=fontsize)
23
+ ax_r.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1f'))
24
+
25
+ if tick_range is None:
26
+ tick_value_o_max = sr_temp.max()
27
+ tick_value_o_min = sr_temp.min()
28
+ tick_value_o_var = tick_value_o_max - tick_value_o_min
29
+ tick_range = [tick_value_o_min - tick_value_o_var*0.5, tick_value_o_max + tick_value_o_var*0.5]
30
+
31
+ ax_r.set_ylim(tick_range)
32
+ ax_r.plot(sr_temp, color= 'k', lw=0.1, ls='dashed', marker=".", ms=6, mec="k", label=label)
33
+ ax_r.legend(loc='upper right', bbox_to_anchor=(0.92, 0.99), fontsize=fontsize, ncol=2)
34
+
35
+
@@ -0,0 +1,26 @@
1
+
2
+
3
+ def plot_the_legend(ax,
4
+ fontsize=None,
5
+ bbox_to_anchor=None):
6
+
7
+ if fontsize is None:
8
+ fontsize = 13
9
+
10
+ if bbox_to_anchor is None:
11
+ bbox_to_anchor=(0.5, 0.99)
12
+
13
+ # plot the legend
14
+ ax.legend()
15
+ legends = ax.get_legend()
16
+ orig_handles = legends.legend_handles[:2]
17
+ # for handle in orig_handles:
18
+ # print(f"{handle.set(ec='k') = }")
19
+
20
+ # adj_handles = [handle.set(ec='k') for handle in orig_handles]
21
+ _ = ax.legend(handles=orig_handles,
22
+ labels=['Total', 'In Hours'],
23
+ loc='upper center',
24
+ bbox_to_anchor=bbox_to_anchor,
25
+ fontsize=fontsize,
26
+ ncol=2)
@@ -0,0 +1,26 @@
1
+
2
+ import matplotlib.ticker as ticker
3
+
4
+ from .generate_day_code import generate_day_code
5
+
6
+ def setup_x_tick_lim(ax, df_pivot_working_hours_sorted,
7
+ fontsize=None):
8
+
9
+ if fontsize is None:
10
+ fontsize = 13
11
+
12
+ day_code_list = generate_day_code(df_pivot_working_hours_sorted)
13
+ df_pivot_working_hours_sorted_reset = df_pivot_working_hours_sorted.reset_index(drop=True)
14
+
15
+ # set up the x-ticks and xlim
16
+ ax.tick_params(axis='x', which='major', pad=8, length=2, labelsize=fontsize)
17
+
18
+ x_tick_pad = 1.5
19
+ top_index = df_pivot_working_hours_sorted_reset.index.min() - x_tick_pad
20
+ bot_index = df_pivot_working_hours_sorted_reset.index.max() + x_tick_pad
21
+ ax.set_xlim([top_index, bot_index])
22
+
23
+ # fixing xticks with matplotlib.ticker "FixedLocator": UserWarning: FixedFormatter should only be used together with FixedLocator
24
+ ticks_loc = ax.get_xticks().tolist()
25
+ ax.xaxis.set_major_locator(ticker.FixedLocator(ticks_loc))
26
+ ax.set_xticklabels(day_code_list, fontsize=fontsize)
@@ -0,0 +1,18 @@
1
+ import pandas as pd
2
+
3
+ from .generate_day_code_list import generate_day_code_list
4
+
5
+
6
+ def generate_day_code(df_pivot_working_hours):
7
+
8
+ datetime_list = list(pd.to_datetime(df_pivot_working_hours.index))
9
+
10
+ day_code_list = generate_day_code_list(datetime_list)
11
+
12
+ day_code_list.insert(0,"") # for making spaces at the start
13
+ day_code_list.insert(0,"")
14
+ # day_code_list.insert(0,"")
15
+ day_code_list.append("") # for making spaces at the end
16
+ day_code_list.append("")
17
+
18
+ return day_code_list
@@ -0,0 +1,38 @@
1
+
2
+
3
+ def generate_day_code_list(datetime_list):
4
+
5
+ previous_day_month = None
6
+ previous_day_year = None
7
+ day_code_list = []
8
+
9
+ len_dates = len(datetime_list)
10
+
11
+ for item in datetime_list:
12
+ weekday_str = item.day_name()[0]
13
+
14
+ # handle the case that for monthly reports, the day numbers will be very close to each other
15
+ if (len_dates < 20) or (weekday_str=='M'):
16
+ day_str = "\n"+str(item.day)
17
+ else:
18
+ day_str = "\n "
19
+
20
+ # the month and year are only added when it starts or changes
21
+
22
+ if item.month == previous_day_month:
23
+ month_str = ""
24
+ else:
25
+ month_str = " "+str(item.strftime("%b"))
26
+ previous_day_month = item.month
27
+
28
+ if item.year == previous_day_year:
29
+ year_str = ''
30
+ else:
31
+ year_str = " "+str(item.year)
32
+ previous_day_year = item.year
33
+
34
+ day_code = weekday_str+day_str+'\n'+month_str+year_str
35
+
36
+ day_code_list.append(day_code)
37
+
38
+ return day_code_list
@@ -0,0 +1,40 @@
1
+
2
+ import matplotlib.ticker as ticker
3
+
4
+ from .get_pos_bot_and_ylim import get_pos_bot_and_ylim
5
+
6
+ def setup_y_label_and_get_pos_bot_range(ax, df_pivot_working_hours_sorted,
7
+ fontsize=None):
8
+
9
+ if fontsize is None:
10
+ fontsize = 13
11
+
12
+ df_pivot_working_hours_sorted_reset = df_pivot_working_hours_sorted.reset_index(drop=True)
13
+
14
+ df_pivot_working_hours_sorted_reset_pos, \
15
+ df_pivot_working_hours_sorted_reset_bot, \
16
+ ytick_range = get_pos_bot_and_ylim(df_pivot_working_hours_sorted_reset,
17
+ pad_pct_above_max = 0.3)
18
+
19
+ max_y_tick = max([abs(y_tick) for y_tick in ytick_range])
20
+
21
+ if max_y_tick > 0.1: # 100 kwh = 0.1 mwh as switching point for unit as kwh or mwh
22
+ ax.set_ylabel("Daily Usage (MWh)", labelpad=14, fontsize=fontsize)
23
+
24
+ #ax_l.set_yticks(np.arange(0, tick_range_e, 0.1))
25
+ ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1f'))
26
+ else:
27
+ df_pivot_working_hours_sorted_reset = df_pivot_working_hours_sorted_reset.mul(1000)
28
+
29
+ # after the change of units, the dfs and limits should be updated
30
+ df_pivot_working_hours_sorted_reset_pos, \
31
+ df_pivot_working_hours_sorted_reset_bot, \
32
+ ytick_range = get_pos_bot_and_ylim(df_pivot_working_hours_sorted_reset,
33
+ pad_pct_above_max = 0.3)
34
+
35
+ ax.set_ylabel("Daily Usage (kWh)", labelpad=14, fontsize=fontsize)
36
+
37
+ #ax_l.set_yticks(np.arange(0, tick_range_e, 0.1))
38
+ ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.0f'))
39
+
40
+ return df_pivot_working_hours_sorted_reset_pos, df_pivot_working_hours_sorted_reset_bot, ytick_range
@@ -0,0 +1,30 @@
1
+
2
+ def get_pos_bot_and_ylim(df_pivot_working_hours_sorted_reset,
3
+ pad_pct_above_max = None):
4
+
5
+ if pad_pct_above_max is None:
6
+ pad_pct_above_max = 0.2
7
+
8
+ # make the index unique for later processing
9
+ df_pivot_working_hours_sorted_reset_pos = df_pivot_working_hours_sorted_reset[False]
10
+ sr_pivot_working_hours_sorted_reset_bot = df_pivot_working_hours_sorted_reset[True].sum(axis=1)
11
+
12
+ # get the maximum and minimum values
13
+ zero_line = 0
14
+ tick_value_e_max = max(zero_line, df_pivot_working_hours_sorted_reset.sum(axis=1).max()) # ensure that the 0 line is still showing
15
+ tick_value_e_min = min(zero_line, sr_pivot_working_hours_sorted_reset_bot.min()) # ensure that the 0 line is still showing
16
+ tick_value_e_var = tick_value_e_max - tick_value_e_min
17
+
18
+ # add padding to the boundary values to make the range
19
+
20
+ if abs(tick_value_e_min) > (tick_value_e_max*0.01): # if the abs value of tick_value_e_min is very small, then set zero as the lowest range
21
+ pad_pct_below_min = 0.05
22
+ else:
23
+ pad_pct_below_min = 0
24
+
25
+ tick_range_e_max = tick_value_e_max + tick_value_e_var*pad_pct_above_max
26
+ tick_range_e_min = tick_value_e_min - tick_value_e_var*pad_pct_below_min
27
+
28
+ ls_ylim = [tick_range_e_min, tick_range_e_max]
29
+
30
+ return df_pivot_working_hours_sorted_reset_pos, sr_pivot_working_hours_sorted_reset_bot, ls_ylim