analysis

import "github.com/umbralcalc/stochadex/pkg/analysis"

Package analysis is the data layer around a simulation: getting time series into a *simulator.StateTimeStorage, addressing series inside one, and rendering them.

It deliberately does not build simulation topologies. The Applied* specs that expand into multi-partition inference, aggregation and optimisation topologies live in pkg/macros, which imports this package for its vocabulary. The dependency runs one way:

pkg/api → pkg/macros → pkg/analysis → pkg/simulator

The vocabulary

DataRef is the shared currency: a partition name plus optional value indices and time range, resolvable against a storage. Both the plotting helpers here and every windowed construction in pkg/macros are expressed in terms of it, which is what lets a config name a series once and use it for either. GroupedStateTimeStorage layers a grouping over a storage so aggregations can be taken per accepted value group.

Getting data in and out

Rendering

plot.go produces go-echarts line and scatter charts, from either a storage (via DataRef) or a DataFrame. ColourGenerator cycles a palette across series.

Index

func AddPartitionsToStateTimeStorage

func AddPartitionsToStateTimeStorage(storage *simulator.StateTimeStorage, partitions []*simulator.PartitionConfig, windowSizeByPartition map[string]int) *simulator.StateTimeStorage

AddPartitionsToStateTimeStorage extends the state time storage with newly generated values from the specified partitions.

For each existing partition name, windowSizeByPartition[name] sets StateHistoryDepth for the FromStorageIteration replay (default 1).

func GetDataFrameFromPartition

func GetDataFrameFromPartition(storage *simulator.StateTimeStorage, partitionName string) dataframe.DataFrame

GetDataFrameFromPartition converts simulation partition data into a Gota DataFrame for convenient data manipulation and analysis.

This function extracts time series data from a simulation partition and converts it into a structured DataFrame format. The resulting DataFrame has a “time” column followed by columns for each state dimension, making it easy to perform data analysis, visualization, and export operations.

DataFrame Structure:

Parameters:

Returns:

Example:

// Extract price data from simulation storage
df := GetDataFrameFromPartition(storage, "prices")

// Access time column
timeCol := df.Col("time")

// Access state columns
price1Col := df.Col("0") // First price dimension
price2Col := df.Col("1") // Second price dimension

// Perform analysis
meanPrice1 := price1Col.Mean()
maxPrice2 := price2Col.Max()

Use Cases:

Performance:

Error Handling:

func NewLinePlotFromDataFrame

func NewLinePlotFromDataFrame(df *dataframe.DataFrame, xAxis string, yAxis string, groupBy ...string) *charts.Line

NewLinePlotFromDataFrame renders a line chart from a dataframe using the specified X and Y columns.

Usage hints:

func NewLinePlotFromPartition

func NewLinePlotFromPartition(storage *simulator.StateTimeStorage, xRef DataRef, yRefs []DataRef, fillYRefs []FillLineRef) *charts.Line

NewLinePlotFromPartition renders a multi-series line chart from storage using an X reference and one or more Y references.

Usage hints:

func NewScatterPlotFromDataFrame

func NewScatterPlotFromDataFrame(df *dataframe.DataFrame, xAxis string, yAxis string, groupBy ...string) *charts.Scatter

NewScatterPlotFromDataFrame renders a scatter plot using columns of a dataframe.

Usage hints:

func NewScatterPlotFromPartition

func NewScatterPlotFromPartition(storage *simulator.StateTimeStorage, xRef DataRef, yRefs []DataRef) *charts.Scatter

NewScatterPlotFromPartition renders a scatter plot from storage-backed DataRef axes.

Usage hints:

func NewStateTimeStorageFromCsv

func NewStateTimeStorageFromCsv(filePath string, timeColumn int, stateColumnsByPartition map[string][]int, skipHeaderRow bool) (*simulator.StateTimeStorage, error)

NewStateTimeStorageFromCsv creates a StateTimeStorage from CSV data.

This function reads time series data from a CSV file and organizes it into partitions for use in stochadex simulations. It supports multiple partitions with different column configurations.

Parameters:

Returns:

CSV Format Requirements:

Example:

// Load data from a CSV with time in column 0, prices in columns 1-2, volumes in column 3
storage, err := NewStateTimeStorageFromCsv(
    "market_data.csv",
    0, // time in first column
    map[string][]int{
        "prices": {1, 2}, // prices partition uses columns 1 and 2
        "volumes": {3},   // volumes partition uses column 3
    },
    true, // skip header row
)
if err != nil {
    log.Fatal("Failed to load CSV data:", err)
}

Error Handling:

Performance Notes:

func NewStateTimeStorageFromJsonLogEntries

func NewStateTimeStorageFromJsonLogEntries(filename string) (*simulator.StateTimeStorage, error)

NewStateTimeStorageFromJsonLogEntries reads a file up to a given number of iterations into a simulator.StateTimeStorage struct.

func NewStateTimeStorageFromPartitions

func NewStateTimeStorageFromPartitions(partitions []*simulator.PartitionConfig, termination simulator.TerminationCondition, timestep simulator.TimestepFunction, initTime float64) *simulator.StateTimeStorage

NewStateTimeStorageFromPartitions generates a new simulator.StateTimeStorage by running a simulation with the specified partitions configured.

func NewStateTimeStorageFromPostgresDb

func NewStateTimeStorageFromPostgresDb(db *PostgresDb, partitionNames []string, startTime float64, endTime float64) (*simulator.StateTimeStorage, error)

NewStateTimeStorageFromPostgresDb reads from a PostgreSQL database over a pre-defined time interval into a simulator.StateTimeStorage struct.

func SetPartitionFromDataFrame

func SetPartitionFromDataFrame(storage *simulator.StateTimeStorage, partitionName string, df dataframe.DataFrame, overwriteTime bool)

SetPartitionFromDataFrame updates a partition’s values from a Gota dataframe with schema [time, 0, 1, …]. If overwriteTime is true, the storage’s time vector is replaced with the “time” column.

func WriteStateTimeStorageToPostgresDb

func WriteStateTimeStorageToPostgresDb(db *PostgresDb, storage *simulator.StateTimeStorage)

WriteStateTimeStorageToPostgresDb writes all of the data in the state time storage to a PostgreSQL database.

type AppliedGrouping

AppliedGrouping configures a grouping transformation on data.

type AppliedGrouping struct {
    GroupBy   []DataRef
    Precision int
}

type ColourGenerator

ColourGenerator iterates over the default ECharts categorical palette.

type ColourGenerator struct {
    // contains filtered or unexported fields
}

func (*ColourGenerator) Next

func (cg *ColourGenerator) Next() string

Next returns the next colour in the ECharts palette, cycling when the end is reached.

type DataPlotting

DataPlotting declares optional transformations for plotting, such as treating a reference as time and restricting to a time index range.

type DataPlotting struct {
    IsTime    bool
    TimeRange *IndexRange
}

type DataRef

DataRef identifies a subset of data stored in StateTimeStorage. It can reference the special time axis or one or more value indices of a partition. Optional plotting hints may be supplied via Plotting.

type DataRef struct {
    PartitionName string
    ValueIndices  []int
    Plotting      *DataPlotting
}

func (*DataRef) GetFromStorage

func (d *DataRef) GetFromStorage(storage *simulator.StateTimeStorage) [][]float64

GetFromStorage returns the entire referenced series. For a time reference, this is a single series containing all times; for a value reference, this is one series per value index.

func (*DataRef) GetSeriesNames

func (d *DataRef) GetSeriesNames(storage *simulator.StateTimeStorage) []string

GetSeriesNames returns human-readable series labels for plotting. Time references are labeled “time”; value references are labeled as “<partition> <index>”.

func (*DataRef) GetTimeIndexFromStorage

func (d *DataRef) GetTimeIndexFromStorage(storage *simulator.StateTimeStorage, timeIndex int) []float64

GetTimeIndexFromStorage returns the data at a specific time index. For a time reference, this is a single-element slice containing the time value; for a value reference, this is the row slice for that time index.

func (*DataRef) GetValueIndices

func (d *DataRef) GetValueIndices(storage *simulator.StateTimeStorage) []int

GetValueIndices returns the referenced value indices, defaulting to all indices within the partition when ValueIndices is nil.

type FillLineRef

FillLineRef specifies an upper and lower bound series used to fill a confidence region in a line plot.

type FillLineRef struct {
    Upper DataRef
    Lower DataRef
}

type GroupedStateTimeStorage

GroupedStateTimeStorage is a representation of simulator.StateTimeStorage which has already had a grouping transformation applied to it.

type GroupedStateTimeStorage struct {
    Storage *simulator.StateTimeStorage
    // contains filtered or unexported fields
}

func NewGroupedStateTimeStorage

func NewGroupedStateTimeStorage(applied AppliedGrouping, storage *simulator.StateTimeStorage) *GroupedStateTimeStorage

NewGroupedStateTimeStorage creates a new GroupedStateTimeStorage given the provided simulator.StateTimeStorage and applied grouping.

func (*GroupedStateTimeStorage) GetAcceptedValueGroupLabels

func (g *GroupedStateTimeStorage) GetAcceptedValueGroupLabels() []string

GetAcceptedValueGroupLabels returns the unique group labels that were found in the data which are typically used for labelling plots.

func (*GroupedStateTimeStorage) GetAcceptedValueGroups

func (g *GroupedStateTimeStorage) GetAcceptedValueGroups(tupIndex int) []float64

GetAcceptedValueGroups returns the unique groups that were found in the data which are typically used to configure group aggregation partitions.

func (*GroupedStateTimeStorage) GetAcceptedValueGroupsLength

func (g *GroupedStateTimeStorage) GetAcceptedValueGroupsLength() int

GetAcceptedValueGroupsLength returns the number of accepted value groups (equivalent to the length of the state vector in simulation partition).

func (*GroupedStateTimeStorage) GetGroupTupleLength

func (g *GroupedStateTimeStorage) GetGroupTupleLength() int

GetGroupTupleLength returns the length of tuple in the grouping index construction.

func (*GroupedStateTimeStorage) GetGroupingPartition

func (g *GroupedStateTimeStorage) GetGroupingPartition(tupIndex int) string

GetGroupingPartitions returns the partition used in the data for grouping.

func (*GroupedStateTimeStorage) GetGroupingValueIndices

func (g *GroupedStateTimeStorage) GetGroupingValueIndices(tupIndex int) []float64

GetGroupingValueIndices returns the value indices used in the data for grouping.

func (*GroupedStateTimeStorage) GetPrecision

func (g *GroupedStateTimeStorage) GetPrecision() int

GetPrecision returns the requested float precision for grouping.

type IndexRange

IndexRange represents an inclusive-exclusive [Lower, Upper) span of indices. It is commonly used to clip time-series windows for plotting.

type IndexRange struct {
    Lower int
    Upper int
}

type PostgresDb

PostgresDb is a struct which can be configured to define interactions with a PostgresSQL database.

type PostgresDb struct {
    User      string
    Password  string
    Dbname    string
    TableName string
    // DB is the database/sql handle used for reads and writes. Set it to your own handle —
    // sql.Open with any DSN or driver (a remote TimescaleDB or another Postgres-wire database
    // with host/port/sslmode, or a pooled *sql.DB) — to use the clean database/sql write path.
    // Leave it nil and OpenTableConnection opens a local Postgres from User/Password/Dbname.
    DB  *sql.DB
}

func NewPostgresDb

func NewPostgresDb(db *sql.DB, tableName string) *PostgresDb

NewPostgresDb returns a PostgresDb backed by a caller-provided database/sql handle — the clean database/sql write path. The handle may target any Postgres-wire database (Postgres, TimescaleDB, QuestDB, …) opened with any DSN or driver; tableName is the destination table.

func (*PostgresDb) OpenTableConnection

func (p *PostgresDb) OpenTableConnection() error

OpenTableConnection connects to the PostgreSQL database or creates it if it doesn’t exist.

func (*PostgresDb) ReadStateInRange

func (p *PostgresDb) ReadStateInRange(partitionName string, startTime float64, endTime float64) (*sql.Rows, error)

ReadStateInRange retrieves all entries between a specified start and end time range for a given partition.

func (*PostgresDb) WriteState

func (p *PostgresDb) WriteState(partitionName string, time float64, state []float64) error

WriteState writes a new partition state value to the database.

type PostgresDbOutputFunction

PostgresDbOutputFunction writes the data from the simulation to a PostgresSQL database when the simulator.OutputCondition is met.

type PostgresDbOutputFunction struct {
    // contains filtered or unexported fields
}

func NewPostgresDbOutputFunction

func NewPostgresDbOutputFunction(db *PostgresDb) *PostgresDbOutputFunction

NewPostgresDbOutputFunction creates a new PostgresDbOutputFunction.

func (*PostgresDbOutputFunction) Configure

func (p *PostgresDbOutputFunction) Configure(*simulator.Settings)

func (*PostgresDbOutputFunction) Output

func (p *PostgresDbOutputFunction) Output(partitionName string, state []float64, cumulativeTimesteps float64)

Generated by gomarkdoc