pyholos 0.0.1__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 pyholos might be problematic. Click here for more details.

Files changed (55) hide show
  1. pyholos/__init__.py +0 -0
  2. pyholos/common.py +141 -0
  3. pyholos/common2.py +157 -0
  4. pyholos/components/__init__.py +0 -0
  5. pyholos/components/animals/__init__.py +0 -0
  6. pyholos/components/animals/beef.py +766 -0
  7. pyholos/components/animals/common.py +2301 -0
  8. pyholos/components/animals/dairy.py +341 -0
  9. pyholos/components/animals/sheep.py +412 -0
  10. pyholos/components/common.py +170 -0
  11. pyholos/components/land_management/__init__.py +0 -0
  12. pyholos/components/land_management/carbon/__init__.py +0 -0
  13. pyholos/components/land_management/carbon/climate.py +863 -0
  14. pyholos/components/land_management/carbon/management.py +21 -0
  15. pyholos/components/land_management/carbon/relative_biomass_information.py +410 -0
  16. pyholos/components/land_management/carbon/tillage.py +88 -0
  17. pyholos/components/land_management/common.py +220 -0
  18. pyholos/components/land_management/crop.py +1233 -0
  19. pyholos/components/land_management/field_system.py +458 -0
  20. pyholos/components/land_management/utils.py +66 -0
  21. pyholos/config.py +49 -0
  22. pyholos/core_constants.py +20 -0
  23. pyholos/defaults.py +116 -0
  24. pyholos/farm/__init__.py +0 -0
  25. pyholos/farm/enums.py +54 -0
  26. pyholos/farm/farm.py +101 -0
  27. pyholos/farm/farm_inputs.py +633 -0
  28. pyholos/farm/farm_settings.py +542 -0
  29. pyholos/launching.py +86 -0
  30. pyholos/postprocessing/__init__.py +0 -0
  31. pyholos/postprocessing/plots.py +164 -0
  32. pyholos/postprocessing/postprocessing.py +38 -0
  33. pyholos/resources/holos/Table_16_Livestock_Coefficients_BeefAndDairy_Cattle_Provider.csv +21 -0
  34. pyholos/resources/holos/Table_21_Average_Milk_Production_For_Dairy_Cows_By_Province.csv +23 -0
  35. pyholos/resources/holos/Table_22_Livestock_Coefficients_For_Sheep.csv +28 -0
  36. pyholos/resources/holos/Table_29_Percentage_Total_Manure_Produced_In_Systems.csv +56 -0
  37. pyholos/resources/holos/Table_30_Default_Bedding_Material_Composition_Provider.csv +28 -0
  38. pyholos/resources/holos/Table_50_Fuel_Energy_Requirement_Estimates_By_Region.csv +81 -0
  39. pyholos/resources/holos/Table_51_Herbicide_Energy_Requirement_Estimates_By_Region.csv +81 -0
  40. pyholos/resources/holos/Table_61_Fractions_of_dairy_cattle_N_volatilized.csv +25 -0
  41. pyholos/resources/holos/Table_62_Fractions_of_swine_N_volatilized.csv +25 -0
  42. pyholos/resources/holos/Table_6_Manure_Types_And_Default_Composition.csv +126 -0
  43. pyholos/resources/holos/Table_7_Relative_Biomass_Information.csv +112 -0
  44. pyholos/resources/holos/Table_9_Default_Values_For_Nitrogen_Lignin_In_Crops.csv +72 -0
  45. pyholos/resources/holos/Table_Tillage_Factor.csv +13 -0
  46. pyholos/resources/holos/feeds.csv +223 -0
  47. pyholos/resources/holos/main_tables.py +493 -0
  48. pyholos/resources/holos/small_area_yields.csv +167159 -0
  49. pyholos/resources/soil_landscapes_of_canada_v3r2.zip +0 -0
  50. pyholos/soil.py +439 -0
  51. pyholos/utils.py +83 -0
  52. pyholos-0.0.1.dist-info/METADATA +16 -0
  53. pyholos-0.0.1.dist-info/RECORD +55 -0
  54. pyholos-0.0.1.dist-info/WHEEL +4 -0
  55. pyholos-0.0.1.dist-info/licenses/LICENSE +677 -0
pyholos/__init__.py ADDED
File without changes
pyholos/common.py ADDED
@@ -0,0 +1,141 @@
1
+ from enum import Enum, StrEnum, auto, unique
2
+ from typing import Any
3
+
4
+ from pyholos.common2 import CanadianProvince
5
+ from pyholos.utils import AutoNameEnum
6
+
7
+
8
+ class EnumGeneric(Enum):
9
+ @classmethod
10
+ def get_value(cls, name: str) -> str:
11
+ return getattr(cls, name).value
12
+
13
+ @classmethod
14
+ def get_member(cls, name: str):
15
+ return getattr(cls, name)
16
+
17
+
18
+ class HolosVar:
19
+ def __init__(
20
+ self,
21
+ name: str,
22
+ value: Any = None
23
+ ):
24
+ self.name = name
25
+ self.value = value
26
+
27
+
28
+ class Component:
29
+ def __init__(self):
30
+ pass
31
+
32
+ def to_dict(self) -> dict:
33
+ return {v.name: v.value for k, v in self.__dict__.items() if isinstance(v, HolosVar)}
34
+
35
+
36
+ class Region(AutoNameEnum):
37
+ EasternCanada = auto()
38
+ WesternCanada = auto()
39
+
40
+
41
+ def get_region(
42
+ province: CanadianProvince
43
+ ) -> str:
44
+ if province in [
45
+ CanadianProvince.Alberta,
46
+ CanadianProvince.BritishColumbia,
47
+ CanadianProvince.Manitoba,
48
+ CanadianProvince.Saskatchewan,
49
+ CanadianProvince.NorthwestTerritories,
50
+ CanadianProvince.Nunavut]:
51
+
52
+ res = Region.WesternCanada
53
+
54
+ else:
55
+ res = Region.EasternCanada
56
+
57
+ return res
58
+
59
+
60
+ def verify_is_prairie_province(
61
+ province: CanadianProvince
62
+ ) -> bool:
63
+ return province in [
64
+ CanadianProvince.Alberta,
65
+ CanadianProvince.Saskatchewan,
66
+ CanadianProvince.Manitoba]
67
+
68
+
69
+ @unique
70
+ class ClimateZones(StrEnum):
71
+ CoolTemperateMoist = auto()
72
+ CoolTemperateDry = auto()
73
+ BorealMoist = auto()
74
+ BorealDry = auto()
75
+ WarmTemperateMoist = auto()
76
+ WarmTemperateDry = auto()
77
+
78
+
79
+ def get_climate_zone(
80
+ mean_annual_temperature: float,
81
+ mean_annual_precipitation: float,
82
+ mean_annual_potential_evapotranspiration: float
83
+ ) -> ClimateZones:
84
+ """Returns a ClimateZones member for the specified climate conditions
85
+
86
+ Args:
87
+ mean_annual_temperature: (°C) mean annual air temperature
88
+ mean_annual_precipitation: (mm) mean annual precipitation
89
+ mean_annual_potential_evapotranspiration: (mm) mean annual potential evapotranspiration
90
+
91
+ Returns:
92
+ ClimateZones object
93
+
94
+ Notes:
95
+ For the determination of the methane conversion factor) MCF value, IPCC (2019) defines the different climate zones as follows:
96
+ 1. Warm temperate moist: mean annual temperature (MAT) > 10 °C, P:PE >1;
97
+ 2. Warm temperate dry: MAT >10 °C, P:PE < 1;
98
+ 3. Cool temperate moist: MAT > 0 °C, P:PE >1;
99
+ 4. Cool temperate dry: MAT > 0 °C, P:PE <1;
100
+ 5. Boreal moist: MAT < 0 °C but some monthly temperatures > 10 °C, P:PE >1;
101
+ 6. Boreal dry: MAT < 0 °C but some monthly temperatures > 10 °C, P:PE <1.
102
+ The MAT for cool temperate moist, cool temperate dry, warm temperate moist and warm temperate dry were 4.6, 5.8, 13.9, 14.0, respectively.
103
+ For deep pit manure storage systems for dairy cattle and swine, an average storage duration of 1 month was assumed.
104
+ (Source: IPCC (2019), Table 10.17)
105
+
106
+ Holos Source Code:
107
+ https://github.com/holos-aafc/Holos/blob/396f1ab9bc7247e6d78766f9445c14d2eb7c0d9d/H.Core/Providers/Animals/Table_37_MCF_By_Climate_Livestock_MansureSystem_Provider.cs#L147
108
+ """
109
+ is_high_ratio_precipitation_to_potential_evapotranspiration = (
110
+ (mean_annual_precipitation / mean_annual_potential_evapotranspiration) >= 1)
111
+
112
+ if (mean_annual_temperature >= 10) and is_high_ratio_precipitation_to_potential_evapotranspiration:
113
+ climate_zone = ClimateZones.WarmTemperateMoist
114
+
115
+ elif (mean_annual_temperature >= 10) and not is_high_ratio_precipitation_to_potential_evapotranspiration:
116
+ climate_zone = ClimateZones.WarmTemperateDry
117
+
118
+ elif all([
119
+ mean_annual_temperature >= 0,
120
+ mean_annual_temperature < 10,
121
+ is_high_ratio_precipitation_to_potential_evapotranspiration
122
+ ]):
123
+ climate_zone = ClimateZones.CoolTemperateMoist
124
+
125
+ elif all([
126
+ mean_annual_temperature >= 0,
127
+ mean_annual_temperature < 10,
128
+ not is_high_ratio_precipitation_to_potential_evapotranspiration
129
+ ]):
130
+ climate_zone = ClimateZones.CoolTemperateDry
131
+
132
+ elif (mean_annual_temperature <= 0) and is_high_ratio_precipitation_to_potential_evapotranspiration:
133
+ climate_zone = ClimateZones.WarmTemperateMoist
134
+
135
+ elif (mean_annual_temperature <= 0) and not is_high_ratio_precipitation_to_potential_evapotranspiration:
136
+ climate_zone = ClimateZones.WarmTemperateDry
137
+
138
+ else:
139
+ raise ValueError("Unable to get data for methane conversion factor since climate zone is unknown")
140
+
141
+ return climate_zone
pyholos/common2.py ADDED
@@ -0,0 +1,157 @@
1
+ from enum import Enum
2
+ from pathlib import Path
3
+
4
+ from geojson import FeatureCollection, load
5
+ from pandas import DataFrame, read_csv
6
+ from shapely.geometry import Point, shape
7
+
8
+
9
+ class MapNamesGeneric(Enum):
10
+ @classmethod
11
+ def _get_name(cls, abbreviation: str) -> str:
12
+ for member in cls:
13
+ if member.value.abbreviation == abbreviation:
14
+ return member.value.name
15
+
16
+ @classmethod
17
+ def get_name(cls, abbreviation: str) -> str:
18
+ res = cls._get_name(abbreviation=abbreviation)
19
+ return res if res is not None else "NotApplicable"
20
+
21
+
22
+ class NameSlc:
23
+ def __init__(
24
+ self,
25
+ name: str,
26
+ abbreviation: str
27
+ ):
28
+ self.name = name
29
+ self.abbreviation = abbreviation
30
+
31
+
32
+ class CanadianProvince(MapNamesGeneric):
33
+ Alberta: NameSlc = NameSlc(name='Alberta', abbreviation='AB')
34
+ BritishColumbia: NameSlc = NameSlc(name='British Columbia', abbreviation="BC")
35
+ Manitoba: NameSlc = NameSlc(name='Manitoba', abbreviation="MB")
36
+ NewBrunswick: NameSlc = NameSlc(name='New Brunswick', abbreviation="NB")
37
+ NewfoundlandAndLabrador: NameSlc = NameSlc(name='Newfoundland and Labrador', abbreviation="NL")
38
+ NorthwestTerritories: NameSlc = NameSlc(name='Northwest Territories', abbreviation="NT")
39
+ NovaScotia: NameSlc = NameSlc(name='Nova Scotia', abbreviation="NS")
40
+ Nunavut: NameSlc = NameSlc(name='Nunavut', abbreviation="NU")
41
+ Ontario: NameSlc = NameSlc(name='Ontario', abbreviation="ON")
42
+ PrinceEdwardIsland: NameSlc = NameSlc(name='Prince Edward Island', abbreviation="PE")
43
+ Quebec: NameSlc = NameSlc(name='Quebec', abbreviation="QC")
44
+ Saskatchewan: NameSlc = NameSlc(name='Saskatchewan', abbreviation="SK")
45
+ Yukon: NameSlc = NameSlc(name='Yukon', abbreviation="YT")
46
+
47
+
48
+ class SoilGreatGroupNamesSlc(MapNamesGeneric):
49
+ MelanicBrunisol: NameSlc = NameSlc(name='Melanic Brunisol', abbreviation="MB")
50
+ EutricBrunisol: NameSlc = NameSlc(name='Eutric Brunisol', abbreviation="EB")
51
+ SombricBrunisol: NameSlc = NameSlc(name='Sombric Brunisol', abbreviation="SB")
52
+ DystricBrunisol: NameSlc = NameSlc(name='Dystric Brunisol', abbreviation="DYB")
53
+ BrownChernozem: NameSlc = NameSlc(name='Brown Chernozem', abbreviation="BC")
54
+ DarkBrownChernozem: NameSlc = NameSlc(name='Dark Brown Chernozem', abbreviation="DBC")
55
+ BlackChernozem: NameSlc = NameSlc(name='Black Chernozem', abbreviation="BLC")
56
+ DarkGrayChernozem: NameSlc = NameSlc(name='Dark Gray Chernozem', abbreviation="DGC")
57
+ TurbicCryosol: NameSlc = NameSlc(name='Turbic Cryosol', abbreviation="TC")
58
+ StaticCryosol: NameSlc = NameSlc(name='Static Cryosol', abbreviation="SC")
59
+ OrganicCryosol: NameSlc = NameSlc(name='Organic Cryosol', abbreviation="OC")
60
+ HumicGleysol: NameSlc = NameSlc(name='Humic Gleysol', abbreviation="HG")
61
+ Gleysol: NameSlc = NameSlc(name='Gleysol', abbreviation="G")
62
+ LuvicGleysol: NameSlc = NameSlc(name='Luvic Gleysol', abbreviation="LG")
63
+ GrayBrownLuvisol: NameSlc = NameSlc(name='Gray Brown Luvisol', abbreviation="GBL")
64
+ GrayLuvisol: NameSlc = NameSlc(name='Gray Luvisol', abbreviation="GL")
65
+ Fibrisol: NameSlc = NameSlc(name='Fibrisol', abbreviation="F")
66
+ Mesisol: NameSlc = NameSlc(name='Mesisol', abbreviation="M")
67
+ Humisol: NameSlc = NameSlc(name='Humisol', abbreviation="H")
68
+ Folisol: NameSlc = NameSlc(name='Folisol', abbreviation="FO")
69
+ HumicPodzol: NameSlc = NameSlc(name='Humic Podzol', abbreviation="HP")
70
+ FerroHumicPodzol: NameSlc = NameSlc(name='Ferro-Humic Podzol', abbreviation="FHP")
71
+ HumoFerricPodzol: NameSlc = NameSlc(name='Humo-Ferric Podzol', abbreviation="HFP")
72
+ Regosol: NameSlc = NameSlc(name='Regosol', abbreviation="R")
73
+ HumicRegosol: NameSlc = NameSlc(name='Humic Regosol', abbreviation="HR")
74
+ Solonetz: NameSlc = NameSlc(name='Solonetz', abbreviation="SZ")
75
+ SolodizedSolonetz: NameSlc = NameSlc(name='Solodized Solonetz', abbreviation="SS")
76
+ Solod: NameSlc = NameSlc(name='Solod', abbreviation="SO")
77
+ VerticSolonetz: NameSlc = NameSlc(name='Vertic Solonetz', abbreviation="VSZ")
78
+ Vertisol: NameSlc = NameSlc(name='Vertisol', abbreviation="V")
79
+ HumicVertisol: NameSlc = NameSlc(name='Humic Vertisol', abbreviation="HV")
80
+
81
+ NotApplicable: NameSlc = NameSlc(name="NotApplicable", abbreviation='NA')
82
+ Unknown: NameSlc = NameSlc(name="NotApplicable", abbreviation='NA')
83
+
84
+
85
+ class ParentMaterialTextureNamesSlc(MapNamesGeneric):
86
+ VeryCoarse: NameSlc = NameSlc(name='Very Coarse', abbreviation="VC")
87
+ Coarse: NameSlc = NameSlc(name='Coarse', abbreviation="C")
88
+ ModeratelyCoarse: NameSlc = NameSlc(name='Moderately Coarse', abbreviation="MC")
89
+ Medium: NameSlc = NameSlc(name='Medium', abbreviation="M")
90
+ ModeratelyFine: NameSlc = NameSlc(name='Moderately Fine', abbreviation="MF")
91
+ Fine: NameSlc = NameSlc(name='Fine', abbreviation="F")
92
+ VeryFine: NameSlc = NameSlc(name='Very Fine', abbreviation="VF")
93
+ CoarseSkeletal: NameSlc = NameSlc(name='Coarse Skeletal', abbreviation="CS")
94
+ MediumSkeletal: NameSlc = NameSlc(name='Medium Skeletal', abbreviation="MS")
95
+ FineSkeletal: NameSlc = NameSlc(name='Fine Skeletal', abbreviation="FS")
96
+ Fragmental: NameSlc = NameSlc(name='Fragmental', abbreviation="FR")
97
+ StratifiedMineral: NameSlc = NameSlc(name='Stratified (Mineral)', abbreviation="SM")
98
+ StratifiedMineralAndOrganic: NameSlc = NameSlc(name='Stratified (Mineral and Organic)', abbreviation="SU")
99
+ Fibric: NameSlc = NameSlc(name='Fibric', abbreviation="FI")
100
+ Mesic: NameSlc = NameSlc(name='Mesic', abbreviation="ME")
101
+ Humic: NameSlc = NameSlc(name='Humic', abbreviation="HU")
102
+ Undifferentiated: NameSlc = NameSlc(name='Undifferentiated', abbreviation="UD")
103
+
104
+
105
+ def read_slc_csv(
106
+ path_file: Path,
107
+ **kwargs
108
+ ) -> DataFrame:
109
+ return read_csv(path_file, sep=',', decimal='.', **kwargs)
110
+
111
+
112
+ def load_slc_data(path_slc_geojson_file: Path) -> FeatureCollection:
113
+ with path_slc_geojson_file.open(mode='r') as f:
114
+ return load(f)
115
+
116
+
117
+ def get_slc_polygon_properties(
118
+ latitude: float | str,
119
+ longitude: float | str,
120
+ geojson_data: FeatureCollection
121
+ ) -> dict | None:
122
+ point = Point(longitude, latitude)
123
+
124
+ for feature in geojson_data['features']:
125
+ polygon = shape(feature['geometry'])
126
+ if polygon.contains(point):
127
+ return feature['properties']
128
+
129
+ return None
130
+
131
+
132
+ def get_dominant_component_properties(
133
+ id_polygon: str,
134
+ slc_components_table: DataFrame
135
+ ) -> dict[str, str | int]:
136
+ return slc_components_table[slc_components_table['POLY_ID'] == id_polygon].sort_values(
137
+ by='PERCENT_', ascending=False).iloc[0].to_dict()
138
+
139
+
140
+ def get_soil_layer_table(
141
+ id_soil: str,
142
+ slc_soil_layer_table: DataFrame
143
+ ) -> DataFrame:
144
+ return slc_soil_layer_table[slc_soil_layer_table['SOIL_ID'] == id_soil].sort_values(by='UDEPTH', ascending=True)
145
+
146
+
147
+ def get_first_non_litter_layer(
148
+ soil_layer_table: DataFrame
149
+ ) -> dict:
150
+ return soil_layer_table[soil_layer_table['UDEPTH'] >= 0].iloc[0].to_dict()
151
+
152
+
153
+ def get_soil_name_table(
154
+ soil_name_table: DataFrame,
155
+ id_soil: str
156
+ ) -> dict:
157
+ return soil_name_table.set_index('SOIL_ID').loc[id_soil].to_dict()
File without changes
File without changes