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.
Files changed (77) hide show
  1. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/PKG-INFO +1 -1
  2. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/examples/demo_mws.py +20 -8
  3. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/examples/demo_tehsil.py +1 -1
  4. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/_version.py +2 -2
  5. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/base/namespaces/plot.py +34 -10
  6. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.github/pull_request_template.md +0 -0
  7. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.github/workflows/ci.yml +0 -0
  8. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.github/workflows/gh-pages.yml +0 -0
  9. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.github/workflows/pre-release.yml +0 -0
  10. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.github/workflows/release.yml +0 -0
  11. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.gitignore +0 -0
  12. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.gitmessage +0 -0
  13. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.pre-commit-config.yaml +0 -0
  14. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/.python-version +0 -0
  15. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/CONTRIBUTING.md +0 -0
  16. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/LICENSE +0 -0
  17. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/README.md +0 -0
  18. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/SKILLS.md +0 -0
  19. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/Makefile +0 -0
  20. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/make.bat +0 -0
  21. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/concepts.md +0 -0
  22. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/conf.py +0 -0
  23. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/export.md +0 -0
  24. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/index.rst +0 -0
  25. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/intro.md +0 -0
  26. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/logging.md +0 -0
  27. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/plots.md +0 -0
  28. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/plugins.md +0 -0
  29. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/queries.md +0 -0
  30. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/quickstart.md +0 -0
  31. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/docs/source/stats.md +0 -0
  32. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/hooks/mypy.sh +0 -0
  33. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/hooks/no-parquet-outside-fixtures.sh +0 -0
  34. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/hooks/pytest.sh +0 -0
  35. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/pyproject.toml +0 -0
  36. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/__init__.py +0 -0
  37. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/__main__.py +0 -0
  38. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/aoi.py +0 -0
  39. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/base/__init__.py +0 -0
  40. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/base/entity.py +0 -0
  41. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/base/namespaces/__init__.py +0 -0
  42. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/base/namespaces/stats.py +0 -0
  43. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/base/result.py +0 -0
  44. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/base/view.py +0 -0
  45. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/entities/__init__.py +0 -0
  46. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/entities/mws.py +0 -0
  47. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/entities/tehsil.py +0 -0
  48. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/entities/waterbody.py +0 -0
  49. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/export/__init__.py +0 -0
  50. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/export/formats.py +0 -0
  51. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/py.typed +0 -0
  52. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/schema/__init__.py +0 -0
  53. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/schema/detection.py +0 -0
  54. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/schema/profile.py +0 -0
  55. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/utils/__init__.py +0 -0
  56. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/utils/polars_utils.py +0 -0
  57. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/utils/season.py +0 -0
  58. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/src/core_lens/utils/spatial.py +0 -0
  59. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/fixtures/generate_fixtures.py +0 -0
  60. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/conftest.py +0 -0
  61. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_aoi.py +0 -0
  62. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_entities.py +0 -0
  63. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_entity.py +0 -0
  64. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_export.py +0 -0
  65. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_main.py +0 -0
  66. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_plot.py +0 -0
  67. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_polars_utils.py +0 -0
  68. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_profile.py +0 -0
  69. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_result.py +0 -0
  70. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_schema_detection.py +0 -0
  71. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_schema_profile.py +0 -0
  72. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_season.py +0 -0
  73. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_season_config.py +0 -0
  74. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_spatial.py +0 -0
  75. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_stats.py +0 -0
  76. {core_lens-0.1.dev121 → core_lens-0.1.dev124}/tests/unit/test_view.py +0 -0
  77. {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.dev121
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 show, save
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="kharif", year=2021).fortnightly
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="pearson",
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="mann-whitney",
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="euclidean",
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(scatter_fig, filename="mws_scatter.html")
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="kharif", year=2021)
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
  )
@@ -33,7 +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, save
36
+ from bokeh.io import show
37
37
 
38
38
 
39
39
  DATA_ROOT = "data/"
@@ -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.dev121'
22
- __version_tuple__ = version_tuple = (0, 1, 'dev121')
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, 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
 
@@ -447,8 +468,9 @@ class PlotNamespace:
447
468
  size=5,
448
469
  )
449
470
 
450
- fig.legend.location = "top_left"
451
- fig.legend.click_policy = "hide"
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.location = "top_left"
556
- fig.legend.click_policy = "hide"
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.location = "top_right"
625
- fig.legend.click_policy = "hide"
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