Softanza
DémarrerEnglish
Softanza
Données et langage de base

Tables et données

Une table de données unifiée et large, avec un langage de motifs ; mais pas de jointure, et le groupement s'exécute hors du moteur.

2 Strong · 6 Solid · 3 Partial · 1 Emerging

Mesuré contre : pandas · Polars · DuckDB · Dossiers : base/table(s'ouvre dans un nouvel onglet) · base/data(s'ouvre dans un nouvel onglet) · Pour les programmeurs : la référence de ce domaine

huit régions du Niger, une table composée par le moteur
huit régions du Niger, une table composée par le moteur. rendu le 2026-10-01 à 04:00 par le script de rendu du site tools/areas.ring, exécuté dans la bibliothèque au commit 0e72e2e2c · la source(s'ouvre dans un nouvel onglet)

Repensé depuis les premiers principes

Ce que Softanza a gardé de ce qui marche, et ce qu'elle a repensé, tel que la bibliothèque l'a écrit dans ses documents de conception et ses narrations.

La manière SoftanzaUne table est une grille qu'on lit comme un tableur — colonnes nommées, lignes et cellules — et chaque colonne est une liste qu'on peut interroger.

Gardé des meilleures pratiques

  • Les données sont rangées par colonne, car les colonnes ont un nom et pas les lignes, et l'analyse de données traite chaque variable comme une colonne. source(s'ouvre dans un nouvel onglet)
  • Les fonctions de tableur familières (SUM, AVERAGE, MIN, MAX, PRODUCT), le regroupement avec agrégats et les tableaux croisés s'appliquent directement à une table. source(s'ouvre dans un nouvel onglet)
  • Des formats standard en entrée et en sortie : CSV, JSON et tableaux HTML, plus du vrai SQL grâce à une base SQLite embarquée (stzDatabase). source(s'ouvre dans un nouvel onglet)

Repensé

  • Les méthodes parlent clair — AddRow, RemoveCol, Cell, FindInCol — comme on pense une table, plutôt qu'en jargon de data frame, pour un apprentissage en douceur. source(s'ouvre dans un nouvel onglet)
  • Une colonne est une liste : ce qu'on demande à une liste — somme, filtre par condition — se demande aussi à une colonne, et qui sait les listes sait les tables. source(s'ouvre dans un nouvel onglet)
  • Les tables se valident par motif : une seule expression stzTablex décrit forme, clés uniques, valeurs manquantes et moyennes, au lieu d'un code de vérification procédural. source(s'ouvre dans un nouvel onglet)
  • Une table confie sa colonne à l'objet statistique au lieu de recalculer elle-même, car les définitions dupliquées divergent : deux classes ont déjà donné 4 et 4,57 pour une variance. source(s'ouvre dans un nouvel onglet)

One enormous unified class, 2,517 methods with eleven sibling caps merged into a single stzTable, with engine-backed sort, aggregates, calculated columns, describe and pivot, plus a distinctive multi-table TableX pattern-query language. Measured against pandas, Polars and DuckDB it has three real holes: there is no join at all; group-by and filter run Haro-side even though engine bridges for both sit exported-but-unused; and the columnar engine is used per-operation, not as the live store.

Ce qu'un artisan en fait, et ce qui se distingue

  • A multi-table TableX pattern-query language with no direct peer
  • A copy-free index-permutation engine sort
  • Engine-first calculated columns, compile-once over all rows, guarded at 50k rows
  • Eleven sibling caps merged into one stzTable namespace

Ce qui est dû

  • Add joins: there is no join anywhere in the tables lane
  • Wire group-by and filter to the engine bridges already compiled and exported
  • Finish the 11-to-1 fidelity grind (150 of 251 legacy tests error)
  • Missing-data toolkit (fillna / dropna) and melt / unpivot

La manière Softanza, exécutée

Ce que Softanza fait autrement dans ce domaine, montré par du code tiré de ses narrations et de ses gardes, et exécuté pour cette page.

Une colonne est une liste : on peut la sommer ou y chercher avec une condition, comme dans toute liste.

Softanza
oT = new stzTable([
	[ :DISH, :PRICE, :ORDERS ],
	[ "tea",  200, 6 ],
	[ "rice", 500, 3 ],
	[ "fish", 900, 2 ]
])
? StzListQ(oT.Col(:ORDERS)).Sum()
? @@( StzListQ(oT.Col(:PRICE)).FindW("{ @item > 400 }") )
Sortie
11
[ 2, 3 ]

exécuté le 2026-10-01 21:17 dans la bibliothèque au commit 0e72e2e2c ; tiré de base/education/program/courses/elementary-introduction/chapters/10-when-code-meets-cells.en.md(s'ouvre dans un nouvel onglet)

Une table construite colonne par colonne donne la médiane ou le premier quartile grâce au moteur statistique commun.

Softanza
oT = new stzTable([
	[:age,    [20, 25, 30, 35, 40]],
	[:income, [30, 42, 51, 66, 80]],
	[:city,   ["a", "b", "c", "d", "e"]]
])
Then("MedianCol(age) is 30", oT.MedianCol(:age), 30)
Then("Q1Col(age) is 25", oT.Q1Col(:age), 25)
Sortie
  THEN  MedianCol(age) is 30  [PASS]
  THEN  Q1Col(age) is 25  [PASS]

exécuté le 2026-10-01 21:17 dans la bibliothèque au commit 0e72e2e2c ; tiré de base/test/table/table_statistics_narrated.ring(s'ouvre dans un nouvel onglet)

Les articles de ce domaine (2)

Les couloirs, un par un

Les couloirs et leurs notes sont cités tels qu'ils ont été lus à la source, le Read from the source on 2026-09-16.

Deux lectures. La carte de l'Atlas (v21, 2026-09-30) donne 2 Strong, 6 Solid, 3 Partial, 1 Emerging ; la page du groupe, lue le Read from the source on 2026-09-16, note ses couloirs 2, 7, 3, 0. Les couloirs ci-dessous sont ceux de la page du groupe ; la carte est la lecture la plus récente.

Calculated and derived columns
Strong
AddCalculatedCol with an @(:ColName) formula lowered engine-first through StzEngineListEvalRows (compile-once), Haro eval() fallback; guarded at 50k rowsStzEngineListEvalRows; narrated calc-column guard
Sort and order
Strong
SortOn(col) via StzEngineTableSortOn to table.zig sortOnColumn: an index-permutation pdq sort that moves companion columns without copying row objectstable.zig sortOnColumn
Construction and I/O
Solid
From list-of-columns or hashlist; CSV, JSON, HTML round-trips; SQLite via stzDatabase; no Parquet/Arrow/Excel; FromJson is #TODO; iscsv guards fail (collision)base/file/stzCSV; test/csv
Columns, typing and access
Solid
Per-column type_hint and per-cell tags in table.zig; Cell/Row/Col/Section access; legacy aliases (colsection, rowz, cellsincol) error after the 11-to-1 mergetable.zig
Select, project, filter
Solid
Filter, FilterBy, FilterW/FilterWXT and TableX multi-table querying over stzListOfTables; all Haro-side, the engine FilterRows exists but is never called
Reshape: pivot and transpose
Solid
stzPivotTable + stzPivotTableShow engine-backed via StzEnginePivotCrossTab / PivotGroupBy, plus Transpose variants; no melt / unpivot / wide-to-longStzEnginePivotCrossTab / PivotGroupBy
Describe and summary stats
Solid
Describe() engine-backed through frame.zig (StzEngineFrameDescribeAll: 8 stats per column) plus whole-table regression (StzEngineFrameRegression)frame.zig StzEngineFrameDescribeAll
The unified hierarchy and TableX
Solid
Eleven caps merged into one stzTable namespace, old classes survive as ~1 KB shells; TableX pattern language over tables; 150 legacy tests left erroring
Aggregates (scalar column)
Solid
StzEngineTableSumCol / AvgCol / MinCol / MaxCol / ProductCol / CountNonNull: cache-friendly columnar scans, engine-backedStzEngineTableSumCol et al.
Group-by (grouped aggregation)
Partial
GroupBy/GroupByXT work as pure Haro row-wise hash-string keying; the engine groupByAggregate (GroupBy) has O(n) hashed keys but stzTable never calls ittable.zig groupByAggregate / GroupBy (unused)
Missing-data handling
Partial
Per-cell null tags, AllItemsAreNull, CountNonNull and TableX null checks; no fillna / dropna / interpolate / forward-fill family
Columnar scale and SQL
Partial
A real columnar engine (table.zig) and SQLite via stzDatabase, but the Haro table marshals row-wise @aContent per operation; no query planner, no lazy executiontable.zig; db.zig