NREL-reV 0.14.2__py3-none-any.whl → 0.14.5__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.
reV/utilities/__init__.py CHANGED
@@ -1,6 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  """reV utilities."""
3
- from enum import Enum
3
+ import ast
4
+ import inspect
5
+ from enum import Enum, EnumMeta
4
6
 
5
7
  import PySAM
6
8
  from rex.utilities.loggers import log_versions as rex_log_versions
@@ -8,7 +10,50 @@ from rex.utilities.loggers import log_versions as rex_log_versions
8
10
  from reV.version import __version__
9
11
 
10
12
 
11
- class FieldEnum(str, Enum):
13
+ class _DocstringEnumMeta(EnumMeta):
14
+ """Metaclass to assign docstrings to Enum members"""
15
+
16
+ def __new__(metacls, clsname, bases, clsdict):
17
+ cls = super().__new__(metacls, clsname, bases, clsdict)
18
+
19
+ try:
20
+ source = inspect.getsource(cls)
21
+ except TypeError:
22
+ return cls # source not available (e.g., in interactive shell)
23
+
24
+ module = ast.parse(source)
25
+
26
+ for node in ast.iter_child_nodes(module):
27
+ if isinstance(node, ast.ClassDef) and node.name == cls.__name__:
28
+ prev = None
29
+ for body_item in node.body:
30
+ if isinstance(body_item, ast.Assign):
31
+ target = body_item.targets[0]
32
+ if isinstance(target, ast.Name):
33
+ name = target.id
34
+ prev = body_item
35
+ elif (isinstance(body_item, ast.Expr)
36
+ and isinstance(body_item.value, ast.Constant)):
37
+ if prev:
38
+ doc = body_item.value.s
39
+ member = cls.__members__.get(name)
40
+ if member:
41
+ member._description = (doc.strip()
42
+ .replace("\n ", " "))
43
+ prev = None
44
+ return cls
45
+
46
+
47
+ class DocEnum(Enum, metaclass=_DocstringEnumMeta):
48
+ """Base Enum class with docstring support"""
49
+
50
+ @property
51
+ def description(self):
52
+ """Description of enum member pulled from docstring"""
53
+ return getattr(self, '_description', None)
54
+
55
+
56
+ class FieldEnum(str, DocEnum):
12
57
  """Base Field enum with some mapping methods."""
13
58
 
14
59
  @classmethod
@@ -118,89 +163,373 @@ class SupplyCurveField(FieldEnum):
118
163
 
119
164
  Not all of these columns are guaranteed in every supply-curve like
120
165
  output (e.g. "convex_hull_area" is a bespoke-only output).
166
+
167
+ The docstrings for each field are used as a description when
168
+ exporting metadata information about supply curve columns. See
169
+ TBA for details.
121
170
  """
122
171
 
172
+ # ############## #
173
+ # Shared outputs #
174
+ # ############## #
175
+
123
176
  SC_GID = "sc_gid"
177
+ """Supply curve GID (Specific to this particular supply curve output)"""
178
+
124
179
  LATITUDE = "latitude"
180
+ """Centroid latitude of the supply curve grid-cell"""
181
+
125
182
  LONGITUDE = "longitude"
183
+ """Centroid longitude of the supply curve grid-cell"""
184
+
126
185
  COUNTRY = "country"
186
+ """Country of the supply curve grid-cell"""
187
+
127
188
  STATE = "state"
189
+ """State of the supply curve grid-cell"""
190
+
128
191
  COUNTY = "county"
192
+ """County of the supply curve grid-cell"""
193
+
129
194
  ELEVATION = "elevation_m"
195
+ """Mean elevation of the supply curve grid-cell"""
196
+
130
197
  TIMEZONE = "timezone"
198
+ """
199
+ Timezone of supply curve grid-cell, expressed as an hourly offset from UTC
200
+ """
201
+
131
202
  SC_POINT_GID = "sc_point_gid"
203
+ """
204
+ Unique ID that can be used to match supply curve grid-cells across reV
205
+ supply curves at the same resolution
206
+ """
207
+
132
208
  SC_ROW_IND = "sc_row_ind"
209
+ """Supply curve grid-cell row ID (Invariant across supply curves)"""
210
+
133
211
  SC_COL_IND = "sc_col_ind"
212
+ """Supply curve grid-cell column ID (Invariant across supply curves)"""
213
+
134
214
  SOURCE_GIDS = "source_gids"
215
+
135
216
  RES_GIDS = "res_gids"
217
+ """List of resource GID's mapped to this supply curve grid-cells"""
218
+
136
219
  GEN_GIDS = "gen_gids"
220
+ """List of generation GID's mapped to this supply curve point"""
221
+
137
222
  GID_COUNTS = "gid_counts"
223
+ """
224
+ Number of high-resolution cells corresponding to each generation GID
225
+ for this supply curve point
226
+ """
227
+
138
228
  N_GIDS = "n_gids"
229
+ """
230
+ Total number of not fully excluded pixels associated with the available
231
+ resource/generation gids
232
+ """
233
+
139
234
  ZONE_ID = "zone_id"
235
+ """Zone ID of the supply curve grid-cell, if applicable. Defaults to 1."""
236
+
140
237
  MEAN_RES = "resource"
238
+ """
239
+ Mean resource (e.g. wind speed, gha, temperature, etc.) across the supply
240
+ curve grid-cell
241
+ """
242
+
141
243
  MEAN_CF_AC = "capacity_factor_ac"
244
+ """Mean capacity factor (AC) across supply curve grid-cell"""
245
+
142
246
  MEAN_CF_DC = "capacity_factor_dc"
247
+ """Mean capacity factor (DC) across supply curve grid-cell"""
248
+
249
+ WAKE_LOSSES = "losses_wakes_pct"
250
+ """Mean wake losses across supply curve grid-cell"""
251
+
143
252
  MEAN_LCOE = "lcoe_site_usd_per_mwh"
253
+ """
254
+ Mean power plant levelized cost of energy across supply curve grid-cell
255
+ """
256
+
144
257
  CAPACITY_AC_MW = "capacity_ac_mw"
258
+ """
259
+ Capacity of system based on area_sq_km * AC capacity density assumption
260
+ """
261
+
145
262
  CAPACITY_DC_MW = "capacity_dc_mw"
263
+ """
264
+ Capacity of system based on area_sq_km * DC capacity density assumption
265
+ """
266
+
146
267
  OFFSHORE = "offshore"
268
+ """
269
+ Flag value indicating if the supply curve grid-cell is offshore (1)
270
+ or not (0)
271
+ """
272
+
147
273
  AREA_SQ_KM = "area_developable_sq_km"
274
+ """Developable area after spatial exclusions applied"""
275
+
148
276
  MEAN_FRICTION = "friction_site"
277
+
149
278
  MEAN_LCOE_FRICTION = "lcoe_friction_usd_per_mwh"
279
+
150
280
  RAW_LCOE = "lcoe_raw_usd_per_mwh"
281
+ """
282
+ Mean power plant levelized cost of energy across supply curve grid-cell
283
+ without any multipliers or economies of scale applied
284
+ """
285
+
151
286
  EOS_MULT = "multiplier_cc_eos"
287
+ """
288
+ Capital cost economies of Scale (EOS) multiplier value (defaults to `1`
289
+ if no EOS curve was specified)
290
+ """
291
+
152
292
  FIXED_EOS_MULT = "multiplier_foc_eos"
293
+ """
294
+ Fixed operating cost economies of Scale (EOS) multiplier value (defaults
295
+ to `1` if no EOS curve was specified)
296
+ """
297
+
153
298
  VAR_EOS_MULT = "multiplier_voc_eos"
299
+ """
300
+ Variable operating cost economies of Scale (EOS) multiplier value
301
+ (defaults to `1` if no EOS curve was specified)
302
+ """
303
+
154
304
  REG_MULT = "multiplier_cc_regional"
305
+ """
306
+ Regional capital cost multiplier to capture taxes, labor, land lease
307
+ regional differences
308
+ """
309
+
155
310
  SC_POINT_ANNUAL_ENERGY_MWH = "annual_energy_site_mwh"
311
+ """
312
+ Total annual energy for supply curve grid-cell (computed using
313
+ "capacity_ac_mw" and "capacity_factor_ac")
314
+ """
315
+
156
316
  COST_BASE_CC_USD_PER_AC_MW = "cost_base_cc_usd_per_ac_mw"
317
+ """
318
+ Included-area weighted capital cost for supply curve grid-cell with no
319
+ multipliers or economies of scale applied (defaults to `None` for
320
+ non-LCOE runs)
321
+ """
322
+
157
323
  COST_SITE_CC_USD_PER_AC_MW = "cost_site_cc_usd_per_ac_mw"
324
+ """
325
+ Included-area weighted capital cost for supply curve grid-cell
326
+ (defaults to `None` for non-LCOE runs)
327
+ """
328
+
158
329
  COST_BASE_FOC_USD_PER_AC_MW = "cost_base_foc_usd_per_ac_mw"
330
+ """
331
+ Included-area weighted fixed operating cost for supply curve grid-cell
332
+ with no multipliers or economies of scale applied (defaults to `None` for
333
+ non-LCOE runs)
334
+ """
335
+
159
336
  COST_SITE_FOC_USD_PER_AC_MW = "cost_site_foc_usd_per_ac_mw"
337
+ """
338
+ Included-area weighted fixed operating cost for supply curve grid-cell
339
+ (defaults to `None` for non-LCOE runs)
340
+ """
341
+
160
342
  COST_BASE_VOC_USD_PER_AC_MWH = "cost_base_voc_usd_per_ac_mwh"
343
+ """
344
+ Included-area weighted variable operating cost for supply curve grid-cell
345
+ with no multipliers or economies of scale applied (defaults to `None` for
346
+ non-LCOE runs)
347
+ """
348
+
161
349
  COST_SITE_VOC_USD_PER_AC_MWH = "cost_site_voc_usd_per_ac_mwh"
350
+ """
351
+ Included-area weighted variable operating cost for supply curve grid-cell
352
+ (defaults to `None` for non-LCOE runs)
353
+ """
354
+
162
355
  FIXED_CHARGE_RATE = "fixed_charge_rate"
356
+ """
357
+ Fixed charge rate used for LCOE computation
358
+ (defaults to `None` for non-LCOE runs)
359
+ """
360
+
361
+ # ############### #
362
+ # Bespoke outputs #
363
+ # ############### #
163
364
 
164
- # Bespoke outputs
165
365
  POSSIBLE_X_COORDS = "possible_x_coords"
366
+ """
367
+ List of turbine x coordinates considered during layout optimization
368
+ (in meters relative to grid-cell)
369
+ """
370
+
166
371
  POSSIBLE_Y_COORDS = "possible_y_coords"
372
+ """
373
+ List of turbine y coordinates considered during layout optimization
374
+ (in meters relative to grid-cell)
375
+ """
376
+
167
377
  TURBINE_X_COORDS = "turbine_x_coords"
378
+ """
379
+ List of optimized layout turbine x coordinates
380
+ (in meters relative to grid-cell)
381
+ """
382
+
168
383
  TURBINE_Y_COORDS = "turbine_y_coords"
384
+ """
385
+ List of optimized layout turbine y coordinates
386
+ (in meters relative to grid-cell)
387
+ """
388
+
169
389
  N_TURBINES = "n_turbines"
390
+ """
391
+ Number of turbines in the optimized layout for this supply curve
392
+ grid-cell
393
+ """
394
+
170
395
  INCLUDED_AREA = "area_included_sq_km"
396
+ """Area available for wind turbine layout optimization"""
397
+
171
398
  INCLUDED_AREA_CAPACITY_DENSITY = (
172
399
  "capacity_density_included_area_mw_per_km2"
173
400
  )
401
+ """
402
+ Capacity density of the optimized wind plant layout defined using the
403
+ area available after removing the exclusions
404
+ """
405
+
174
406
  CONVEX_HULL_AREA = "area_convex_hull_sq_km"
407
+ """Area of the convex hull of the optimized wind plant layout"""
408
+
175
409
  CONVEX_HULL_CAPACITY_DENSITY = "capacity_density_convex_hull_mw_per_km2"
410
+ """
411
+ Capacity density of the optimized wind plant layout defined using the
412
+ convex hull area of the layout
413
+ """
414
+
176
415
  FULL_CELL_CAPACITY_DENSITY = "capacity_density_full_cell_mw_per_km2"
416
+ """
417
+ Capacity density of the optimized wind plant layout defined using the full
418
+ non-excluded area of the supply curve grid-cell
419
+ """
420
+
177
421
  BESPOKE_AEP = "optimized_plant_aep"
422
+ """
423
+ Annual energy production of the optimized wind plant layout computed using
424
+ wind speed/direction joint probability distribution (as opposed to
425
+ historical weather data)
426
+ """
427
+
178
428
  BESPOKE_OBJECTIVE = "optimized_plant_objective"
429
+ """
430
+ Objective function value of the optimized wind plant layout. This is
431
+ typically the LCOE computed using wind speed/direction joint probability
432
+ distribution (as opposed to historical weather data)
433
+ """
434
+
179
435
  BESPOKE_CAPITAL_COST = "optimized_plant_capital_cost"
436
+ """Capital cost of the optimized wind plant layout"""
437
+
180
438
  BESPOKE_FIXED_OPERATING_COST = "optimized_plant_fixed_operating_cost"
439
+ """Annual fixed operating cost of the optimized wind plant layout"""
440
+
181
441
  BESPOKE_VARIABLE_OPERATING_COST = "optimized_plant_variable_operating_cost"
442
+ """Variable operating cost of the optimized wind plant layout"""
443
+
182
444
  BESPOKE_BALANCE_OF_SYSTEM_COST = "optimized_plant_balance_of_system_cost"
445
+ """Balance of system cost of the optimized wind plant layout"""
446
+
447
+ # #################### #
448
+ # Transmission outputs #
449
+ # #################### #
183
450
 
184
- # Transmission outputs
185
451
  TRANS_GID = "trans_gid"
452
+ """Transmission connection feature GID"""
453
+
186
454
  TRANS_TYPE = "trans_type"
455
+ """Transmission connection feature type"""
456
+
187
457
  TOTAL_LCOE_FRICTION = "lcoe_total_friction_usd_per_mwh"
188
458
  TRANS_CAPACITY = "trans_capacity"
459
+
189
460
  DIST_SPUR_KM = "dist_spur_km"
461
+ """
462
+ Distance between the grid-cell centroid and cheapest available electrical
463
+ substation. Used in lcot calculations.
464
+ """
465
+
190
466
  DIST_EXPORT_KM = "dist_export_km"
467
+ """Length of the offshore export cable"""
468
+
191
469
  REINFORCEMENT_DIST_KM = "dist_reinforcement_km"
192
- TIE_LINE_COST_PER_MW = "cost_spur_usd_per_mw"
193
- CONNECTION_COST_PER_MW = "cost_poi_usd_per_mw"
194
- EXPORT_COST_PER_MW = "cost_export_usd_per_mw"
195
- REINFORCEMENT_COST_PER_MW = "cost_reinforcement_usd_per_mw"
196
- TOTAL_TRANS_CAP_COST_PER_MW = "cost_total_trans_usd_per_mw"
470
+ """
471
+ Distance between the connected substation and nearest regional load
472
+ center. Used in lcot calculations.
473
+ """
474
+
475
+ TIE_LINE_COST_PER_MW = "cost_spur_usd_per_mw_ac"
476
+ """
477
+ Cost of the spur line used to connect the grid-cell centroid with the
478
+ cheapest available electrical substation
479
+ """
480
+
481
+ CONNECTION_COST_PER_MW = "cost_poi_usd_per_mw_ac"
482
+ """Substation connection/upgrade/installation cost"""
483
+
484
+ EXPORT_COST_PER_MW = "cost_export_usd_per_mw_ac"
485
+ """Cost of the offshore export cable """
486
+
487
+ REINFORCEMENT_COST_PER_MW = "cost_reinforcement_usd_per_mw_ac"
488
+ """Non-levelized reinforcement transmission capital costs"""
489
+
490
+ TOTAL_TRANS_CAP_COST_PER_MW = "cost_total_trans_usd_per_mw_ac"
491
+ """
492
+ Non-levelized spur and point-of-interconnection transmission capital costs
493
+ """
494
+
197
495
  LCOT = "lcot_usd_per_mwh"
496
+ """
497
+ Levelized cost of transmission. Includes spur-transmission,
498
+ point-of-interconnection, and reinforcement costs.
499
+ """
500
+
198
501
  TOTAL_LCOE = "lcoe_all_in_usd_per_mwh"
502
+ """All-in LCOE. Includes site-lcoe + lcot"""
503
+
199
504
  N_PARALLEL_TRANS = "count_num_parallel_trans"
505
+ """
506
+ Number of parallel transmission lines connecting the grid-cell centroid
507
+ with the cheapest available electrical substation
508
+ """
509
+
200
510
  POI_LAT = "latitude_poi"
511
+ """
512
+ Latitude of the cheapest available electrical substation for the supply
513
+ curve grid-cell
514
+ """
515
+
201
516
  POI_LON = "longitude_poi"
517
+ """
518
+ Longitude of the cheapest available electrical substation for the supply
519
+ curve grid-cell
520
+ """
521
+
202
522
  REINFORCEMENT_POI_LAT = "latitude_reinforcement_poi"
523
+ """
524
+ Latitude of the nearest regional load center for the supply curve
525
+ grid-cell
526
+ """
527
+
203
528
  REINFORCEMENT_POI_LON = "longitude_reinforcement_poi"
529
+ """
530
+ Longitude of the nearest regional load center for the supply curve
531
+ grid-cell
532
+ """
204
533
 
205
534
  @classmethod
206
535
  def map_from_legacy(cls):
@@ -221,6 +550,11 @@ class SupplyCurveField(FieldEnum):
221
550
 
222
551
  return legacy_map
223
552
 
553
+ @property
554
+ def units(self):
555
+ """Units of the supply curve column, or ``"N/A"`` if not applicable"""
556
+ return _SC_UNITS.get(self, "N/A")
557
+
224
558
 
225
559
  class _LegacySCAliases(Enum):
226
560
  """Legacy supply curve column names.
@@ -242,10 +576,13 @@ class _LegacySCAliases(Enum):
242
576
  TRANS_CAPACITY = "avail_cap"
243
577
  DIST_SPUR_KM = "dist_km"
244
578
  REINFORCEMENT_DIST_KM = "reinforcement_dist_km"
245
- TIE_LINE_COST_PER_MW = "tie_line_cost_per_mw"
246
- CONNECTION_COST_PER_MW = "connection_cost_per_mw"
247
- REINFORCEMENT_COST_PER_MW = "reinforcement_cost_per_mw"
248
- TOTAL_TRANS_CAP_COST_PER_MW = "trans_cap_cost_per_mw"
579
+ TIE_LINE_COST_PER_MW = "tie_line_cost_per_mw", "cost_spur_usd_per_mw"
580
+ CONNECTION_COST_PER_MW = "connection_cost_per_mw", "cost_poi_usd_per_mw"
581
+ EXPORT_COST_PER_MW = "cost_export_usd_per_mw"
582
+ REINFORCEMENT_COST_PER_MW = ("reinforcement_cost_per_mw",
583
+ "cost_reinforcement_usd_per_mw")
584
+ TOTAL_TRANS_CAP_COST_PER_MW = ("trans_cap_cost_per_mw",
585
+ "cost_total_trans_usd_per_mw")
249
586
  LCOT = "lcot"
250
587
  TOTAL_LCOE = "total_lcoe"
251
588
  TOTAL_LCOE_FRICTION = "total_lcoe_friction"
@@ -331,3 +668,55 @@ def log_versions(logger):
331
668
  logger.info("Running with reV version {}".format(__version__))
332
669
  rex_log_versions(logger)
333
670
  logger.debug("- PySAM version {}".format(PySAM.__version__))
671
+
672
+
673
+ _SC_UNITS = {
674
+ SupplyCurveField.ELEVATION: "m",
675
+ SupplyCurveField.LATITUDE: "degrees",
676
+ SupplyCurveField.LONGITUDE: "degrees",
677
+
678
+ SupplyCurveField.AREA_SQ_KM: "km2",
679
+ SupplyCurveField.CAPACITY_AC_MW: "MWac",
680
+ SupplyCurveField.CAPACITY_DC_MW: "MWdc",
681
+ SupplyCurveField.MEAN_CF_AC: "ratio",
682
+ SupplyCurveField.MEAN_CF_DC: "ratio",
683
+ SupplyCurveField.WAKE_LOSSES: "%",
684
+ SupplyCurveField.MEAN_LCOE: "$/MWh",
685
+ SupplyCurveField.RAW_LCOE: "$/MWh",
686
+ SupplyCurveField.SC_POINT_ANNUAL_ENERGY_MWH: "MWh",
687
+ SupplyCurveField.COST_BASE_CC_USD_PER_AC_MW: "$/MWac",
688
+ SupplyCurveField.COST_SITE_CC_USD_PER_AC_MW: "$/MWac",
689
+ SupplyCurveField.COST_BASE_FOC_USD_PER_AC_MW: "$/MWac",
690
+ SupplyCurveField.COST_SITE_FOC_USD_PER_AC_MW: "$/MWac",
691
+ SupplyCurveField.COST_BASE_VOC_USD_PER_AC_MWH: "$/MWh",
692
+ SupplyCurveField.COST_SITE_VOC_USD_PER_AC_MWH: "$/MWh",
693
+
694
+ SupplyCurveField.BESPOKE_AEP: "MWh",
695
+ SupplyCurveField.BESPOKE_CAPITAL_COST: "$",
696
+ SupplyCurveField.BESPOKE_FIXED_OPERATING_COST: "$/year",
697
+ SupplyCurveField.BESPOKE_VARIABLE_OPERATING_COST: "$/kWh",
698
+ SupplyCurveField.BESPOKE_BALANCE_OF_SYSTEM_COST: "$",
699
+ SupplyCurveField.INCLUDED_AREA: "km2",
700
+ SupplyCurveField.INCLUDED_AREA_CAPACITY_DENSITY: "MW/km2",
701
+ SupplyCurveField.CONVEX_HULL_AREA: "km2",
702
+ SupplyCurveField.CONVEX_HULL_CAPACITY_DENSITY: "MW/km2",
703
+ SupplyCurveField.FULL_CELL_CAPACITY_DENSITY: "MW/km2",
704
+
705
+ SupplyCurveField.LCOT: "$/MWh",
706
+ SupplyCurveField.MEAN_RES: "varies",
707
+ SupplyCurveField.REINFORCEMENT_COST_PER_MW: "$/MWac",
708
+ SupplyCurveField.REINFORCEMENT_DIST_KM: "km",
709
+ SupplyCurveField.TOTAL_LCOE: "$/MWh",
710
+ SupplyCurveField.TOTAL_TRANS_CAP_COST_PER_MW: "$/MWac",
711
+ SupplyCurveField.DIST_SPUR_KM: "km",
712
+ SupplyCurveField.DIST_EXPORT_KM: "km",
713
+ SupplyCurveField.TIE_LINE_COST_PER_MW: "$/MWac",
714
+ SupplyCurveField.CONNECTION_COST_PER_MW: "$/MWac",
715
+ SupplyCurveField.EXPORT_COST_PER_MW: "$/MWac",
716
+
717
+ SupplyCurveField.POI_LAT: "degrees",
718
+ SupplyCurveField.POI_LON: "degrees",
719
+ SupplyCurveField.REINFORCEMENT_POI_LAT: "degrees",
720
+ SupplyCurveField.REINFORCEMENT_POI_LON: "degrees",
721
+
722
+ }
@@ -5,10 +5,11 @@ General CLI utility functions.
5
5
  import logging
6
6
  from warnings import warn
7
7
 
8
+ import pandas as pd
8
9
  from gaps.pipeline import Status
9
10
  from rex.utilities.loggers import init_mult
10
11
 
11
- from reV.utilities import ModuleName
12
+ from reV.utilities import ModuleName, SupplyCurveField
12
13
  from reV.utilities.exceptions import ConfigWarning, PipelineError
13
14
 
14
15
 
@@ -115,3 +116,44 @@ def parse_from_pipeline(config, out_dir, config_key, target_modules):
115
116
  .format(config_key, val[0]))
116
117
 
117
118
  return config
119
+
120
+
121
+ def compile_descriptions(cols=None):
122
+ """Compile a meta table with reV column descriptions.
123
+
124
+ Descriptions are pulled from the
125
+ :class:`~reV.utilities.SupplyCurveField` enum, which
126
+ contains the known reV supply curve field descriptions. Columns
127
+ which do not have a known description are excluded from the
128
+ output.
129
+
130
+ Parameters
131
+ ----------
132
+ cols : iterable, optional
133
+ Optional iterable of column names to include in the output.
134
+ By default, ``None``, which compiles all known reV supply curve
135
+ field descriptions.
136
+
137
+ Returns
138
+ -------
139
+ pd.DataFrame
140
+ Pandas DataFrame containing column names, corresponding units,
141
+ and descriptions for each column. Only columns that have a known
142
+ description are included in the output.
143
+ """
144
+ if not cols:
145
+ cols = [c.value for c in SupplyCurveField]
146
+
147
+ data = []
148
+ for col in cols:
149
+ try:
150
+ scf = SupplyCurveField(col)
151
+ except ValueError:
152
+ continue
153
+
154
+ if scf.description is None:
155
+ continue
156
+
157
+ data.append((str(scf), scf.units, scf.description))
158
+
159
+ return pd.DataFrame(data, columns=["reV Column", "Units", "Description"])
reV/version.py CHANGED
@@ -2,4 +2,4 @@
2
2
  reV Version number
3
3
  """
4
4
 
5
- __version__ = "0.14.2"
5
+ __version__ = "0.14.5"