Skip to content

Commit 8843bc2

Browse files
committed
Add analysis package for large-scale data analysis
1 parent 59b1bb4 commit 8843bc2

11 files changed

Lines changed: 5211 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,74 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Added
1111

12+
#### Data Analysis Module (December 11, 2025)
13+
14+
New `stellium.analysis` package for large-scale astrological data analysis. Requires optional dependency: `pip install stellium[analysis]`
15+
16+
- **BatchCalculator**: Efficiently calculate 100s-1000s of charts at once
17+
- Factory methods: `from_registry()` (with filters), `from_natives()`, `from_iterable()`
18+
- Fluent configuration: `.with_house_systems()`, `.with_aspects()`, `.add_analyzer()`
19+
- Generator-based `.calculate()` for memory efficiency or `.calculate_all()` for convenience
20+
- Progress tracking via `.with_progress(callback)`
21+
22+
- **DataFrame Builders**: Convert charts to pandas DataFrames in three schemas
23+
- `charts_to_dataframe()`: One row per chart (sun/moon signs, element counts, patterns, etc.)
24+
- `positions_to_dataframe()`: One row per celestial position (for position distribution analysis)
25+
- `aspects_to_dataframe()`: One row per aspect (for aspect frequency analysis)
26+
27+
- **ChartQuery**: Fluent interface for filtering chart collections by astrological criteria
28+
- Position filters: `where_sun()`, `where_moon()`, `where_planet()`, `where_angle()`
29+
- Aspect filters: `where_aspect(obj1, obj2, aspect=, orb_max=)`
30+
- Pattern filters: `where_pattern("Grand Trine")`
31+
- Element/modality: `where_element_dominant()`, `where_modality_dominant()`
32+
- Custom predicates: `where_custom(lambda chart: ...)`
33+
- Results: `.results()`, `.count()`, `.first()`, `.to_dataframe()`
34+
35+
- **ChartStats**: Statistical aggregation across chart collections
36+
- Distributions: `element_distribution()`, `modality_distribution()`, `sign_distribution()`
37+
- Frequencies: `aspect_frequency()`, `pattern_frequency()`, `retrograde_frequency()`
38+
- Cross-tabulation: `cross_tab("sun_sign", "moon_sign")` returns pandas contingency table
39+
- Summary: `summary()` returns comprehensive statistics dict
40+
41+
- **Export Utilities**: Save chart data to files
42+
- `export_csv(charts, path, schema="charts"|"positions"|"aspects")`
43+
- `export_json(charts, path, lines=False)` - standard JSON or JSON Lines
44+
- `export_parquet(charts, path, schema=...)` - columnar format for big data
45+
46+
- **36 comprehensive tests** in `tests/test_analysis.py`
47+
48+
- **Interactive Jupyter Notebook Cookbook**: `examples/analysis_cookbook.ipynb`
49+
- BatchCalculator usage patterns
50+
- DataFrame conversion examples with pandas
51+
- ChartQuery filtering examples
52+
- ChartStats statistical analysis
53+
- Export utilities
54+
- Full workflow examples (element distribution in scientists vs artists, etc.)
55+
56+
Example usage:
57+
58+
```python
59+
from stellium.analysis import BatchCalculator, ChartQuery, ChartStats, charts_to_dataframe
60+
61+
# Calculate charts for all scientists in the registry
62+
charts = (BatchCalculator
63+
.from_registry(category="scientist", verified=True)
64+
.with_aspects()
65+
.calculate_all())
66+
67+
# Convert to DataFrame
68+
df = charts_to_dataframe(charts)
69+
print(df['sun_sign'].value_counts())
70+
71+
# Query for specific criteria
72+
grand_trines = ChartQuery(charts).where_pattern("Grand Trine").results()
73+
74+
# Statistical analysis
75+
stats = ChartStats(charts)
76+
print(stats.element_distribution())
77+
print(stats.sign_distribution("Sun"))
78+
```
79+
1280
### Changed
1381

1482
### Fixed

README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ If you want to support development [you can leave a tip if you like](https://ko-
3737

3838
### **For Astrologers**
3939

40+
- **Large-scale data analysis** with pandas DataFrames, batch calculation, and statistical tools
4041
- **Both tropical and sidereal zodiacs** with 9 ayanamsa systems for Vedic astrology
4142
- **23+ house systems** including Placidus, Whole Sign, Koch, Equal, Regiomontanus, and more (see the [full list](docs/options_list.md))
4243
- **Declination calculations** with out-of-bounds planet detection and parallel/contraparallel aspects
@@ -98,6 +99,13 @@ pip install stellium
9899
- Python 3.11 or higher
99100
- All dependencies installed automatically (pyswisseph, pytz, geopy, rich, svgwrite)
100101

102+
### Optional Dependencies
103+
104+
```bash
105+
# For data analysis with pandas DataFrames
106+
pip install stellium[analysis]
107+
```
108+
101109
---
102110

103111
## Quick Start
@@ -502,6 +510,30 @@ data = chart.to_dict()
502510
# - Chart metadata (date, location, timezone)
503511
```
504512

513+
### Data Analysis (pandas Integration)
514+
515+
Batch calculate charts and analyze with pandas DataFrames:
516+
517+
```python
518+
from stellium.analysis import BatchCalculator, ChartStats, charts_to_dataframe
519+
520+
# Calculate 100s of charts from the notables database
521+
charts = BatchCalculator.from_registry(category="scientist").calculate_all()
522+
523+
# Convert to pandas DataFrame
524+
df = charts_to_dataframe(charts)
525+
print(df['sun_sign'].value_counts())
526+
527+
# Statistical analysis
528+
stats = ChartStats(charts)
529+
print(stats.element_distribution())
530+
print(stats.sign_distribution("Sun"))
531+
```
532+
533+
Requires: `pip install stellium[analysis]`
534+
535+
See the [analysis cookbook](examples/analysis_cookbook.ipynb) for comprehensive examples.
536+
505537
### Performance
506538

507539
```python
@@ -538,6 +570,7 @@ The `/examples` directory contains comprehensive, runnable cookbooks:
538570
| **[profections_cookbook.py](examples/profections_cookbook.py)** | 24 examples: annual, monthly profections for multiple points |
539571
| **[zodiacal_releasing_cookbook.py](examples/zodiacal_releasing_cookbook.py)** | 14 examples: ZR timelines, snapshots, peaks, Loosing of Bond, reports |
540572
| **[dial_cookbook.py](examples/dial_cookbook.py)** | 16 examples: Uranian 90°/45°/360° dials, midpoints, pointers, transits, themes |
573+
| **[analysis_cookbook.ipynb](examples/analysis_cookbook.ipynb)** | Jupyter notebook: batch calculation, pandas DataFrames, queries, statistics, export |
541574

542575
```bash
543576
# Run any cookbook
@@ -681,6 +714,7 @@ See [TODO.md](TODO.md) for the full development roadmap.
681714

682715
### Recently Added
683716

717+
-**Data Analysis Module** - Batch calculation, pandas DataFrames, queries, statistics
684718
-**Sidereal Zodiac Support** - 9 ayanamsa systems (Lahiri, Fagan-Bradley, Raman, etc.)
685719
-**Declination Calculations** - Out-of-bounds detection, equatorial coordinates
686720
-**Bi-Wheel Charts** - Synastry, transits, progressions, composite charts

0 commit comments

Comments
 (0)