core-lens 0.1.dev120__tar.gz → 0.1.dev123__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.
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/PKG-INFO +1 -1
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/examples/demo_mws.py +15 -8
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/examples/demo_tehsil.py +6 -5
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/_version.py +2 -2
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/base/namespaces/plot.py +37 -11
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.github/pull_request_template.md +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.github/workflows/ci.yml +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.github/workflows/gh-pages.yml +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.github/workflows/pre-release.yml +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.github/workflows/release.yml +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.gitignore +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.gitmessage +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.pre-commit-config.yaml +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.python-version +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/CONTRIBUTING.md +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/LICENSE +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/README.md +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/SKILLS.md +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/Makefile +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/make.bat +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/concepts.md +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/conf.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/export.md +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/index.rst +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/intro.md +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/logging.md +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/plots.md +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/plugins.md +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/queries.md +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/quickstart.md +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/stats.md +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/hooks/mypy.sh +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/hooks/no-parquet-outside-fixtures.sh +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/hooks/pytest.sh +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/pyproject.toml +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/__init__.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/__main__.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/aoi.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/base/__init__.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/base/entity.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/base/namespaces/__init__.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/base/namespaces/stats.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/base/result.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/base/view.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/entities/__init__.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/entities/mws.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/entities/tehsil.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/entities/waterbody.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/export/__init__.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/export/formats.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/py.typed +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/schema/__init__.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/schema/detection.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/schema/profile.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/utils/__init__.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/utils/polars_utils.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/utils/season.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/utils/spatial.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/fixtures/generate_fixtures.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/conftest.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_aoi.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_entities.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_entity.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_export.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_main.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_plot.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_polars_utils.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_profile.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_result.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_schema_detection.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_schema_profile.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_season.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_season_config.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_spatial.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_stats.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_view.py +0 -0
- {core_lens-0.1.dev120 → core_lens-0.1.dev123}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: core-lens
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.dev123
|
|
4
4
|
Summary: Query, analyse, and visualise CoreStack's microwatershed and Earth science data through a clean, composable Python API.
|
|
5
5
|
Project-URL: Homepage, https://github.com/ApoorvaKashyap/core-lens
|
|
6
6
|
Project-URL: Issues, https://github.com/ApoorvaKashyap/core-lens/issues
|
|
@@ -7,7 +7,7 @@ geometry, derive, stats, plot, temporal queries, and export.
|
|
|
7
7
|
|
|
8
8
|
Prerequisites
|
|
9
9
|
-------------
|
|
10
|
-
pip install core-lens geopandas shapely polars scipy
|
|
10
|
+
pip install core-lens geopandas shapely polars scipy bokeh lonboard
|
|
11
11
|
|
|
12
12
|
Data layout expected
|
|
13
13
|
--------------------
|
|
@@ -30,10 +30,17 @@ from __future__ import annotations
|
|
|
30
30
|
|
|
31
31
|
import polars as pl
|
|
32
32
|
import shapely.geometry as sgeom
|
|
33
|
+
from bokeh.io import save
|
|
33
34
|
|
|
34
35
|
from core_lens import AoI, SeasonConfig
|
|
35
36
|
from core_lens.entities import MWSEntity
|
|
36
37
|
from core_lens.export import geoparquet
|
|
38
|
+
from core_lens.base.namespaces.stats import (
|
|
39
|
+
CorrelateMethod,
|
|
40
|
+
SimilarityMethod,
|
|
41
|
+
TestMethod,
|
|
42
|
+
)
|
|
43
|
+
from core_lens.base.view import Season
|
|
37
44
|
|
|
38
45
|
DATA_ROOT = "/home/akashyap/Finals"
|
|
39
46
|
|
|
@@ -127,7 +134,7 @@ print("Resolution :", result_annual.resolution)
|
|
|
127
134
|
print("Has geometry :", result_annual.has_geometry) # False by default
|
|
128
135
|
|
|
129
136
|
# Fortnightly data for a specific season and year
|
|
130
|
-
result_fn = view_barmer.between(season=
|
|
137
|
+
result_fn = view_barmer.between(season=Season.KHARIF, year=2021).fortnightly
|
|
131
138
|
print("\nFortnightly columns (first 10):", result_fn.columns[:10])
|
|
132
139
|
|
|
133
140
|
|
|
@@ -170,7 +177,7 @@ print(desc_annual_by_entity.df().head(5))
|
|
|
170
177
|
# Pairwise correlations on fortnightly data
|
|
171
178
|
corr = result_fn.stats.correlate(
|
|
172
179
|
columns=["df_precipitation", "df_et"],
|
|
173
|
-
method=
|
|
180
|
+
method=CorrelateMethod.PEARSON,
|
|
174
181
|
across="entity",
|
|
175
182
|
)
|
|
176
183
|
print("\nCorrelation (Precipitation vs ET):")
|
|
@@ -183,7 +190,7 @@ print(corr.df())
|
|
|
183
190
|
test_result = result_static_derived.stats.test(
|
|
184
191
|
column="di_avg_dryspe",
|
|
185
192
|
groups="district",
|
|
186
|
-
method=
|
|
193
|
+
method=TestMethod.MANN_WHITNEY,
|
|
187
194
|
)
|
|
188
195
|
print("\nHypothesis test — dryspell by district:")
|
|
189
196
|
print(test_result.df())
|
|
@@ -212,7 +219,7 @@ sim = result_static_derived.stats.similarity(
|
|
|
212
219
|
"area_in_ha": None,
|
|
213
220
|
"di_avg_dryspe": None,
|
|
214
221
|
},
|
|
215
|
-
method=
|
|
222
|
+
method=SimilarityMethod.EUCLIDEAN,
|
|
216
223
|
top_n=5,
|
|
217
224
|
)
|
|
218
225
|
print(f"\nMost similar MWS to {target_id}:")
|
|
@@ -253,7 +260,7 @@ except Exception:
|
|
|
253
260
|
|
|
254
261
|
try:
|
|
255
262
|
line_fig = result_annual.plot.timeseries(x="year", y="dw_et")
|
|
256
|
-
line_fig
|
|
263
|
+
save(line_fig, filename="mws_et_trend.html")
|
|
257
264
|
print("Saved line plot to mws_et_trend.html")
|
|
258
265
|
except Exception:
|
|
259
266
|
pass
|
|
@@ -262,7 +269,7 @@ except Exception:
|
|
|
262
269
|
# ── 21. Plot — scatter ───────────────────────────────────────────────────────
|
|
263
270
|
try:
|
|
264
271
|
scatter_fig = result_static_derived.plot.scatter(x="area_km2", y="dryspell_score")
|
|
265
|
-
scatter_fig
|
|
272
|
+
save(scatter_fig, filename="mws_scatter.html")
|
|
266
273
|
except Exception:
|
|
267
274
|
pass
|
|
268
275
|
|
|
@@ -289,7 +296,7 @@ print("GeoParquet written: output_mws.geoparquet")
|
|
|
289
296
|
|
|
290
297
|
final = (
|
|
291
298
|
aoi.mws.where(ba_name="Barmer")
|
|
292
|
-
.between(season=
|
|
299
|
+
.between(season=Season.KHARIF, year=2021)
|
|
293
300
|
.fortnightly.derive(
|
|
294
301
|
"et_ratio", (pl.col("df_et") / pl.col("df_precipitation")).round(3)
|
|
295
302
|
)
|
|
@@ -7,7 +7,7 @@ geometry, derive, stats, plot, and export.
|
|
|
7
7
|
|
|
8
8
|
Prerequisites
|
|
9
9
|
-------------
|
|
10
|
-
pip install core-lens geopandas shapely polars scipy
|
|
10
|
+
pip install core-lens geopandas shapely polars scipy bokeh lonboard
|
|
11
11
|
|
|
12
12
|
Data layout expected
|
|
13
13
|
--------------------
|
|
@@ -33,6 +33,7 @@ from core_lens.base.namespaces.stats import (
|
|
|
33
33
|
TestMethod,
|
|
34
34
|
)
|
|
35
35
|
import shapely.geometry as sgeom
|
|
36
|
+
from bokeh.io import show
|
|
36
37
|
|
|
37
38
|
|
|
38
39
|
DATA_ROOT = "data/"
|
|
@@ -288,19 +289,19 @@ result_plot = (
|
|
|
288
289
|
|
|
289
290
|
# ── 19. Plot — scatter ────────────────────────────────────────────────────────
|
|
290
291
|
scatter_fig = result_plot.plot.scatter(x="area_km2", y="Shape_Leng")
|
|
291
|
-
|
|
292
|
+
show(scatter_fig)
|
|
292
293
|
|
|
293
294
|
|
|
294
295
|
# ── 20. Plot — distribution ───────────────────────────────────────────────────
|
|
295
296
|
dist_fig = result_plot.plot.distribution(x="area_km2")
|
|
296
|
-
|
|
297
|
+
show(dist_fig)
|
|
297
298
|
|
|
298
299
|
|
|
299
300
|
# ── 21. Plot — correlation matrix ────────────────────────────────────────────
|
|
300
301
|
corr_fig = result_plot.plot.correlation(
|
|
301
302
|
columns=["area_km2", "Shape_Leng", "compactness"]
|
|
302
303
|
)
|
|
303
|
-
|
|
304
|
+
show(corr_fig)
|
|
304
305
|
|
|
305
306
|
|
|
306
307
|
# ── 22. Plot — heatmap ────────────────────────────────────────────────────────
|
|
@@ -312,7 +313,7 @@ heatmap_fig = result_plot.plot.heatmap(
|
|
|
312
313
|
y="STATE",
|
|
313
314
|
value="area_km2",
|
|
314
315
|
)
|
|
315
|
-
|
|
316
|
+
show(heatmap_fig)
|
|
316
317
|
|
|
317
318
|
|
|
318
319
|
# ── 23. AoI map ───────────────────────────────────────────────────────────────
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.1.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 1, '
|
|
21
|
+
__version__ = version = '0.1.dev123'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 1, 'dev123')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -144,12 +144,33 @@ def _wkb_to_arrow_table(
|
|
|
144
144
|
idx = arrow_table.schema.get_field_index(geom_col)
|
|
145
145
|
schema = arrow_table.schema.remove(idx)
|
|
146
146
|
|
|
147
|
+
import json
|
|
148
|
+
|
|
149
|
+
arr_geo = ac.Array(geo_col)
|
|
150
|
+
ac_geo = ac.ChunkedArray([arr_geo])
|
|
151
|
+
geom_field = arr_geo.field.with_name(geom_col)
|
|
152
|
+
|
|
153
|
+
ext_meta = dict(geom_field.metadata or {})
|
|
154
|
+
geo_meta = {}
|
|
155
|
+
if b"ARROW:extension:metadata" in ext_meta:
|
|
156
|
+
try:
|
|
157
|
+
geo_meta = json.loads(ext_meta[b"ARROW:extension:metadata"].decode("utf-8"))
|
|
158
|
+
except Exception:
|
|
159
|
+
pass
|
|
160
|
+
geo_meta["crs"] = "EPSG:4326"
|
|
161
|
+
ext_meta[b"ARROW:extension:metadata"] = json.dumps(geo_meta).encode("utf-8")
|
|
162
|
+
new_geom_field = geom_field.with_metadata(ext_meta)
|
|
163
|
+
|
|
164
|
+
new_fields = [
|
|
165
|
+
ac.Field.from_arrow(schema.field(i)) for i in range(len(schema.names))
|
|
166
|
+
]
|
|
167
|
+
new_fields.insert(idx, new_geom_field)
|
|
168
|
+
new_schema = ac.Schema(new_fields)
|
|
169
|
+
|
|
147
170
|
tbl_cols = [ac.ChunkedArray(arrow_table.column(c)) for c in schema.names]
|
|
148
|
-
tbl_cols.insert(idx,
|
|
149
|
-
names = list(schema.names)
|
|
150
|
-
names.insert(idx, geom_col)
|
|
171
|
+
tbl_cols.insert(idx, ac_geo)
|
|
151
172
|
|
|
152
|
-
tbl = ac.Table.from_arrays(tbl_cols,
|
|
173
|
+
tbl = ac.Table.from_arrays(tbl_cols, schema=new_schema)
|
|
153
174
|
return tbl
|
|
154
175
|
|
|
155
176
|
|
|
@@ -277,15 +298,20 @@ class PlotNamespace:
|
|
|
277
298
|
# --- Direct Polars → GeoArrow → Lonboard path (zero Shapely, zero GeoPandas) ---
|
|
278
299
|
arrow_table = _wkb_to_arrow_table(df, geom_col, extra_cols=extra)
|
|
279
300
|
|
|
301
|
+
import warnings
|
|
302
|
+
|
|
280
303
|
# Extract colormap values from the already-filtered arrow_table.
|
|
281
304
|
# arrow_table has the same row order as df post-filter, so indices align.
|
|
282
|
-
values = np.asarray(arrow_table.column(column).to_pylist())
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
(
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
)
|
|
305
|
+
values = np.asarray(arrow_table.column(column).to_pylist(), dtype=float)
|
|
306
|
+
|
|
307
|
+
with warnings.catch_warnings():
|
|
308
|
+
warnings.simplefilter("ignore", category=RuntimeWarning)
|
|
309
|
+
v_min, v_max = np.nanmin(values), np.nanmax(values)
|
|
310
|
+
|
|
311
|
+
if np.isnan(v_min) or np.isnan(v_max) or v_min >= v_max:
|
|
312
|
+
norm_values = np.where(np.isnan(values), np.nan, 0.0)
|
|
313
|
+
else:
|
|
314
|
+
norm_values = (values - v_min) / (v_max - v_min)
|
|
289
315
|
|
|
290
316
|
cmap = mpl.colormaps["plasma"]
|
|
291
317
|
|
|
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
|