# Deedle: F# data frames and time series for exploratory .NET work

> Deedle is an F# library for structured data frames, ordered and unordered data, and time series, built for use from the F# and C# interactive consoles. It covers indexing and slicing, joining and aligning, missing values, grouping and aggregation, plus statistics, with a companion Deedle.MathNetNumerics package for linear algebra and finance.

**fslaborg/Deedle** — Easy to use .NET library for data and time series manipulation and for scientific programming

- Repository: https://github.com/fslaborg/Deedle
- Website: http://fslab.org/Deedle/
- Stars: 1,006 · Forks: 189
- Language: F#
- License: BSD-2-Clause
- Published: 2026-10-19 · Updated: 2026-10-19 · Language: en
- Canonical page: https://hysenlabs.com/projects/fslaborg-deedle

## Deedle models frames, series and missing values as one data layer

Deedle is described as an easy to use library for data and time series manipulation and for scientific programming, and its central promise is a single structure family that covers several kinds of tabular work. It supports structured data frames, ordered and unordered data, and time series, which is the distinction that matters when you are deciding whether one library can absorb a task. A frame behaves like a table with named columns, a series is a named collection of values with an index, and the index itself may be ordered, unordered or time based. The library implements a wide range of operations over these structures: advanced indexing and slicing, joining and aligning data, handling of missing values, grouping and aggregation, and statistics. The design target is stated plainly in the README. Deedle is meant to work well for exploratory programming in the F# and C# interactive console, while still being usable in efficient compiled .NET code. That dual goal is the reason the library exists as an F# project with a documented C# surface, and it is why the documentation set includes a page on the idiomatic C# API rather than leaving C# users to guess.

## Three modules split the work: Series, Frame and Stats

The API reference divides the library into three modules, and the division tells you most of what the library is built around. The Series module is for working with data and time series values, so it holds the primitives that deal with a single named collection, its index, slicing and time based operations. The Frame module covers data frame manipulation, which is where the multi column structure and its operations live, including the joining and aligning behaviour mentioned above. The Stats module is described as providing statistical functions, moving windows and more, and the separate documentation page for time series features lists sliding windows, sampling and statistics as the covered ground. So the architecture is not a deep hierarchy of types but a flat set of three surfaces, one per kind of operation, with the frame sitting on top of series. The repository layout backs that up. The source lives under src, tests under tests and Deedle.Tests.nunit at the root holds the test project, and the solution file Deedle.sln plus a Directory.Build.props at the root drive the build for all of it.

## Building the source with dotnet tool restore and paket restore

The build instructions ask for the .NET SDK 9.0 or higher, and then three commands. Restore the local dotnet tools, restore the Paket dependencies, then run the platform specific build script. On Linux and macOS the script is build.sh, and on Windows it is build.ps1, both of which sit at the repository root next to the solution file.

```bash
dotnet tool restore
dotnet paket restore
./build.sh        # Linux/Mac
.\build.ps1       # Windows
```

What you should see is a successful build of the solution with the test project included, since the test project is part of the same solution rather than a separate repository. The dependency story is worth understanding before you run any of it. The root of the repository contains a .paket directory, a paket.dependencies file and a paket.lock file, and there is a global.json file as well. That means dependencies are managed by Paket with a committed lock file rather than by the plain NuGet restore that a new project would use, and the .config directory at the root holds the corresponding dotnet tool manifest, which is what the first command in the block installs from. The two restore steps are not interchangeable, and skipping the Paket step is the most likely cause of a build that fails to resolve references. The README also points to a continuous integration workflow badge for the master branch, so the same commands are what CI runs.

## Deedle.MathNetNumerics adds linear algebra, matrix products and finance functions

Deedle ships a second package, Deedle.MathNetNumerics, which the README describes as an extension for functions related to linear algebra, statistical analysis and financial analysis. It has a dependency on MathNet.Numerics, and its documentation lists four modules. The LinearAlgebra module provides linear algebra functions on a frame, the Matrix module provides matrix multiplication between a frame, a series, a matrix and a vector, and those operations are also available through type extensions, so they can be called without explicitly opening the module. The Stats module in this package provides extra statistical functions on frames and series by applying existing functions in MathNet.Numerics, and the Finance module provides statistical functions specific to the finance domain. The practical point for an adopter is that Deedle keeps the numerical weight in MathNet.Numerics rather than duplicating it, and the extension package is where the bridge sits. Both packages are on NuGet, as Deedle and Deedle.MathNetNumerics, and the build status badges in the README point at the package listings. If your project already depends on MathNet.Numerics, that shared dependency is the main thing to verify before you commit to this arrangement, because a version conflict there would surface at restore time rather than in your own code.

## A missing value model means the API has to answer what a gap means

Every data tool in this space has to decide what an absent value is, and that decision leaks into the API. Deedle lists handling of missing values as one of its core operation groups, alongside indexing, joining, grouping and statistics, which tells you the library treats absence as a first class part of the data model rather than as an afterthought bolted onto a numeric array. This is a design position with consequences for the caller. A library that models missing values explicitly can carry a gap through a join, a group or a moving window without the caller pre-filling it, and can distinguish between a value that is zero and a value that is not there. The documentation pages for data frame features and for time series features are where these operations are demonstrated, with slicing, joining, grouping and aggregation on one side and sliding windows, sampling and statistics on the other. The cost of the choice is that the API is shaped around the gap rather than around a plain numeric type, and code that assumes every cell has a value will need to be written differently. For a reader coming from pandas, the two scenario tutorials, one on analysing stock prices and one on cleaning messy data, are the fastest way to see how the library expects the missing value question to be handled in practice.

## No GitHub releases, so the version history lives in the repository

The repository has no GitHub releases, which is an unusual shape for a library of this age and it changes how you judge its upkeep. There is a RELEASE_NOTES.md file at the repository root, and that, together with the commit history, is where version history is recorded rather than in tagged GitHub release entries. The repository is not archived, and the last push was on 2026-10-10, so work is landing on the project. The licence is BSD-2-Clause, with the text in LICENSE.md, and it covers the code in the repository and the packages published from it. Nothing in the documentation gives legal advice, and you should read the file if your organisation has a review process. The two practical consequences of the release setup are worth stating plainly. First, you cannot assume a stable, advertised release cadence from the package listing alone, so when you pin a Deedle version you should read RELEASE_NOTES.md to see what changed. Second, the package is published on NuGet as Deedle and Deedle.MathNetNumerics, and the build status badges in the README are the indicator of whether the current master state is green. The README also states that all fsprojects and fslaborg projects have a backup maintainer who can help recruit new maintainers should things go cold, which is the kind of arrangement that tends to keep a project from being abandoned outright.

## The F# interactive console is the intended first stop, not a side note

The README opens with a quick start tutorial that it describes as a 10 minute intro, and separately there is a page on using Deedle from C#. That ordering is the guidance. Deedle was designed for exploratory programming, and the F# and C# interactive consoles are the environments it was meant to be tried in, where a frame can be built, sliced and inspected without a project file or a compile cycle. The scenario tutorials that follow, on stock prices and on cleaning messy data, exist specifically for people arriving from pandas, which tells you the documentation expects a familiar mental model to be carried over and adjusted. For a C# team the same operations are reachable through the idiomatic C# API, and the Series, Frame and Stats modules are the entry points in both languages. The alternative worth naming is staying inside a Python analytics stack, where the data frame is a Python object, the notebooks are the console, and the numerical stack underneath is already chosen. The difference in approach is real rather than cosmetic: Deedle gives a typed, compiled .NET library with a documented C# surface and a dedicated extension package, at the cost of living inside Paket, F# tooling and the .NET SDK 9.0 or higher requirement, with no equivalent of a notebook workflow described in the documentation.

## Conclusion

Deedle fits .NET developers who want data frame and time series work in F# or from C#, and who are comfortable with Paket and the F# interactive console as their working environment. It is the wrong choice for a Python-first analytics stack, since the documented tutorials assume you are arriving from pandas and the package ecosystem around it does not exist here. Before adopting it, check that Deedle.MathNetNumerics resolves the MathNet.Numerics version your project already uses, confirm the build runs with the .NET SDK 9.0 or higher the README requires, and read RELEASE_NOTES.md to see how the API has moved since your last use of a Deedle-based codebase.

## FAQ

### What is Deedle used for?

Deedle is an F# library for data and time series manipulation and scientific programming. It supports structured data frames, ordered and unordered data, and time series, with operations for indexing, slicing, joining, missing values, grouping, aggregation and statistics.

### How do I build Deedle from source?

Install the .NET SDK 9.0 or higher, then run dotnet tool restore, dotnet paket restore and the platform build script, build.sh on Linux and macOS or build.ps1 on Windows. The repository uses Paket for dependencies, with a committed paket.lock file.

### What does Deedle.MathNetNumerics add to the main package?

It adds a LinearAlgebra module for linear algebra functions on frames, a Matrix module for multiplication between frames, series, matrices and vectors, extra statistical functions built on MathNet.Numerics, and a Finance module for finance specific statistics. The package depends on MathNet.Numerics.

### Can Deedle be used from C#?

Yes. The documentation includes a page on the idiomatic C# API for working with Deedle, and the library is designed to be used from the F# and C# interactive consoles as well as in compiled .NET code.

## Sources

- [fslaborg/Deedle on GitHub](https://github.com/fslaborg/Deedle)
- [Issues](https://github.com/fslaborg/Deedle/issues)
- [License: BSD-2-Clause](https://github.com/fslaborg/Deedle/blob/master/LICENSE)
- [Project website](http://fslab.org/Deedle/)
- [README](https://github.com/fslaborg/Deedle/blob/master/README.md)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/fslaborg-deedle
