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