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.
Files changed (77) hide show
  1. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/PKG-INFO +1 -1
  2. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/examples/demo_mws.py +15 -8
  3. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/examples/demo_tehsil.py +6 -5
  4. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/_version.py +2 -2
  5. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/base/namespaces/plot.py +37 -11
  6. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.github/pull_request_template.md +0 -0
  7. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.github/workflows/ci.yml +0 -0
  8. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.github/workflows/gh-pages.yml +0 -0
  9. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.github/workflows/pre-release.yml +0 -0
  10. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.github/workflows/release.yml +0 -0
  11. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.gitignore +0 -0
  12. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.gitmessage +0 -0
  13. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.pre-commit-config.yaml +0 -0
  14. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/.python-version +0 -0
  15. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/CONTRIBUTING.md +0 -0
  16. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/LICENSE +0 -0
  17. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/README.md +0 -0
  18. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/SKILLS.md +0 -0
  19. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/Makefile +0 -0
  20. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/make.bat +0 -0
  21. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/concepts.md +0 -0
  22. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/conf.py +0 -0
  23. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/export.md +0 -0
  24. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/index.rst +0 -0
  25. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/intro.md +0 -0
  26. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/logging.md +0 -0
  27. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/plots.md +0 -0
  28. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/plugins.md +0 -0
  29. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/queries.md +0 -0
  30. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/quickstart.md +0 -0
  31. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/docs/source/stats.md +0 -0
  32. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/hooks/mypy.sh +0 -0
  33. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/hooks/no-parquet-outside-fixtures.sh +0 -0
  34. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/hooks/pytest.sh +0 -0
  35. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/pyproject.toml +0 -0
  36. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/__init__.py +0 -0
  37. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/__main__.py +0 -0
  38. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/aoi.py +0 -0
  39. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/base/__init__.py +0 -0
  40. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/base/entity.py +0 -0
  41. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/base/namespaces/__init__.py +0 -0
  42. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/base/namespaces/stats.py +0 -0
  43. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/base/result.py +0 -0
  44. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/base/view.py +0 -0
  45. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/entities/__init__.py +0 -0
  46. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/entities/mws.py +0 -0
  47. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/entities/tehsil.py +0 -0
  48. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/entities/waterbody.py +0 -0
  49. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/export/__init__.py +0 -0
  50. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/export/formats.py +0 -0
  51. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/py.typed +0 -0
  52. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/schema/__init__.py +0 -0
  53. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/schema/detection.py +0 -0
  54. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/schema/profile.py +0 -0
  55. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/utils/__init__.py +0 -0
  56. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/utils/polars_utils.py +0 -0
  57. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/utils/season.py +0 -0
  58. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/src/core_lens/utils/spatial.py +0 -0
  59. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/fixtures/generate_fixtures.py +0 -0
  60. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/conftest.py +0 -0
  61. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_aoi.py +0 -0
  62. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_entities.py +0 -0
  63. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_entity.py +0 -0
  64. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_export.py +0 -0
  65. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_main.py +0 -0
  66. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_plot.py +0 -0
  67. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_polars_utils.py +0 -0
  68. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_profile.py +0 -0
  69. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_result.py +0 -0
  70. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_schema_detection.py +0 -0
  71. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_schema_profile.py +0 -0
  72. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_season.py +0 -0
  73. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_season_config.py +0 -0
  74. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_spatial.py +0 -0
  75. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_stats.py +0 -0
  76. {core_lens-0.1.dev120 → core_lens-0.1.dev123}/tests/unit/test_view.py +0 -0
  77. {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.dev120
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 plotly lonboard
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="kharif", year=2021).fortnightly
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="pearson",
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="mann-whitney",
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="euclidean",
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.write_html("mws_et_trend.html")
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.write_html("mws_scatter.html")
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="kharif", year=2021)
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 plotly lonboard
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
- scatter_fig.show()
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
- dist_fig.show()
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
- corr_fig.show()
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
- heatmap_fig.show()
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.dev120'
22
- __version_tuple__ = version_tuple = (0, 1, 'dev120')
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, ac.ChunkedArray([ac.Array(geo_col)]))
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, names=names)
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
- v_min, v_max = np.nanmin(values), np.nanmax(values)
284
- norm_values = (
285
- (values - v_min) / (v_max - v_min)
286
- if v_max > v_min
287
- else np.zeros_like(values)
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