hestia-earth-models 0.62.1__py3-none-any.whl → 0.62.3__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.

Potentially problematic release.


This version of hestia-earth-models might be problematic. Click here for more details.

Files changed (56) hide show
  1. hestia_earth/models/agribalyse2016/fuelElectricity.py +1 -1
  2. hestia_earth/models/cycle/animal/input/hestiaAggregatedData.py +1 -1
  3. hestia_earth/models/cycle/coldCarcassWeightPerHead.py +4 -2
  4. hestia_earth/models/cycle/coldDressedCarcassWeightPerHead.py +2 -2
  5. hestia_earth/models/cycle/concentrateFeed.py +3 -3
  6. hestia_earth/models/cycle/cycleDuration.py +7 -2
  7. hestia_earth/models/cycle/feedConversionRatio/feedConversionRatioNitrogen.py +2 -1
  8. hestia_earth/models/cycle/input/hestiaAggregatedData.py +1 -1
  9. hestia_earth/models/cycle/product/price.py +5 -1
  10. hestia_earth/models/cycle/product/revenue.py +6 -7
  11. hestia_earth/models/cycle/readyToCookWeightPerHead.py +2 -2
  12. hestia_earth/models/ecoinventV3/__init__.py +25 -52
  13. hestia_earth/models/ecoinventV3/utils.py +40 -0
  14. hestia_earth/models/ecoinventV3AndEmberClimate/__init__.py +92 -91
  15. hestia_earth/models/ecoinventV3AndEmberClimate/utils.py +15 -105
  16. hestia_earth/models/faostat2018/product/price.py +1 -2
  17. hestia_earth/models/geospatialDatabase/croppingIntensity.py +2 -1
  18. hestia_earth/models/geospatialDatabase/utils.py +1 -1
  19. hestia_earth/models/ipcc2019/aboveGroundCropResidueTotal.py +15 -10
  20. hestia_earth/models/ipcc2019/animal/pastureGrass.py +50 -40
  21. hestia_earth/models/ipcc2019/belowGroundCropResidue.py +16 -11
  22. hestia_earth/models/ipcc2019/carbonContent.py +1 -1
  23. hestia_earth/models/ipcc2019/croppingDuration.py +2 -2
  24. hestia_earth/models/ipcc2019/ligninContent.py +1 -1
  25. hestia_earth/models/ipcc2019/nitrogenContent.py +1 -1
  26. hestia_earth/models/ipcc2019/organicCarbonPerHa.py +3 -3
  27. hestia_earth/models/ipcc2019/organicCarbonPerHa_tier_1_utils.py +5 -5
  28. hestia_earth/models/ipcc2019/organicCarbonPerHa_tier_2_utils.py +217 -48
  29. hestia_earth/models/ipcc2019/organicCarbonPerHa_utils.py +2 -6
  30. hestia_earth/models/ipcc2019/pastureGrass.py +43 -41
  31. hestia_earth/models/ipcc2019/pastureGrass_utils.py +63 -109
  32. hestia_earth/models/koble2014/cropResidueManagement.py +1 -1
  33. hestia_earth/models/linkedImpactAssessment/emissions.py +15 -14
  34. hestia_earth/models/mocking/search-results.json +249 -257
  35. hestia_earth/models/pooreNemecek2018/longFallowPeriod.py +1 -1
  36. hestia_earth/models/preload_requests.py +1 -1
  37. hestia_earth/models/requirements.py +6 -6
  38. hestia_earth/models/site/organicCarbonPerHa.py +1 -1
  39. hestia_earth/models/utils/__init__.py +1 -1
  40. hestia_earth/models/utils/blank_node.py +52 -9
  41. hestia_earth/models/utils/cycle.py +12 -12
  42. hestia_earth/models/utils/measurement.py +3 -3
  43. hestia_earth/models/utils/property.py +6 -6
  44. hestia_earth/models/utils/term.py +2 -1
  45. hestia_earth/models/version.py +1 -1
  46. {hestia_earth_models-0.62.1.dist-info → hestia_earth_models-0.62.3.dist-info}/METADATA +12 -12
  47. {hestia_earth_models-0.62.1.dist-info → hestia_earth_models-0.62.3.dist-info}/RECORD +56 -55
  48. {hestia_earth_models-0.62.1.dist-info → hestia_earth_models-0.62.3.dist-info}/WHEEL +1 -1
  49. tests/models/cycle/product/test_revenue.py +0 -3
  50. tests/models/cycle/test_cycleDuration.py +1 -1
  51. tests/models/ipcc2019/test_organicCarbonPerHa.py +9 -20
  52. tests/models/ipcc2019/test_organicCarbonPerHa_tier_2_utils.py +0 -8
  53. tests/models/test_ecoinventV3.py +12 -0
  54. tests/models/test_ecoinventV3AndEmberClimate.py +5 -72
  55. {hestia_earth_models-0.62.1.dist-info → hestia_earth_models-0.62.3.dist-info}/LICENSE +0 -0
  56. {hestia_earth_models-0.62.1.dist-info → hestia_earth_models-0.62.3.dist-info}/top_level.txt +0 -0
@@ -45,7 +45,7 @@ def _should_run(cycle: dict):
45
45
  product = next((p for p in cycle.get('products', []) if _should_run_product(p)), None)
46
46
 
47
47
  logRequirements(cycle, model=MODEL, term=TERM_ID,
48
- product_id=(product or {}).get('term', {}).get('@id'))
48
+ crop_product_id=(product or {}).get('term', {}).get('@id'))
49
49
 
50
50
  should_run = all([product])
51
51
  logShouldRun(cycle, MODEL, TERM_ID, should_run)
@@ -10,7 +10,7 @@ from .mocking import RESULTS_PATH, enable_mock as _mock
10
10
 
11
11
  def enable_preload(filepath: str = RESULTS_PATH, node: dict = None):
12
12
  """
13
- Prefetch calls to Hestia API in a local file.
13
+ Prefetch calls to HESTIA API in a local file.
14
14
 
15
15
  Parameters
16
16
  ----------
@@ -353,7 +353,7 @@ def get_single_returns(model: str, key: str):
353
353
  Returns
354
354
  -------
355
355
  list
356
- The returned data following Hestia's schema.
356
+ The returned data following HESTIA's schema.
357
357
  """
358
358
  returns = _model_returns({'model': model, 'key': key})
359
359
  return_type = list(returns.keys())[0] if returns else None
@@ -368,7 +368,7 @@ def list_models(
368
368
  termType: str = None, tier: str = None, productTermId: str = None, productTermType: str = None, siteType: str = None
369
369
  ) -> list:
370
370
  """
371
- Return list of models present in Hestia.
371
+ Return list of models present in HESTIA.
372
372
 
373
373
  Parameters
374
374
  ----------
@@ -410,7 +410,7 @@ def get_models(termId: str):
410
410
  Returns
411
411
  -------
412
412
  list
413
- The list of modelscurrently in Hestia that are matching this Term (as `{"model": model, "key": key}`).
413
+ The list of modelscurrently in HESTIA that are matching this Term (as `{"model": model, "key": key}`).
414
414
  """
415
415
  return list(filter(lambda m: m.get('key') == termId, ALL_MODELS))
416
416
 
@@ -420,7 +420,7 @@ def get_all(
420
420
  termType: str = None, tier: str = None, productTermId: str = None, productTermType: str = None, siteType: str = None
421
421
  ) -> list:
422
422
  """
423
- Get the requirements to run all the models in Hestia.
423
+ Get the requirements to run all the models in HESTIA.
424
424
 
425
425
  Parameters
426
426
  ----------
@@ -441,7 +441,7 @@ def get_all(
441
441
  Returns
442
442
  -------
443
443
  list
444
- The data requirements following Hestia's schema as multiple nodes.
444
+ The data requirements following HESTIA's schema as multiple nodes.
445
445
  """
446
446
  models = list_models(
447
447
  termType=termType, tier=tier, productTermId=productTermId, productTermType=productTermType, siteType=siteType
@@ -469,7 +469,7 @@ def get_single(model: str, key: str) -> list:
469
469
  Returns
470
470
  -------
471
471
  list
472
- The data requirements following Hestia's schema as multiple nodes.
472
+ The data requirements following HESTIA's schema as multiple nodes.
473
473
  """
474
474
  model = {'model': model, 'key': key}
475
475
  linked_models = _recursive_linked_models(model)
@@ -278,7 +278,7 @@ def _rescale_soc_value(
278
278
  """
279
279
  Rescale an SOC measurement value from a source depth interval to a target depth interval.
280
280
 
281
- Depths are converted from centimetres (Hestia schema) to metres for use in `cdf` function.
281
+ Depths are converted from centimetres (HESTIA schema) to metres for use in `cdf` function.
282
282
 
283
283
  Parameters
284
284
  ----------
@@ -61,7 +61,7 @@ def _filter_list_term_unit(values: list, unit: Any):
61
61
 
62
62
  def is_from_model(node: dict) -> bool:
63
63
  """
64
- Check if the Blank Node came from one of the Hestia Models.
64
+ Check if the Blank Node came from one of the HESTIA Models.
65
65
 
66
66
  Parameters
67
67
  ----------
@@ -41,6 +41,44 @@ from .lookup import (
41
41
  from .term import get_lookup_value
42
42
 
43
43
 
44
+ def lookups_logs(model: str, blank_nodes: list, lookups_per_termType: dict, **log_args):
45
+ def mapper(blank_node: dict):
46
+ term = blank_node.get('term', {})
47
+ term_id = term.get('@id')
48
+ term_type = term.get('termType')
49
+ lookups = lookups_per_termType.get(term_type, [])
50
+ lookups = lookups if isinstance(lookups, list) else [lookups]
51
+
52
+ def _reduce_lookups_logs(logs: dict, column: str):
53
+ lookup_value = get_lookup_value(term, column, model=model, **log_args)
54
+ return logs | {column: lookup_value}
55
+
56
+ return reduce(_reduce_lookups_logs, lookups, {'id': term_id})
57
+
58
+ logs = list(map(mapper, blank_nodes))
59
+
60
+ return log_as_table(logs)
61
+
62
+
63
+ def properties_logs(blank_nodes: list, properties: Union[dict, list]):
64
+ def mapper(blank_node: dict):
65
+ term = blank_node.get('term', {})
66
+ term_id = term.get('@id')
67
+ term_type = term.get('termType')
68
+ props = properties.get(term_type, []) if isinstance(properties, dict) else properties
69
+ props = props if isinstance(props, list) else [props]
70
+
71
+ def _reduce_properties_logs(logs: dict, prop: str):
72
+ value = get_node_property(term, prop).get('value')
73
+ return logs | {prop: value}
74
+
75
+ return reduce(_reduce_properties_logs, properties, {'id': term_id})
76
+
77
+ logs = list(map(mapper, blank_nodes))
78
+
79
+ return log_as_table(logs)
80
+
81
+
44
82
  def group_by_keys(group_keys: list = ['term']):
45
83
  def run(group: dict, node: dict):
46
84
  group_key = '-'.join(non_empty_list(map(lambda v: node.get(v, {}).get('@id'), group_keys)))
@@ -229,12 +267,17 @@ def get_total_value_converted_with_min_ratio(
229
267
  total_value_with_property = list_sum([value for term_id, value, prop_value in values if prop_value])
230
268
  total_value_ratio = total_value_with_property / total_value if total_value > 0 else 0
231
269
 
232
- debugValues(node, model=model, term=term, property_id=prop_id,
233
- total_value=total_value,
234
- total_value_with_property=total_value_with_property,
235
- total_value_ratio=total_value_ratio,
236
- min_value_ratio=min_ratio,
237
- conversion_details=value_logs)
270
+ logs = {
271
+ f"{prop_id}-term-id": prop_id,
272
+ f"{prop_id}-total-value": total_value,
273
+ f"{prop_id}-total-value-with-property": total_value_with_property,
274
+ f"{prop_id}-total-value-with-ratio": total_value_ratio,
275
+ f"{prop_id}-min-value-ratio": min_ratio,
276
+ f"{prop_id}-values": value_logs
277
+ }
278
+
279
+ debugValues(node, model=model, term=term,
280
+ **logs)
238
281
 
239
282
  return list_sum([
240
283
  value * prop_value for term_id, value, prop_value in values if all([value, prop_value])
@@ -574,7 +617,7 @@ def cumulative_nodes_lookup_match(
574
617
 
575
618
  class DatestrFormat(Enum):
576
619
  """
577
- Enum representing ISO date formats permitted by Hestia.
620
+ Enum representing ISO date formats permitted by HESTIA.
578
621
 
579
622
  See: https://en.wikipedia.org/wiki/ISO_8601
580
623
  """
@@ -639,7 +682,7 @@ def _check_datestr_format(datestr: str, format: DatestrFormat) -> bool:
639
682
 
640
683
  def _get_datestr_format(datestr: str, default: Optional[Any] = None) -> Union[DatestrFormat, Any, None]:
641
684
  """
642
- Check a datestr against each ISO format permitted by the Hestia schema and
685
+ Check a datestr against each ISO format permitted by the HESTIA schema and
643
686
  return the matching format.
644
687
  """
645
688
  return next(
@@ -1132,7 +1175,7 @@ def group_nodes_by_last_date(nodes: list) -> dict[str, list[dict]]:
1132
1175
  Parameters
1133
1176
  ----------
1134
1177
  nodes : list[dict]
1135
- A list of Hestia format nodes.
1178
+ A list of HESTIA format nodes.
1136
1179
 
1137
1180
  Return
1138
1181
  ------
@@ -22,7 +22,7 @@ def unique_currencies(cycle: dict) -> list:
22
22
  Parameters
23
23
  ----------
24
24
  cycle : dict
25
- The `Cycle` as defined in the Hestia Schema.
25
+ The `Cycle` as defined in the HESTIA Schema.
26
26
 
27
27
  Returns
28
28
  -------
@@ -41,7 +41,7 @@ def default_currency(cycle: dict) -> str:
41
41
  Parameters
42
42
  ----------
43
43
  cycle : dict
44
- The `Cycle` as defined in the Hestia Schema.
44
+ The `Cycle` as defined in the HESTIA Schema.
45
45
 
46
46
  Returns
47
47
  -------
@@ -59,7 +59,7 @@ def get_crop_residue_decomposition_N_total(cycle: dict) -> float:
59
59
  Parameters
60
60
  ----------
61
61
  cycle : dict
62
- The `Cycle` as defined in the Hestia Schema.
62
+ The `Cycle` as defined in the HESTIA Schema.
63
63
 
64
64
  Returns
65
65
  -------
@@ -87,7 +87,7 @@ def get_excreta_N_total(cycle: dict) -> float:
87
87
  Parameters
88
88
  ----------
89
89
  cycle : dict
90
- The `Cycle` as defined in the Hestia Schema.
90
+ The `Cycle` as defined in the HESTIA Schema.
91
91
 
92
92
  Returns
93
93
  -------
@@ -115,7 +115,7 @@ def get_organic_fertiliser_N_total(cycle: dict) -> float:
115
115
  Parameters
116
116
  ----------
117
117
  cycle : dict
118
- The `Cycle` as defined in the Hestia Schema.
118
+ The `Cycle` as defined in the HESTIA Schema.
119
119
 
120
120
  Returns
121
121
  -------
@@ -141,7 +141,7 @@ def get_organic_fertiliser_P_total(cycle: dict) -> float:
141
141
  Parameters
142
142
  ----------
143
143
  cycle : dict
144
- The `Cycle` as defined in the Hestia Schema.
144
+ The `Cycle` as defined in the HESTIA Schema.
145
145
 
146
146
  Returns
147
147
  -------
@@ -165,7 +165,7 @@ def get_inorganic_fertiliser_N_total(cycle: dict) -> float:
165
165
  Parameters
166
166
  ----------
167
167
  cycle : dict
168
- The `Cycle` as defined in the Hestia Schema.
168
+ The `Cycle` as defined in the HESTIA Schema.
169
169
 
170
170
  Returns
171
171
  -------
@@ -189,7 +189,7 @@ def get_inorganic_fertiliser_P_total(cycle: dict) -> float:
189
189
  Parameters
190
190
  ----------
191
191
  cycle : dict
192
- The `Cycle` as defined in the Hestia Schema.
192
+ The `Cycle` as defined in the HESTIA Schema.
193
193
 
194
194
  Returns
195
195
  -------
@@ -260,7 +260,7 @@ def land_occupation_per_ha(model: str, term_id: str, cycle: dict):
260
260
  term_id : str
261
261
  The name of the term running this function. For debugging purpose only.
262
262
  cycle : dict
263
- The `Cycle` as defined in the Hestia Schema.
263
+ The `Cycle` as defined in the HESTIA Schema.
264
264
 
265
265
  Returns
266
266
  -------
@@ -302,9 +302,9 @@ def land_occupation_per_kg(model: str, term_id: str, cycle: dict, site: dict, pr
302
302
  term_id : str
303
303
  The name of the term running this function. For debugging purpose only.
304
304
  cycle : dict
305
- The `Cycle` as defined in the Hestia Schema.
305
+ The `Cycle` as defined in the HESTIA Schema.
306
306
  site : dict
307
- The `Site` as defined in the Hestia Schema.
307
+ The `Site` as defined in the HESTIA Schema.
308
308
  primary_product : dict
309
309
  The primary `Product` of the `Cycle`.
310
310
 
@@ -447,7 +447,7 @@ def check_cycle_site_ids_identical(cycles: list[dict]) -> bool:
447
447
  Parameters
448
448
  ----------
449
449
  cycles : list[dict]
450
- A list of Hestia `Cycle` nodes, see: https://www.hestia.earth/schema/Cycle.
450
+ A list of HESTIA `Cycle` nodes, see: https://www.hestia.earth/schema/Cycle.
451
451
 
452
452
  Returns
453
453
  -------
@@ -111,7 +111,7 @@ def group_measurement_values_by_year(
111
111
  Parameters
112
112
  ----------
113
113
  measurement : dict
114
- A Hestia `Measurement` node, see: https://www.hestia.earth/schema/Measurement.
114
+ A HESTIA `Measurement` node, see: https://www.hestia.earth/schema/Measurement.
115
115
  inner_key: Any | None
116
116
  An optional inner dictionary key for the outputted annualised groups (can be used to merge annualised
117
117
  dictionaries together), default value: `None`.
@@ -165,9 +165,9 @@ def most_relevant_measurement_value_by_depth_and_date(
165
165
  Parameters
166
166
  ----------
167
167
  measurements list[dict]
168
- A list of Hestia `Measurement` nodes, see: https://www.hestia.earth/schema/Measurement.
168
+ A list of HESTIA `Measurement` nodes, see: https://www.hestia.earth/schema/Measurement.
169
169
  term_id : str
170
- The `@id` of a Hestia `Term`. Example: `"sandContent"`
170
+ The `@id` of a HESTIA `Term`. Example: `"sandContent"`
171
171
  date : str
172
172
  The target date in ISO 8601 string format (`"YYYY-MM-DD"`), see: https://en.wikipedia.org/wiki/ISO_8601.
173
173
  depth_upper : int
@@ -87,17 +87,17 @@ def node_has_property(term_id: str):
87
87
  return lambda product: find_term_match(product.get('properties', []), term_id, None) is not None
88
88
 
89
89
 
90
- def node_property_lookup_value(model: str, term: dict, prop_id: str, default=None, **log_args):
90
+ def node_property_lookup_value(model: str, node_term: dict, prop_id: str, default=None, **log_args):
91
91
  # as the lookup table might not exist, we are making sure we return `0` in thise case
92
92
  try:
93
- lookup_name = f"{term.get('termType')}-property.csv"
93
+ lookup_name = f"{node_term.get('termType')}-property.csv"
94
94
  lookup = download_lookup(lookup_name)
95
- term_id = term.get('@id')
95
+ term_id = node_term.get('@id')
96
96
  lookup_value = get_table_value(lookup, 'termid', term_id, column_name(prop_id))
97
97
  value = extract_grouped_data(lookup_value, 'Avg') if (
98
98
  isinstance(lookup_value, str) and 'Avg' in lookup_value
99
99
  ) else lookup_value
100
- debugMissingLookup(lookup_name, 'termid', term_id, prop_id, value, model=model, term=term_id, **log_args)
100
+ debugMissingLookup(lookup_name, 'termid', term_id, prop_id, value, model=model, **log_args)
101
101
  return safe_parse_float(value, default=None)
102
102
  except Exception:
103
103
  return default
@@ -111,9 +111,9 @@ def get_node_property_value(model: str, node: dict, prop_id: str, default=None,
111
111
  return default if value is None else (value / 100 if units == '%' else value)
112
112
 
113
113
 
114
- def get_node_property_value_converted(model: str, node: dict, prop_id: str, default=None):
114
+ def get_node_property_value_converted(model: str, node: dict, prop_id: str, default=None, **log_args):
115
115
  node_value = list_sum(node.get('value', []))
116
- prop_value = get_node_property_value(model, node, prop_id)
116
+ prop_value = get_node_property_value(model, node, prop_id, **log_args)
117
117
  return default if prop_value is None else node_value * prop_value
118
118
 
119
119
 
@@ -615,7 +615,7 @@ def get_electricity_grid_mix_terms():
615
615
  list
616
616
  List of matching `Term` as dict.
617
617
  """
618
- return search({
618
+ terms = search({
619
619
  "bool": {
620
620
  "must": [
621
621
  {"match": {"@type": SchemaType.TERM.value}},
@@ -625,3 +625,4 @@ def get_electricity_grid_mix_terms():
625
625
  ],
626
626
  }
627
627
  }, limit=LIMIT, fields=['@type', '@id', 'name', 'termType', 'units'])
628
+ return list(map(lambda n: n["@id"], terms))
@@ -1 +1 @@
1
- VERSION = '0.62.1'
1
+ VERSION = '0.62.3'
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hestia-earth-models
3
- Version: 0.62.1
4
- Summary: Hestia's set of modules for filling gaps in the activity data using external datasets (e.g. populating soil properties with a geospatial dataset using provided coordinates) and internal lookups (e.g. populating machinery use from fuel use). Includes rules for when gaps should be filled versus not (e.g. never gap fill yield, gap fill crop residue if yield provided etc.).
3
+ Version: 0.62.3
4
+ Summary: HESTIA's set of modules for filling gaps in the activity data using external datasets (e.g. populating soil properties with a geospatial dataset using provided coordinates) and internal lookups (e.g. populating machinery use from fuel use). Includes rules for when gaps should be filled versus not (e.g. never gap fill yield, gap fill crop residue if yield provided etc.).
5
5
  Home-page: https://gitlab.com/hestia-earth/hestia-engine-models
6
- Author: Hestia Team
6
+ Author: HESTIA Team
7
7
  Author-email: guillaumeroyer.mail@gmail.com
8
8
  License: GPL
9
9
  Platform: UNKNOWN
@@ -11,25 +11,25 @@ Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
11
11
  Classifier: Programming Language :: Python :: 3.6
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
- Requires-Dist: hestia-earth.schema ==29.*
15
- Requires-Dist: hestia-earth.utils >=0.13.2
16
- Requires-Dist: python-dateutil >=2.8.1
17
- Requires-Dist: CurrencyConverter ==0.16.8
18
- Requires-Dist: haversine >=2.7.0
14
+ Requires-Dist: hestia-earth.schema==29.*
15
+ Requires-Dist: hestia-earth.utils>=0.13.2
16
+ Requires-Dist: python-dateutil>=2.8.1
17
+ Requires-Dist: CurrencyConverter==0.16.8
18
+ Requires-Dist: haversine>=2.7.0
19
19
  Requires-Dist: pydash
20
20
  Provides-Extra: spatial
21
- Requires-Dist: hestia-earth.earth-engine >=0.4.7 ; extra == 'spatial'
21
+ Requires-Dist: hestia-earth.earth-engine>=0.4.7; extra == "spatial"
22
22
 
23
- # Hestia Engine Models
23
+ # HESTIA Engine Models
24
24
 
25
25
  [![Pipeline Status](https://gitlab.com/hestia-earth/hestia-engine-models/badges/master/pipeline.svg)](https://gitlab.com/hestia-earth/hestia-engine-models/commits/master)
26
26
  [![Coverage Report](https://gitlab.com/hestia-earth/hestia-engine-models/badges/master/coverage.svg)](https://gitlab.com/hestia-earth/hestia-engine-models/commits/master)
27
27
 
28
- Hestia's set of models for running calculations or retrieving data using external datasets and internal lookups.
28
+ HESTIA's set of models for running calculations or retrieving data using external datasets and internal lookups.
29
29
 
30
30
  ## Documentation
31
31
 
32
- Documentation for every model can be found in the [Hestia API Documentation](https://hestia.earth/docs/#hestia-calculation-models).
32
+ Documentation for every model can be found in the [HESTIA API Documentation](https://hestia.earth/docs/#hestia-calculation-models).
33
33
 
34
34
  ## Install
35
35