core-lens 0.1.dev152__tar.gz → 0.1.dev154__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 (91) hide show
  1. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/PKG-INFO +1 -1
  2. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/_version.py +2 -2
  3. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/base/namespaces/stats.py +41 -8
  4. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/base/result.py +1 -1
  5. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/utils/polars_utils.py +1 -1
  6. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/.github/ISSUE_TEMPLATE/blank-proposal.yaml +0 -0
  7. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/.github/ISSUE_TEMPLATE/bug-report.yaml +0 -0
  8. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/.github/ISSUE_TEMPLATE/feature-request.yaml +0 -0
  9. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/.github/pull_request_template.md +0 -0
  10. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/.github/workflows/ci.yml +0 -0
  11. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/.github/workflows/gh-pages.yml +0 -0
  12. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/.github/workflows/pre-release.yml +0 -0
  13. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/.github/workflows/release.yml +0 -0
  14. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/.gitignore +0 -0
  15. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/.gitmessage +0 -0
  16. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/.pre-commit-config.yaml +0 -0
  17. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/.python-version +0 -0
  18. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/CONTRIBUTING.md +0 -0
  19. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/LICENSE +0 -0
  20. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/README.md +0 -0
  21. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/SKILLS.md +0 -0
  22. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/benchmarks/README.md +0 -0
  23. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/benchmarks/bench_aoi.py +0 -0
  24. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/benchmarks/bench_export.py +0 -0
  25. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/benchmarks/bench_polars_utils.py +0 -0
  26. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/benchmarks/bench_result.py +0 -0
  27. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/benchmarks/bench_schema.py +0 -0
  28. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/benchmarks/bench_season.py +0 -0
  29. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/benchmarks/bench_spatial.py +0 -0
  30. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/benchmarks/bench_view.py +0 -0
  31. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/benchmarks/run_all.sh +0 -0
  32. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/docs/Makefile +0 -0
  33. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/docs/make.bat +0 -0
  34. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/docs/source/concepts.md +0 -0
  35. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/docs/source/conf.py +0 -0
  36. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/docs/source/export.md +0 -0
  37. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/docs/source/index.rst +0 -0
  38. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/docs/source/intro.md +0 -0
  39. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/docs/source/logging.md +0 -0
  40. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/docs/source/plots.md +0 -0
  41. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/docs/source/plugins.md +0 -0
  42. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/docs/source/queries.md +0 -0
  43. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/docs/source/quickstart.md +0 -0
  44. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/docs/source/stats.md +0 -0
  45. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/examples/demo_mws.py +0 -0
  46. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/examples/demo_tehsil.py +0 -0
  47. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/hooks/mypy.sh +0 -0
  48. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/hooks/no-parquet-outside-fixtures.sh +0 -0
  49. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/hooks/pytest.sh +0 -0
  50. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/pyproject.toml +0 -0
  51. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/__init__.py +0 -0
  52. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/__main__.py +0 -0
  53. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/aoi.py +0 -0
  54. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/base/__init__.py +0 -0
  55. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/base/entity.py +0 -0
  56. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/base/namespaces/__init__.py +0 -0
  57. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/base/namespaces/plot.py +0 -0
  58. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/base/view.py +0 -0
  59. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/entities/__init__.py +0 -0
  60. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/entities/mws.py +0 -0
  61. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/entities/tehsil.py +0 -0
  62. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/entities/waterbody.py +0 -0
  63. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/export/__init__.py +0 -0
  64. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/export/formats.py +0 -0
  65. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/py.typed +0 -0
  66. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/schema/__init__.py +0 -0
  67. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/schema/detection.py +0 -0
  68. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/schema/profile.py +0 -0
  69. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/utils/__init__.py +0 -0
  70. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/utils/paths.py +0 -0
  71. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/utils/season.py +0 -0
  72. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/src/core_lens/utils/spatial.py +0 -0
  73. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/fixtures/generate_fixtures.py +0 -0
  74. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/conftest.py +0 -0
  75. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_aoi.py +0 -0
  76. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_entities.py +0 -0
  77. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_entity.py +0 -0
  78. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_export.py +0 -0
  79. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_main.py +0 -0
  80. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_plot.py +0 -0
  81. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_polars_utils.py +0 -0
  82. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_profile.py +0 -0
  83. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_result.py +0 -0
  84. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_schema_detection.py +0 -0
  85. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_schema_profile.py +0 -0
  86. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_season.py +0 -0
  87. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_season_config.py +0 -0
  88. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_spatial.py +0 -0
  89. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_stats.py +0 -0
  90. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/tests/unit/test_view.py +0 -0
  91. {core_lens-0.1.dev152 → core_lens-0.1.dev154}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: core-lens
3
- Version: 0.1.dev152
3
+ Version: 0.1.dev154
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
@@ -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.dev152'
22
- __version_tuple__ = version_tuple = (0, 1, 'dev152')
21
+ __version__ = version = '0.1.dev154'
22
+ __version_tuple__ = version_tuple = (0, 1, 'dev154')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -859,9 +859,12 @@ class StatsNamespace:
859
859
  df = self._r.df()
860
860
  key = self._r.key_cols[0]
861
861
 
862
+ min_year: int | None = None
863
+ max_year: int | None = None
864
+
862
865
  # --- Build feature DataFrame ------------------------------------------
863
866
  # Universe of entity keys from result.data.
864
- feat = df.select([key])
867
+ feat = df.select([key]).unique()
865
868
 
866
869
  for col_name, spec in columns.items():
867
870
  if spec is None:
@@ -881,6 +884,23 @@ class StatsNamespace:
881
884
  resolution_str, filter_dict = spec
882
885
  filter_dict = dict(filter_dict) if filter_dict else {}
883
886
 
887
+ if "year" in filter_dict:
888
+ yr = filter_dict["year"]
889
+ y0: int | None = None
890
+ y1: int | None = None
891
+
892
+ if isinstance(yr, (list, tuple)) and len(yr) >= 2:
893
+ y0, y1 = int(yr[0]), int(yr[1])
894
+ elif isinstance(yr, int):
895
+ y0, y1 = yr, yr
896
+
897
+ if y0 is not None:
898
+ if min_year is None or y0 < min_year:
899
+ min_year = y0
900
+ if y1 is not None:
901
+ if max_year is None or y1 > max_year:
902
+ max_year = y1
903
+
884
904
  entity = self._r.entity
885
905
  path: str | None
886
906
  if resolution_str == "static":
@@ -1006,13 +1026,26 @@ class StatsNamespace:
1006
1026
  dists[tidx] = float("inf") # exclude target itself
1007
1027
  top_idx = np.argsort(dists)[:top_n]
1008
1028
 
1009
- data = pl.DataFrame(
1010
- {
1011
- key: [ids[i] for i in top_idx],
1012
- "similarity_score": [float(1.0 / (1.0 + dists[i])) for i in top_idx],
1013
- "rank": list(range(1, len(top_idx) + 1)),
1014
- }
1015
- )
1029
+ if min_year is None and max_year is None:
1030
+ year_col = self._year_col()
1031
+ if year_col and year_col in df.columns:
1032
+ yr_min = df[year_col].min()
1033
+ yr_max = df[year_col].max()
1034
+ if yr_min is not None and yr_max is not None:
1035
+ min_year = int(cast(int, yr_min))
1036
+ max_year = int(cast(int, yr_max))
1037
+
1038
+ output_dict: dict[str, Any] = {
1039
+ key: [ids[i] for i in top_idx],
1040
+ "similarity_score": [float(1.0 / (1.0 + dists[i])) for i in top_idx],
1041
+ "rank": list(range(1, len(top_idx) + 1)),
1042
+ }
1043
+
1044
+ if min_year is not None and max_year is not None:
1045
+ output_dict["year_from"] = [min_year] * len(top_idx)
1046
+ output_dict["year_to"] = [max_year] * len(top_idx)
1047
+
1048
+ data = pl.DataFrame(output_dict)
1016
1049
  metadata: dict[str, Any] = {
1017
1050
  "method": method.value if method is not None else None,
1018
1051
  "target": target,
@@ -174,7 +174,7 @@ class Result:
174
174
  geo_lf = self.entity.geometry_lazy
175
175
  if len(key_cols) == 1 and keys_df.height < 50000:
176
176
  key = key_cols[0]
177
- geo_lf = geo_lf.filter(pl.col(key).is_in(keys_df[key]))
177
+ geo_lf = geo_lf.filter(pl.col(key).is_in(keys_df[key].to_list()))
178
178
  else:
179
179
  geo_lf = geo_lf.join(keys_df.lazy(), on=key_cols, how="semi")
180
180
 
@@ -146,7 +146,7 @@ def scan_with_key_filter(
146
146
  # predicate pushdown in the Parquet reader, avoiding a full table scan.
147
147
  # The literal tree RAM issue only occurs with hundreds of thousands of keys.
148
148
  key = key_cols[0]
149
- lf = lf.filter(pl.col(key).is_in(kv_df[key]))
149
+ lf = lf.filter(pl.col(key).is_in(kv_df[key].to_list()))
150
150
  else:
151
151
  # Fallback to semi-join for massive key arrays (e.g. state-wide scopes)
152
152
  lf = lf.join(kv_df.lazy(), on=key_cols, how="semi")
File without changes
File without changes
File without changes
File without changes