Kaskada is built on the concept of a Timestream. Each Timestream is ordered by time and partitioned by entity. This makes it easy to focus on events happening over time and how aggregations change.

import asyncio
import kaskada as kd
data = "\n".join(
multi_entity = await kd.sources.CsvString.create(data, time_column="time", key_column="key")

    kd.plot.Plot(multi_entity.col("m"), name="m")


It is useful to consider two kinds of timestreams – discrete and continuous. Like the example we already saw, a discrete timestream consists of values at specific points in time. On the other hand, a continuous timestream represents a value that continues until it changes. While a discrete timestream contains values at specific points in time, a continuous timestream changes at specific points in time.

For example, the result of aggregating a timestream produces a continuous stream that changes on each non-null input.