PageRenderTime 51ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/pyder/pyder.py

https://gitlab.com/NREL-DER-training/PythonDER
Python | 299 lines | 251 code | 22 blank | 26 comment | 6 complexity | ab860aca6cb329e216fe7b150180307e MD5 | raw file
  1. from __future__ import absolute_import
  2. from __future__ import division
  3. from __future__ import print_function
  4. import os
  5. import copy
  6. import pandas as pd
  7. import networkx as nx
  8. from . import visualize
  9. from . import templates
  10. from .graph import create_graph, get_voltage_map_for_graph, get_current_map_for_graph, rescale_layout
  11. def add_solar(**kwargs):
  12. """ Adds solar
  13. Parameters
  14. ==========
  15. input_data : string
  16. file_name with list of nodes to add solar to
  17. input_file_format : string
  18. method type (negative_load or solar)
  19. output_file_name : string
  20. file_name for template to be rendered into
  21. """
  22. input_data = kwargs.pop('input_data')
  23. input_file_format = kwargs.pop('input_file_format')
  24. output_file_name = kwargs.pop('output')
  25. df = pd.read_csv(os.path.abspath(input_data))
  26. write_file_content = templates.render_template('pre_solar.glm')
  27. write_file_content += "\n\n"
  28. if input_file_format == 'negative_load':
  29. for i in range(0, len(df)):
  30. row = df.loc[i]
  31. nominal_voltage = row['nominal_voltage']
  32. parent = row['parent']
  33. phases = row['phases']
  34. name = row['name']
  35. name = "{}_{}".format(name, phases)
  36. phase_list = list(phases.strip('N'))
  37. constant_power_phase = {}
  38. for phase in phase_list:
  39. constant_power_phase[phase] = row['constant_power_{}'.format(phase)]
  40. write_file_content += templates.render_template('meter.glm',
  41. nominal_voltage=nominal_voltage,
  42. name="meter_{}".format(name),
  43. parent=parent,
  44. phases=phases
  45. )
  46. write_file_content += templates.render_template('negative_load.glm',
  47. constant_power_phase=constant_power_phase,
  48. name="load_{}".format(name),
  49. parent="meter_{}".format(name),
  50. phases=phases,
  51. phase_list=phase_list
  52. )
  53. write_file_content += "\n\n"
  54. elif input_file_format == 'solar':
  55. for i in range(0, len(df)):
  56. row = df.loc[i]
  57. name = row['name']
  58. nominal_voltage = row['nominal_voltage']
  59. parent = row['parent']
  60. phases = row['phases']
  61. inverter_generator_status = row['INVERTER_generator_status']
  62. inverter_inverter_efficiency = row['INVERTER_inverter_efficiency']
  63. inverter_power_factor = row['INVERTER_power_factor']
  64. inverter_inverter_type = row['INVERTER_inverter_type']
  65. inverter_rated_power = row['INVERTER_rated_power']
  66. inverter_generator_mode = row['INVERTER_generator_mode']
  67. solar_generator_mode = row['SOLAR_generator_mode']
  68. solar_generator_status = row['SOLAR_generator_status']
  69. solar_panel_efficiency = row['SOLAR_efficiency']
  70. solar_panel_type = row['SOLAR_panel_type']
  71. solar_area = row['SOLAR_area']
  72. meter_name = "meter_{}".format(name)
  73. inverter_parent = meter_name
  74. inverter_name = "inverter_{}".format(name)
  75. solar_name = "solar_{}".format(name)
  76. solar_parent = inverter_name
  77. write_file_content += templates.render_template('meter.glm',
  78. nominal_voltage=nominal_voltage,
  79. name="meter_{}".format(name),
  80. parent=parent,
  81. phases=phases
  82. )
  83. write_file_content += templates.render_template('inverter.glm',
  84. generator_status=inverter_generator_status,
  85. inverter_efficiency=inverter_inverter_efficiency,
  86. phases=phases,
  87. power_factor=inverter_power_factor,
  88. inverter_type=inverter_inverter_type,
  89. parent=inverter_parent,
  90. name=inverter_name,
  91. rated_power=inverter_rated_power,
  92. generator_mode=inverter_generator_mode
  93. )
  94. write_file_content += templates.render_template('solar.glm',
  95. generator_status=solar_generator_status,
  96. efficiency=solar_panel_efficiency,
  97. generator_mode=solar_generator_mode,
  98. parent=solar_parent,
  99. panel_type=solar_panel_type,
  100. area=solar_area,
  101. name=solar_name
  102. )
  103. write_file_content += "\n\n"
  104. with open(output_file_name, 'w') as f:
  105. f.write(write_file_content)
  106. def plot(**kwargs):
  107. """ plots feeder
  108. Parameters
  109. ==========
  110. input_data : string
  111. path to node.csv
  112. output : string
  113. path to graph.pdf
  114. voltage_data : string (optional)
  115. path to voltage_dump.csv
  116. current_data : string (optional)
  117. path to current_dump.csv
  118. phases : string (optional)
  119. string with phases, e.g. 'A', 'ABC'
  120. list of strings phases e.g. ['A', 'B', 'C']
  121. labels : list or bool
  122. False to turn off labels
  123. True to keep all labels
  124. list of labels to add only those labels to the plot
  125. current_labels : bool
  126. True for current values on lines
  127. """
  128. list_filename_phase = []
  129. input_file_name = kwargs.pop('input_data')
  130. output_file_name = kwargs.pop('output')
  131. voltage_file_name = kwargs.pop('voltage_data', None)
  132. current_file_name = kwargs.pop('current_data', None)
  133. phases = kwargs.pop('phases', 'A')
  134. debug = kwargs.pop('debug', False)
  135. labels = kwargs.pop('labels', False)
  136. xshift_labels = kwargs.pop('xshift_labels', None)
  137. yshift_labels = kwargs.pop('yshift_labels', None)
  138. current_labels = kwargs.pop('current_labels', False)
  139. voltage_labels = kwargs.pop('voltage_labels', False)
  140. font_size = kwargs.pop('font_size', 5)
  141. node_size = kwargs.pop('node_size', 100)
  142. nominal_voltage = kwargs.pop('nominal_voltage', 2401.7777)
  143. show_plot = not kwargs.pop('no_show_plot', False)
  144. force_ansi = kwargs.pop('force_ansi', False)
  145. vmin = kwargs.pop('vmin', 0.9)
  146. vmax = kwargs.pop('vmax', 1.1)
  147. node_color = None
  148. edge_color = None
  149. edge_labels = False
  150. maximum_current = None
  151. node_labels = False
  152. G = create_graph(input_file_name)
  153. pos = visualize.calculate_positions(G) # pos = {'node_1': (100, 100)}
  154. pos = rescale_layout(pos, 50)
  155. output_file_name = os.path.abspath(output_file_name) # output_file_name = '/path/to/filename'
  156. filename = os.path.basename(output_file_name) # filename = 'filename'
  157. if phases == 'all':
  158. if voltage_file_name is not None:
  159. maximum_node_color = {}
  160. for phase in ['A', 'B', 'C']:
  161. node_color = get_voltage_map_for_graph(G, voltage_file_name, phase=phase)
  162. for k, v in node_color.items():
  163. try:
  164. maximum_node_color[k] = max(maximum_node_color[k], v)
  165. except KeyError:
  166. maximum_node_color[k] = v
  167. node_color = maximum_node_color
  168. if voltage_labels:
  169. node_labels = True
  170. else:
  171. node_labels = False
  172. # node_color = {'node_1': 2400, ..., 'node123': 2398.02}
  173. if current_file_name is not None:
  174. # edge_color = {('node_1', 'node_2'): 300, ..., }
  175. maximum_edge_color = {}
  176. for phase in ['A', 'B', 'C']:
  177. edge_color, edge_labels = get_current_map_for_graph(G, current_file_name, phase=phase, current_labels=current_labels)
  178. for k, v in edge_color.items():
  179. try:
  180. maximum_edge_color[k] = max(maximum_edge_color[k], v)
  181. except KeyError:
  182. maximum_edge_color[k] = v
  183. edge_color = maximum_edge_color
  184. maximum_current = max([edge_color[key] for key in edge_color])*1.1
  185. filename_phase = filename
  186. folder = os.path.dirname(output_file_name)
  187. output_file_name_phase = os.path.abspath(os.path.join(folder, filename_phase))
  188. visualize.nx_plot(G, pos,
  189. write_file=output_file_name_phase,
  190. xshift_labels=xshift_labels,
  191. yshift_labels=yshift_labels,
  192. vmin=vmin,
  193. vmax=vmax,
  194. node_color=node_color,
  195. edge_color=edge_color,
  196. labels=labels,
  197. edge_labels=edge_labels,
  198. node_labels=node_labels,
  199. cmax=maximum_current,
  200. font_size=font_size,
  201. node_size=node_size,
  202. normalize_node_labels = nominal_voltage,
  203. show_plot = show_plot,
  204. force_ansi=force_ansi
  205. )
  206. list_filename_phase.append(filename_phase)
  207. else:
  208. # Convert 'ABC' to ['A', 'B', 'C']
  209. if isinstance(phases, str):
  210. phases = phases.strip('"').strip("'").strip('`')
  211. phases = list(phases)
  212. for phase in phases:
  213. if voltage_file_name is not None:
  214. node_color = get_voltage_map_for_graph(G, voltage_file_name, phase=phase)
  215. if voltage_labels:
  216. node_labels = True
  217. else:
  218. node_labels = False
  219. # node_color = {'node_1': 2400, ..., 'node123': 2398.02}
  220. if current_file_name is not None:
  221. edge_color, edge_labels = get_current_map_for_graph(G, current_file_name, phase=phase, current_labels=current_labels)
  222. # edge_color = {('node_1', 'node_2'): 300, ..., }
  223. maximum_current = max([edge_color[key] for key in edge_color])*1.1
  224. filename_phase = filename.split('.')[0] + '_phase{}.'.format(phase) + filename.split('.')[1]
  225. folder = os.path.dirname(output_file_name)
  226. output_file_name_phase = os.path.abspath(os.path.join(folder, filename_phase))
  227. visualize.nx_plot(G, pos,
  228. write_file=output_file_name_phase,
  229. xshift_labels=xshift_labels,
  230. yshift_labels=yshift_labels,
  231. vmin=vmin,
  232. vmax=vmax,
  233. node_color=node_color,
  234. edge_color=edge_color,
  235. labels=labels,
  236. edge_labels=edge_labels,
  237. node_labels=node_labels,
  238. cmax=maximum_current,
  239. font_size=font_size,
  240. node_size=node_size,
  241. normalize_node_labels = nominal_voltage,
  242. show_plot = show_plot,
  243. force_ansi = force_ansi,
  244. )
  245. list_filename_phase.append(filename_phase)
  246. return list_filename_phase