geocif 0.2.67__tar.gz → 0.2.69__tar.gz
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.
- {geocif-0.2.67/geocif.egg-info → geocif-0.2.69}/PKG-INFO +13 -2
- {geocif-0.2.67 → geocif-0.2.69}/geocif/geocif.py +3 -1
- {geocif-0.2.67 → geocif-0.2.69}/geocif/ml/feature_selection.py +24 -5
- {geocif-0.2.67 → geocif-0.2.69}/geocif/ml/stages.py +10 -7
- {geocif-0.2.67 → geocif-0.2.69}/geocif/ml/stats.py +5 -5
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/aa.py +1 -0
- {geocif-0.2.67 → geocif-0.2.69/geocif.egg-info}/PKG-INFO +13 -2
- {geocif-0.2.67 → geocif-0.2.69}/setup.py +1 -1
- {geocif-0.2.67 → geocif-0.2.69}/LICENSE +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/MANIFEST.in +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/README.md +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/__init__.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/agmet/__init__.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/agmet/geoagmet.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/agmet/plot.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/agmet/utils.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/analysis.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/backup/__init__.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/backup/constants.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/backup/features.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/backup/geo.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/backup/geocif.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/backup/metadata.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/backup/models.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/cei/__init__.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/cei/definitions.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/cei/indices.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/experiments.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/geocif_runner.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/indices_runner.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/indices_runner_algeria.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/indices_runner_angola.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/indices_runner_madagascar.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/indices_runner_malawi.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/indices_runner_mozambique.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/indices_runner_south_africa.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/indices_runner_zambia.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/indices_runner_zimbabwe.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/logger.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/ml/__init__.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/ml/correlations.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/ml/embedding.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/ml/feature_engineering.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/ml/outliers.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/ml/outlook.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/ml/output.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/ml/spatial_autocorrelation.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/ml/trainers.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/ml/trend.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/ml/xai.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/mm.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/__init__.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/aaaa.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/area.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/automl.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/download_esi.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/enso.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/eval.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/gamtest.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/gee_access.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/misc.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/play_xagg.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/reg.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/sustain.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/test_catboost.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/tmp.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/tmp2.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/tmp3.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/tmp4.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/tmp5.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/wolayita.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/wolayita_maize_mask.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/wolayita_v2.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/playground/wolayita_v3.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/risk/__init__.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/risk/impact_assessment.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/utils.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/viz/__init__.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/viz/gt.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/viz/plot.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/viz/tmp.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif/viz/viz_ml.py +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif.egg-info/SOURCES.txt +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif.egg-info/dependency_links.txt +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif.egg-info/not-zip-safe +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/geocif.egg-info/top_level.txt +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/requirements.txt +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/setup.cfg +0 -0
- {geocif-0.2.67 → geocif-0.2.69}/tests/test_geocif.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: geocif
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.69
|
4
4
|
Summary: Models to visualize and forecast crop conditions and yields
|
5
5
|
Home-page: https://ritviksahajpal.github.io/yield_forecasting/
|
6
6
|
Author: Ritvik Sahajpal
|
@@ -16,6 +16,17 @@ Classifier: Programming Language :: Python :: 3.9
|
|
16
16
|
Requires-Python: >=3.9
|
17
17
|
Description-Content-Type: text/markdown
|
18
18
|
License-File: LICENSE
|
19
|
+
Dynamic: author
|
20
|
+
Dynamic: author-email
|
21
|
+
Dynamic: classifier
|
22
|
+
Dynamic: description
|
23
|
+
Dynamic: description-content-type
|
24
|
+
Dynamic: home-page
|
25
|
+
Dynamic: keywords
|
26
|
+
Dynamic: license
|
27
|
+
Dynamic: license-file
|
28
|
+
Dynamic: requires-python
|
29
|
+
Dynamic: summary
|
19
30
|
|
20
31
|
# geocif
|
21
32
|
|
@@ -836,12 +836,13 @@ class Geocif:
|
|
836
836
|
|
837
837
|
""" Feature selection and then Train """
|
838
838
|
# Filter dataframe based on region and self.feature_names
|
839
|
+
breakpoint()
|
839
840
|
df_region_train = self.df_train[mask_train]
|
840
841
|
df_region_train = df_region_train[self.fixed_columns + common_columns]
|
841
842
|
df_region_train.reset_index(drop=True, inplace=True)
|
842
843
|
df_region_train = df_region_train.dropna(subset=[self.target_column])
|
843
844
|
|
844
|
-
self.X_train = df_region_train[self.feature_names]
|
845
|
+
self.X_train = df_region_train[self.feature_names + ["Region"]]
|
845
846
|
|
846
847
|
# Drop any columns with NaNs except the lag yield columns
|
847
848
|
lag_prefix = "t -"
|
@@ -1543,6 +1544,7 @@ class Geocif:
|
|
1543
1544
|
self.logger.info("Adding starting and ending time period for each stage")
|
1544
1545
|
self.df_inputs = stages.add_stage_information(self.df_inputs, self.method)
|
1545
1546
|
|
1547
|
+
self.logger.info("Writing input file to disk")
|
1546
1548
|
self.df_inputs.to_csv(file, index=False)
|
1547
1549
|
else:
|
1548
1550
|
self.df_inputs = pd.read_csv(file)
|
@@ -65,7 +65,6 @@ def select_features(
|
|
65
65
|
X_filtered : pd.DataFrame of selected features
|
66
66
|
selected_features : list[str]
|
67
67
|
"""
|
68
|
-
|
69
68
|
# copy original for multi-mode recursion
|
70
69
|
X_clean = X.copy()
|
71
70
|
|
@@ -250,10 +249,30 @@ def select_features(
|
|
250
249
|
|
251
250
|
elif method == "BorutaPy":
|
252
251
|
from boruta import BorutaPy
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
252
|
+
from collections import Counter
|
253
|
+
import itertools as it
|
254
|
+
|
255
|
+
region_selected = {} # {region: [features …]}
|
256
|
+
for region in tqdm(X_clean["Region"].unique(), desc="BorutaPy", leave=False):
|
257
|
+
idx = X_clean["Region"] == region
|
258
|
+
X_region = X_clean.loc[idx].drop(columns=["Region"])
|
259
|
+
y_region = y.loc[idx] if hasattr(y, "loc") else y[idx]
|
260
|
+
|
261
|
+
sel = BorutaPy(
|
262
|
+
estimator=forest,
|
263
|
+
n_estimators="auto",
|
264
|
+
random_state=42,
|
265
|
+
verbose=0
|
266
|
+
)
|
267
|
+
sel.fit(X_region.values, y_region.values)
|
268
|
+
|
269
|
+
region_selected[region] = (
|
270
|
+
X_region.columns[sel.support_ | sel.support_weak_].tolist()
|
271
|
+
)
|
272
|
+
|
273
|
+
# ─── 3. keep features chosen in ≥ 2 regions ------------------------------
|
274
|
+
counts = Counter(it.chain.from_iterable(region_selected.values()))
|
275
|
+
selected = [feat for feat, n in counts.items() if n >= 2]
|
257
276
|
|
258
277
|
elif method == "Leshy":
|
259
278
|
import arfs.feature_selection.allrelevant as arfsgroot
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import numpy as np
|
2
2
|
from typing import Union
|
3
|
+
from tqdm import tqdm
|
3
4
|
|
4
5
|
from geocif import utils
|
5
6
|
|
@@ -46,14 +47,16 @@ def add_stage_information(df, method):
|
|
46
47
|
df["Starting Stage"].map(dict) + " - " + df["Ending Stage"].map(dict)
|
47
48
|
)
|
48
49
|
|
49
|
-
|
50
|
-
|
51
|
-
#
|
52
|
-
# in the group
|
50
|
+
df["Percentage Season"] = float("nan")
|
51
|
+
|
52
|
+
# Group by Region and Harvest Year
|
53
53
|
grouped = df.groupby(["Region", "Harvest Year"])
|
54
|
-
|
55
|
-
|
56
|
-
)
|
54
|
+
|
55
|
+
# Loop through groups with tqdm
|
56
|
+
for (region, year), group in tqdm(grouped, desc="Computing Percentage Season"):
|
57
|
+
idx = group.index
|
58
|
+
n = len(group)
|
59
|
+
df.loc[idx, "Percentage Season"] = [i * 100.0 / n for i in range(n)]
|
57
60
|
|
58
61
|
return df
|
59
62
|
|
@@ -18,7 +18,7 @@ def get_yld_prd(df, name_crop, cntr, region, calendar_year, region_column="ADM1_
|
|
18
18
|
|
19
19
|
"""
|
20
20
|
# Get yield and production for country for specific year
|
21
|
-
val = np.
|
21
|
+
val = np.nan
|
22
22
|
|
23
23
|
# df.columns.values: [u'ADM0_NAME', u'ADM1_NAME', u'ADM2_NAME', u'str_ID', u'num_ID', 1990 ... 2015]
|
24
24
|
if calendar_year in df.columns:
|
@@ -88,7 +88,7 @@ def get_yld_prd(df, name_crop, cntr, region, calendar_year, region_column="ADM1_
|
|
88
88
|
|
89
89
|
try:
|
90
90
|
if val.isnull().all():
|
91
|
-
val = np.
|
91
|
+
val = np.nan
|
92
92
|
else:
|
93
93
|
val = val.values[0]
|
94
94
|
except:
|
@@ -97,10 +97,10 @@ def get_yld_prd(df, name_crop, cntr, region, calendar_year, region_column="ADM1_
|
|
97
97
|
else:
|
98
98
|
# The values[-1] is a hack to accommodate multiple types of green maize
|
99
99
|
vals = df[calendar_year]
|
100
|
-
val = vals.values[-1] if not vals.empty else np.
|
100
|
+
val = vals.values[-1] if not vals.empty else np.nan
|
101
101
|
|
102
102
|
# Replace yield/production value of 0 with NaN
|
103
|
-
val = np.
|
103
|
+
val = np.nan if val == 0.0 else val
|
104
104
|
|
105
105
|
return val
|
106
106
|
|
@@ -120,7 +120,7 @@ def add_GEOGLAM_statistics(dir_stats, df, stats, method, admin_zone):
|
|
120
120
|
"""
|
121
121
|
# Create empty columns for all the ag statistics
|
122
122
|
for stat in stats:
|
123
|
-
df.loc[:, stat] = np.
|
123
|
+
df.loc[:, stat] = np.nan
|
124
124
|
|
125
125
|
# Fill in the ag statistics columns with data when available
|
126
126
|
# Compute national scale statistics
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: geocif
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.69
|
4
4
|
Summary: Models to visualize and forecast crop conditions and yields
|
5
5
|
Home-page: https://ritviksahajpal.github.io/yield_forecasting/
|
6
6
|
Author: Ritvik Sahajpal
|
@@ -16,6 +16,17 @@ Classifier: Programming Language :: Python :: 3.9
|
|
16
16
|
Requires-Python: >=3.9
|
17
17
|
Description-Content-Type: text/markdown
|
18
18
|
License-File: LICENSE
|
19
|
+
Dynamic: author
|
20
|
+
Dynamic: author-email
|
21
|
+
Dynamic: classifier
|
22
|
+
Dynamic: description
|
23
|
+
Dynamic: description-content-type
|
24
|
+
Dynamic: home-page
|
25
|
+
Dynamic: keywords
|
26
|
+
Dynamic: license
|
27
|
+
Dynamic: license-file
|
28
|
+
Dynamic: requires-python
|
29
|
+
Dynamic: summary
|
19
30
|
|
20
31
|
# geocif
|
21
32
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|