core-lens 0.1.dev121__tar.gz → 0.1.dev124__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.dev121 → core_lens-0.1.dev124}/PKG-INFO +1 -1
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/examples/demo_mws.py +20 -8
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/examples/demo_tehsil.py +1 -1
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/_version.py +2 -2
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/base/namespaces/plot.py +34 -10
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.github/pull_request_template.md +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.github/workflows/ci.yml +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.github/workflows/gh-pages.yml +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.github/workflows/pre-release.yml +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.github/workflows/release.yml +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.gitignore +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.gitmessage +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.pre-commit-config.yaml +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.python-version +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/CONTRIBUTING.md +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/LICENSE +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/README.md +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/SKILLS.md +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/Makefile +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/make.bat +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/concepts.md +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/conf.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/export.md +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/index.rst +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/intro.md +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/logging.md +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/plots.md +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/plugins.md +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/queries.md +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/quickstart.md +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/stats.md +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/hooks/mypy.sh +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/hooks/no-parquet-outside-fixtures.sh +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/hooks/pytest.sh +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/pyproject.toml +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/__init__.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/__main__.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/aoi.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/base/__init__.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/base/entity.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/base/namespaces/__init__.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/base/namespaces/stats.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/base/result.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/base/view.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/entities/__init__.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/entities/mws.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/entities/tehsil.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/entities/waterbody.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/export/__init__.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/export/formats.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/py.typed +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/schema/__init__.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/schema/detection.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/schema/profile.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/utils/__init__.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/utils/polars_utils.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/utils/season.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/utils/spatial.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/fixtures/generate_fixtures.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/conftest.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_aoi.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_entities.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_entity.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_export.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_main.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_plot.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_polars_utils.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_profile.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_result.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_schema_detection.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_schema_profile.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_season.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_season_config.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_spatial.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_stats.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_view.py +0 -0
- {core_lens-0.1.dev121 → core_lens-0.1.dev124}/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.dev124
|
|
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
|
|
@@ -30,11 +30,18 @@ from __future__ import annotations
|
|
|
30
30
|
|
|
31
31
|
import polars as pl
|
|
32
32
|
import shapely.geometry as sgeom
|
|
33
|
-
from bokeh.io import
|
|
33
|
+
from bokeh.io import save
|
|
34
|
+
from bokeh.resources import CDN
|
|
34
35
|
|
|
35
36
|
from core_lens import AoI, SeasonConfig
|
|
36
37
|
from core_lens.entities import MWSEntity
|
|
37
38
|
from core_lens.export import geoparquet
|
|
39
|
+
from core_lens.base.namespaces.stats import (
|
|
40
|
+
CorrelateMethod,
|
|
41
|
+
SimilarityMethod,
|
|
42
|
+
TestMethod,
|
|
43
|
+
)
|
|
44
|
+
from core_lens.base.view import Season
|
|
38
45
|
|
|
39
46
|
DATA_ROOT = "/home/akashyap/Finals"
|
|
40
47
|
|
|
@@ -128,7 +135,7 @@ print("Resolution :", result_annual.resolution)
|
|
|
128
135
|
print("Has geometry :", result_annual.has_geometry) # False by default
|
|
129
136
|
|
|
130
137
|
# Fortnightly data for a specific season and year
|
|
131
|
-
result_fn = view_barmer.between(season=
|
|
138
|
+
result_fn = view_barmer.between(season=Season.KHARIF, year=2021).fortnightly
|
|
132
139
|
print("\nFortnightly columns (first 10):", result_fn.columns[:10])
|
|
133
140
|
|
|
134
141
|
|
|
@@ -171,7 +178,7 @@ print(desc_annual_by_entity.df().head(5))
|
|
|
171
178
|
# Pairwise correlations on fortnightly data
|
|
172
179
|
corr = result_fn.stats.correlate(
|
|
173
180
|
columns=["df_precipitation", "df_et"],
|
|
174
|
-
method=
|
|
181
|
+
method=CorrelateMethod.PEARSON,
|
|
175
182
|
across="entity",
|
|
176
183
|
)
|
|
177
184
|
print("\nCorrelation (Precipitation vs ET):")
|
|
@@ -184,7 +191,7 @@ print(corr.df())
|
|
|
184
191
|
test_result = result_static_derived.stats.test(
|
|
185
192
|
column="di_avg_dryspe",
|
|
186
193
|
groups="district",
|
|
187
|
-
method=
|
|
194
|
+
method=TestMethod.MANN_WHITNEY,
|
|
188
195
|
)
|
|
189
196
|
print("\nHypothesis test — dryspell by district:")
|
|
190
197
|
print(test_result.df())
|
|
@@ -213,7 +220,7 @@ sim = result_static_derived.stats.similarity(
|
|
|
213
220
|
"area_in_ha": None,
|
|
214
221
|
"di_avg_dryspe": None,
|
|
215
222
|
},
|
|
216
|
-
method=
|
|
223
|
+
method=SimilarityMethod.EUCLIDEAN,
|
|
217
224
|
top_n=5,
|
|
218
225
|
)
|
|
219
226
|
print(f"\nMost similar MWS to {target_id}:")
|
|
@@ -254,7 +261,7 @@ except Exception:
|
|
|
254
261
|
|
|
255
262
|
try:
|
|
256
263
|
line_fig = result_annual.plot.timeseries(x="year", y="dw_et")
|
|
257
|
-
save(line_fig, filename="mws_et_trend.html")
|
|
264
|
+
save(line_fig, filename="mws_et_trend.html", resources=CDN, title="MWS ET Trend")
|
|
258
265
|
print("Saved line plot to mws_et_trend.html")
|
|
259
266
|
except Exception:
|
|
260
267
|
pass
|
|
@@ -263,7 +270,12 @@ except Exception:
|
|
|
263
270
|
# ── 21. Plot — scatter ───────────────────────────────────────────────────────
|
|
264
271
|
try:
|
|
265
272
|
scatter_fig = result_static_derived.plot.scatter(x="area_km2", y="dryspell_score")
|
|
266
|
-
save(
|
|
273
|
+
save(
|
|
274
|
+
scatter_fig,
|
|
275
|
+
filename="mws_scatter.html",
|
|
276
|
+
resources=CDN,
|
|
277
|
+
title="MWS Scatter Distribution",
|
|
278
|
+
)
|
|
267
279
|
except Exception:
|
|
268
280
|
pass
|
|
269
281
|
|
|
@@ -290,7 +302,7 @@ print("GeoParquet written: output_mws.geoparquet")
|
|
|
290
302
|
|
|
291
303
|
final = (
|
|
292
304
|
aoi.mws.where(ba_name="Barmer")
|
|
293
|
-
.between(season=
|
|
305
|
+
.between(season=Season.KHARIF, year=2021)
|
|
294
306
|
.fortnightly.derive(
|
|
295
307
|
"et_ratio", (pl.col("df_et") / pl.col("df_precipitation")).round(3)
|
|
296
308
|
)
|
|
@@ -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.dev124'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 1, 'dev124')
|
|
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
|
|
|
@@ -447,8 +468,9 @@ class PlotNamespace:
|
|
|
447
468
|
size=5,
|
|
448
469
|
)
|
|
449
470
|
|
|
450
|
-
fig.legend
|
|
451
|
-
|
|
471
|
+
if fig.legend:
|
|
472
|
+
fig.legend.location = "top_left"
|
|
473
|
+
fig.legend.click_policy = "hide"
|
|
452
474
|
_apply_theme(fig, self.result, title)
|
|
453
475
|
return fig
|
|
454
476
|
|
|
@@ -552,8 +574,9 @@ class PlotNamespace:
|
|
|
552
574
|
size=8,
|
|
553
575
|
alpha=0.7,
|
|
554
576
|
)
|
|
555
|
-
fig.legend
|
|
556
|
-
|
|
577
|
+
if fig.legend:
|
|
578
|
+
fig.legend.location = "top_left"
|
|
579
|
+
fig.legend.click_policy = "hide"
|
|
557
580
|
_apply_theme(fig, self.result, "Scatter Distribution")
|
|
558
581
|
return fig
|
|
559
582
|
|
|
@@ -621,8 +644,9 @@ class PlotNamespace:
|
|
|
621
644
|
alpha=0.6,
|
|
622
645
|
legend_label=str(entity),
|
|
623
646
|
)
|
|
624
|
-
fig.legend
|
|
625
|
-
|
|
647
|
+
if fig.legend:
|
|
648
|
+
fig.legend.location = "top_right"
|
|
649
|
+
fig.legend.click_policy = "hide"
|
|
626
650
|
_apply_theme(fig, self.result, "Distribution")
|
|
627
651
|
return fig
|
|
628
652
|
|
|
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
|