core-lens 0.1.dev174__tar.gz → 0.1.dev175__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 (93) hide show
  1. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/PKG-INFO +1 -1
  2. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/benchmarks/bench_view.py +1 -1
  3. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/_version.py +2 -2
  4. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/base/namespaces/plot.py +32 -18
  5. core_lens-0.1.dev174/parse_scalene.py +0 -50
  6. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/.github/ISSUE_TEMPLATE/blank-proposal.yaml +0 -0
  7. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/.github/ISSUE_TEMPLATE/bug-report.yaml +0 -0
  8. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/.github/ISSUE_TEMPLATE/feature-request.yaml +0 -0
  9. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/.github/pull_request_template.md +0 -0
  10. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/.github/workflows/ci.yml +0 -0
  11. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/.github/workflows/gh-pages.yml +0 -0
  12. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/.github/workflows/pre-release.yml +0 -0
  13. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/.github/workflows/release.yml +0 -0
  14. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/.gitignore +0 -0
  15. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/.gitmessage +0 -0
  16. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/.pre-commit-config.yaml +0 -0
  17. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/.python-version +0 -0
  18. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/CONTRIBUTING.md +0 -0
  19. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/LICENSE +0 -0
  20. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/README.md +0 -0
  21. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/SKILLS.md +0 -0
  22. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/benchmarks/README.md +0 -0
  23. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/benchmarks/bench_aoi.py +0 -0
  24. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/benchmarks/bench_entity.py +0 -0
  25. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/benchmarks/bench_export.py +0 -0
  26. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/benchmarks/bench_polars_utils.py +0 -0
  27. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/benchmarks/bench_result.py +0 -0
  28. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/benchmarks/bench_schema.py +0 -0
  29. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/benchmarks/bench_season.py +0 -0
  30. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/benchmarks/bench_spatial.py +0 -0
  31. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/benchmarks/run_all.sh +0 -0
  32. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/docs/Makefile +0 -0
  33. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/docs/make.bat +0 -0
  34. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/docs/source/concepts.md +0 -0
  35. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/docs/source/conf.py +0 -0
  36. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/docs/source/export.md +0 -0
  37. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/docs/source/index.rst +0 -0
  38. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/docs/source/intro.md +0 -0
  39. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/docs/source/logging.md +0 -0
  40. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/docs/source/plots.md +0 -0
  41. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/docs/source/plugins.md +0 -0
  42. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/docs/source/queries.md +0 -0
  43. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/docs/source/quickstart.md +0 -0
  44. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/docs/source/stats.md +0 -0
  45. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/examples/demo_mws.py +0 -0
  46. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/examples/demo_tehsil.py +0 -0
  47. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/hooks/mypy.sh +0 -0
  48. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/hooks/no-parquet-outside-fixtures.sh +0 -0
  49. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/hooks/pytest.sh +0 -0
  50. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/pyproject.toml +0 -0
  51. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/__init__.py +0 -0
  52. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/__main__.py +0 -0
  53. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/aoi.py +0 -0
  54. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/base/__init__.py +0 -0
  55. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/base/entity.py +0 -0
  56. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/base/namespaces/__init__.py +0 -0
  57. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/base/namespaces/stats.py +0 -0
  58. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/base/result.py +0 -0
  59. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/base/view.py +0 -0
  60. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/entities/__init__.py +0 -0
  61. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/entities/mws.py +0 -0
  62. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/entities/tehsil.py +0 -0
  63. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/entities/waterbody.py +0 -0
  64. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/export/__init__.py +0 -0
  65. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/export/formats.py +0 -0
  66. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/py.typed +0 -0
  67. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/schema/__init__.py +0 -0
  68. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/schema/detection.py +0 -0
  69. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/schema/profile.py +0 -0
  70. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/utils/__init__.py +0 -0
  71. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/utils/paths.py +0 -0
  72. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/utils/polars_utils.py +0 -0
  73. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/utils/season.py +0 -0
  74. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/src/core_lens/utils/spatial.py +0 -0
  75. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/fixtures/generate_fixtures.py +0 -0
  76. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/conftest.py +0 -0
  77. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_aoi.py +0 -0
  78. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_entities.py +0 -0
  79. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_entity.py +0 -0
  80. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_export.py +0 -0
  81. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_main.py +0 -0
  82. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_plot.py +0 -0
  83. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_polars_utils.py +0 -0
  84. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_profile.py +0 -0
  85. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_result.py +0 -0
  86. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_schema_detection.py +0 -0
  87. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_schema_profile.py +0 -0
  88. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_season.py +0 -0
  89. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_season_config.py +0 -0
  90. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_spatial.py +0 -0
  91. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_stats.py +0 -0
  92. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/tests/unit/test_view.py +0 -0
  93. {core_lens-0.1.dev174 → core_lens-0.1.dev175}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: core-lens
3
- Version: 0.1.dev174
3
+ Version: 0.1.dev175
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
@@ -2,7 +2,7 @@
2
2
  =======================================================
3
3
  Targets:
4
4
  - View.where() attribute filter (Polars semi-join on static file)
5
- - View.spatial_filter() STRtree filter narrowing existing keys
5
+ - View.spatial_filter() vectorized centroid test (or STRtree for area)
6
6
  - View.between() time-filter dict construction (no I/O)
7
7
  - View.between(season=CURRENT) current-season resolution
8
8
  - View.between(year=tuple) year-range season filter
@@ -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.dev174'
22
- __version_tuple__ = version_tuple = (0, 1, 'dev174')
21
+ __version__ = version = '0.1.dev175'
22
+ __version_tuple__ = version_tuple = (0, 1, 'dev175')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -731,31 +731,45 @@ class PlotNamespace:
731
731
  )
732
732
 
733
733
  entities = df.get_column(key_col).unique().to_list()
734
- for i, entity in enumerate(entities):
735
- row = df.filter(pl.col(key_col) == entity)
736
-
737
- # Replace None with NaN for numeric columns to prevent Bokeh JS rendering crashes
738
- source_data = {}
739
- for c in hover_cols:
740
- if c in row.columns:
741
- lst = row.get_column(c).to_list()
742
- if row.schema[c].is_numeric():
743
- lst = [float("nan") if v is None else v for v in lst]
744
- source_data[c] = lst
745
-
746
- source = ColumnDataSource(source_data) # type: ignore[arg-type]
734
+
735
+ if len(entities) > 20:
736
+ # Fast path: single dataset, single colour, no legend
737
+ pdf = df.drop_nulls(subset=[x, y_col]).select(hover_cols).to_pandas()
738
+ source = ColumnDataSource(pdf)
747
739
  fig.scatter(
748
740
  x=x,
749
741
  y=y_col,
750
742
  source=source,
751
- color=_color_for(i),
752
- legend_label=str(entity),
743
+ color=_color_for(0),
753
744
  size=8,
754
745
  alpha=0.7,
755
746
  )
756
- if fig.legend:
757
- fig.legend.click_policy = "hide"
758
- fig.add_layout(fig.legend[0], "right")
747
+ else:
748
+ for i, entity in enumerate(entities):
749
+ row = df.filter(pl.col(key_col) == entity)
750
+
751
+ # Replace None with NaN for numeric columns to prevent Bokeh JS rendering crashes
752
+ source_data = {}
753
+ for c in hover_cols:
754
+ if c in row.columns:
755
+ lst = row.get_column(c).to_list()
756
+ if row.schema[c].is_numeric():
757
+ lst = [float("nan") if v is None else v for v in lst]
758
+ source_data[c] = lst
759
+
760
+ source = ColumnDataSource(source_data) # type: ignore[arg-type]
761
+ fig.scatter(
762
+ x=x,
763
+ y=y_col,
764
+ source=source,
765
+ color=_color_for(i),
766
+ legend_label=str(entity),
767
+ size=8,
768
+ alpha=0.7,
769
+ )
770
+ if fig.legend:
771
+ fig.legend.click_policy = "hide"
772
+ fig.add_layout(fig.legend[0], "right")
759
773
  _apply_theme(fig, self.result, "Scatter Distribution")
760
774
  return fig
761
775
 
@@ -1,50 +0,0 @@
1
- import json
2
- import glob
3
- import os
4
-
5
- profiles = glob.glob('/home/akashyap54/workstation/Projects/benchmarks/profiles/*_profile.json')
6
-
7
- for profile in profiles:
8
- name = os.path.basename(profile).replace('_profile.json', '')
9
- try:
10
- d = json.load(open(profile))
11
- except Exception as e:
12
- print(f"Error loading {name}: {e}")
13
- continue
14
-
15
- print(f"\n# {name.upper()}")
16
- print("-" * 40)
17
-
18
- line_stats = []
19
-
20
- for filename, f_data in d.get('files', {}).items():
21
- short_filename = os.path.basename(filename)
22
- for line_data in f_data.get('lines', []):
23
- cpu_percent = line_data.get('n_cpu_percent_c', 0) + line_data.get('n_cpu_percent_python', 0)
24
- malloc_mb = line_data.get('n_malloc_mb', 0)
25
- peak_mb = line_data.get('n_peak_mb', 0)
26
- line_str = line_data.get('line', '').strip()
27
- lineno = line_data.get('lineno', 0)
28
-
29
- if cpu_percent > 0 or malloc_mb > 0 or peak_mb > 0:
30
- line_stats.append({
31
- 'file': short_filename,
32
- 'lineno': lineno,
33
- 'line': line_str[:60] + ('...' if len(line_str) > 60 else ''),
34
- 'cpu': cpu_percent,
35
- 'malloc_mb': malloc_mb,
36
- 'peak_mb': peak_mb
37
- })
38
-
39
- # Top 5 by CPU
40
- print(f"Top 5 lines by CPU %:")
41
- top_cpu = sorted(line_stats, key=lambda x: x['cpu'], reverse=True)[:5]
42
- for x in top_cpu:
43
- print(f" {x['file']}:{x['lineno']} | CPU: {x['cpu']:.1f}% | Line: {x['line']}")
44
-
45
- # Top 5 by Malloc
46
- print(f"\nTop 5 lines by Memory Allocation (MB):")
47
- top_mem = sorted(line_stats, key=lambda x: x['malloc_mb'], reverse=True)[:5]
48
- for x in top_mem:
49
- if x['malloc_mb'] > 0:
50
- print(f" {x['file']}:{x['lineno']} | Malloc: {x['malloc_mb']:.1f} MB | Line: {x['line']}")
File without changes
File without changes
File without changes
File without changes