Skip to content

Latest commit

 

History

History
480 lines (317 loc) · 23.7 KB

File metadata and controls

480 lines (317 loc) · 23.7 KB

Release Notes

7.0.1 - 2026-04-26

Performance

  • Stats moving/expanding windows: eliminate O(N) intermediate Series<'K, float> allocation in applyMovingSumsTransform and applyExpandingMomentsTransform. Values are now streamed lazily from the original series, reducing peak memory usage for large series.
  • Stats updateSumsDense / initSumsDense: replace pown x 2/3/4 with explicit multiplications (x * x, x * x * x, x * x * x * x) in the per-step update function, eliminating the square-and-multiply loop overhead on each window step.

Infrastructure

  • CI cache keys now include .config/dotnet-tools.json so tool version changes correctly invalidate the cached NuGet packages.

7.0.0 - 2026-04-20

Breaking changes

  • Rename NuGet package Deedle.Excel.ReaderDeedle.ExcelReader to match the existing Deedle.ExcelReader namespace (closes #713)

New packages

  • Deedle.ExcelWriter: cross-platform .xlsx writing via MiniExcelFrame.writeExcel, Frame.writeExcelSheet, Frame.writeExcelSheets, stream overloads, C# ExcelFrameWriter static API (closes #714)

Bug fixes

  • Deedle.Parquet: Fix Frame.writeParquet and Frame.writeParquetStream writing empty files (only column schema, no row data). Root cause: the IParquetRowGroupWriter returned by writer.CreateRowGroup() was not disposed, so the row group was never committed to the stream. Fixed by using use rg = writer.CreateRowGroup().

6.0.1 - 2026-04-13

Infrastructure

  • Deedle.Arrow, Deedle.Parquet, and Deedle.ExcelReader are now F# namespaces instead of top-level modules. Functions like readArrow, readParquet, and readExcel are no longer brought into scope directly by open; use Frame.readArrow, Frame.readParquet, Frame.readExcel, etc. instead. C# static factory types (ArrowFrame, ParquetFrame, ExcelFrame) and extension methods are unchanged.
  • Removed obsolete Deedle.PerfTest and Deedle.PerfTests projects (.NET Framework–only performance runner); use Deedle.Benchmarks (BenchmarkDotNet) instead
  • Rename Deedle.Interactive package to Deedle.DotNetInteractive to match the folder name and clarify purpose
  • Rename Deedle.Math package and namespace to Deedle.MathNetNumerics to clarify the MathNet.Numerics dependency; the old Deedle.Math namespace is preserved with [<Obsolete>] type aliases
  • Remove stale docs and project solution folders from Deedle.sln
  • Reorganise documentation into three categories: Guides, Integrations, Design

Documentation

  • Add docs/dotnetinteractive.fsx — documentation page for Deedle.DotNetInteractive notebook formatting with configuration reference

New packages

  • Deedle.Parquet: Apache Parquet interop — Frame read/write via Parquet.Net, stream I/O, row-key preservation, C# extensions

C# API improvements

  • Add Frame.Stack / Frame.Unstack C# extension methods for reshaping frames between wide and long format
  • Add Frame.MeltBy C# extension method for pandas-style wide-to-long pivot
  • Add Frame.WhereRowsByMask / Frame.WhereColsByMask C# extension methods for boolean-mask filtering
  • Add Frame.RenameColumn / Frame.RenameColumns C# extension methods for column renaming
  • Add Frame.JoinOn / Frame.JoinOnString / Frame.JoinOnInt C# extension methods for joining frames on a column value
  • Add Frame.Compare C# extension method for column-by-column frame diffing

5.0.0 - 2026-04-02

Documentation

  • Add docs/excel.fsx — comprehensive documentation page for Deedle.Excel.Reader (cross-platform xlsx/xls reading) and Deedle.Excel (Windows live-Excel integration)

Performance

  • Frame.stack: precompute per-column data vectors and per-row addresses before the nested loop, eliminating O(rows × cols) redundant index lookups
  • Frame.unstack: single-pass extraction of unique r1 and r2 keys using HashSet-backed ResizeArray, replacing two separate Seq.map |> Seq.distinct |> Array.ofSeq traversals

New operations — Deedle.Math.Finance

  • Add Finance.ewmCrossCov — EWMA pairwise covariance between two return series (mean-corrected, consistent with ewmCovMatrix) (#81)
  • Add Finance.ewmCrossVol — signed square root of ewmCrossCov, giving cross-volatility in vol units with sign indicating direction of co-movement (#81)

Infrastructure

  • Migrate to .NET 10 and FSharp.Core 10.0
  • Update fsdocs-tool to 22.0.0-alpha.3
  • Remove unnecessary System.Reflection.Emit package references (now in-box on net10.0)
  • Suppress NU1510 warnings for in-box packages pulled transitively via Paket
  • Suppress NU1701 warnings for NetOfficeFw packages (no net10.0 assets)
  • Fix self-referential open FSharp.Data.Runtime in vendored TextRuntime.fs for newer F# compilers
  • Replace deprecated Frame.indexRowsDate/Frame.indexRowsDateOffs usage in tests with Frame.indexRowsDateTime/Frame.indexRowsDateTimeOffset

Bug fixes

  • Fix doc generation "No value returned by any evaluator" errors (#692)

4.0.1 - 2026-03-22

New packages

  • Deedle.Arrow: Apache Arrow / Feather interop — Frame/SeriesRecordBatch, IPC I/O, Feather aliases, UInt/Date types, C# extensions, row-key preservation (#675, #681, #685)
  • Deedle.MicrosoftML: ML.NET IDataView integration with VBuffer<float32>/VBuffer<float> vector column support (#677, #680)
  • Deedle.Excel.Reader: cross-platform xlsx/xls reading via ExcelDataReader (#679)

New Frame operations

  • Frame.interleave — side-by-side frame combining with tuple column keys (#691)
  • Frame.joinOn, Frame.joinOnString, Frame.joinOnInt — join frames on a column value (#630, #663)
  • Frame.nestRowsBy — hierarchical row nesting (#652)
  • Frame.compare — column-by-column frame diffing (#637)
  • Frame.rankRowsBy — rank rows within groups (#636)
  • Frame.indexRowsApply — build row index from a projection (#650)
  • Frame.indexRowsDateTime / Frame.indexRowsDateTimeOffset aliases (#653)
  • Frame.mapColValuesAs — typed, non-boxing column mapping (#629)
  • Frame.renameCol, Frame.renameColsUsing (#603)
  • Frame.meltBy — pandas-style melt with identity columns (#598)
  • Frame.distinctRowsBy — remove duplicate rows by column values (#596)
  • Frame.toJson / Frame.saveJson — JSON serialisation (#609)
  • Frame.pctChange — percentage change (#610)
  • Frame.filterRowsByMask, Frame.filterColsByMask — boolean mask filtering (#619)
  • Frame.empty / Series.empty module functions (#607)
  • iloc integer-position indexing for Frame and Series (#631)

New Series operations

  • Series.rank, Series.rankWith, Series.ntile — ranking and quantile binning (#636)
  • Series.sweepLevel — hierarchical group normalisation (#638)
  • Series.replaceValue — pandas-style value replacement (#628)
  • Series.maskValues, Series.maskAll — replace values with missing (#605)
  • Series.diffDate, Series.diffDateOffsetDateTime/DateTimeOffset differences (#592)
  • Series.pctChange — percentage change (#610)
  • Series.filterByMask — boolean mask filtering (#619)
  • Series.before, Series.after, Series.startAt, Series.endAt, Series.between (#620)
  • Series.windowWhileFromEnd, Series.chunkWhileFromEnd (#648)

New Stats operations

  • Stats.movingMedian, Stats.expandingMedian (#661)
  • Stats.levelMin, Stats.levelMax (#647)
  • Stats.interpolateLinearWith — linear interpolation with configurable extrapolation (#627)
  • Stats.cov, Stats.corr — pairwise series covariance and correlation (#614)
  • Stats.corrMatrix, Stats.covMatrix — full correlation/covariance matrix for a Frame (#682)
  • Stats.describe for Frame — pandas-style per-column summary statistics (#612)

New C# extension methods

  • WindowWhile, ChunkWhile, PairwiseWith, MapRows, MapCols (#666)
  • ZipInto, ZipAlignInto, ZipInner for Series (#657)

I/O enhancements

  • Frame.ReadCsv accepts URLs (#658)
  • Frame.ReadCsv typeResolver parameter for custom type inference (#649)
  • Frame.ReadCsv / Frame.SaveCsv encoding parameter (#617)

Performance

  • Eliminate seq/ref overhead in Stats moving and expanding window helpers (#683)
  • Optimise Frame.AggregateRowsBy to avoid per-group sub-frame allocation (#669)
  • Cache ToString() in CSV writer for repeated values (#621)

Bug fixes

  • Fix delayed series display showing (Suppressed) — show key range instead (#662)
  • Fix DateTime key formatting and locale-dependent formatting in FSI output (#633, #643)
  • Fix Frame.fillMissingWith to handle numeric type widening (#632)
  • Fix: throw InvalidOperationException for inexact Lookup on unordered series (#644)
  • Fix DelayedSeries.Between to correctly update RangeMin/RangeMax (#624)
  • Fix AsDecimal to support scientific notation (#623)
  • Fix Frame.ReadCsv schema being ignored when inferTypes=false (#615)
  • Fix Finance.ewmVol computing RMS instead of standard deviation (#593)
  • Fix Frame.GetRowKeyAt to accept int instead of int64 (#588)
  • Fix Frame.ofRecords for internal/private record types (#580)
  • Fix IndexOutOfRangeException in Series.windowSize for series shorter than window (#573)
  • Truncate long cell values in FSI/ToString output (#646)
  • Fix filterRows/filterRowValues/Where losing ColumnTypes on all-missing columns (#601)
  • Fix CSV schema parsing for column names containing parentheses (#604)
  • Fix Frame.indexRowsWith to produce missing values for extra row keys (#595)

Documentation

  • Add C# cookbook (docs/csharp.md) — covers SeriesBuilder, Frame.ReadCsv, Frame.FromRecords, column/row slicing via Columns[...]/Rows[...], GetColumn<T>, dynamic access, missing values, statistics, windowing, joining, and GetRowsAs<T> (#308)

Infrastructure

  • Add SourceLink and deterministic build support (#660)
  • Add BenchmarkDotNet benchmark suite under benchmarks/ (#687)
  • Update test infrastructure: NUnit 4, FsUnit 7, FsCheck 3 (#616)
  • Add [RequiresExplicitTypeArguments] to GetRow/TryGetRow and ObjectSeries typed accessors (#654)

4.0.0 - 2026-03-10

  • Breaking change: Frame.stack and Frame.unstack now implement pandas-style reshape operations. stack converts Frame<'R,'C> to a long-format Frame<'R*'C, string> (tuple row keys, single "Value" column). unstack converts Frame<'R1*'R2,'C> to wide-format Frame<'R1, 'C*'R2> by promoting the inner row-key level to column keys.
  • The old denormalised-table operations previously called stack/unstack were already renamed to melt/unmelt in an earlier release; the obsolete aliases are now removed.

4.0.0-alpha-001 - 2026-03-09

  • Migrate to .NET 9
  • Migrate documentation to fsdocs
  • Remove FAKE build system, replace with simple build scripts
  • Remove R Provider plugin

3.0.0 - 2023-01-17

  • Fix missing value in Stats.cov552

3.0.0-beta.1 - 2022-06-22

  • Add Deedle.DotNetInteractive package for formatting in dotnet notebooks
  • Adjust and extend formatting interfaces accordingly.

2.5.0 - 2021-11-10

  • Restore Deedle.RPlugin targeting net5.0

2.4.3 - 2021-09-11

  • Add TryMin and TryMax in extension to be utilized in C#

2.4.2 - 2021-08-31

  • Relax types for Matrix.dot of two frames 536

2.4.1 - 2021-07-25

  • Add conversions between jagged array and frame 532

2.4.0 - 2021-07-06

  • Add Frame.ReadCsvString 530
  • .NET Standard 2.0 only

2.3.0 - 2020-09-16

  • Add dropEmptyRows and dropEmptyCols 510
  • Fix ambiguous sum function when calling it from Frame 515
  • Update to latest NetOffice Excel package 505

2.2.0 - 2020-06-15

  • Add linear regression and PCA functions in Deedle.Math thanks to @Ildhesten 496
  • Add descriptions to Stats functions to clarify valid input types by @Arlofin 501

2.1.2 - 2020-02-25

  • Fix parsing csv of multi-line column headers #479
  • Fix type inference of empty cell #441

2.1.1 - 2019-11-4

  • Fix FilterRowsBy #491
  • Add basic stats functions of Frame in extension #490

2.1.0 - 2019-11-4

  • Release Deedle.Math to extend linear algebra, statisitical analysis and financial analysis on Frame and Series by leveraging MathNet.Numerics #475
  • Override + operator and add Frame.strConcat to concatenate Frame and Series of string values #482
  • Fix ResampleUniform with missing values #470

2.0.4 - 2019-04-29

  • Fix assembly version #472

2.0.3 - 2019-04-24

  • Fix missing preferoptions in C# extension Frame.Readcsv from stream #471
  • Optimize Frame.AggregateRowsBy #469

2.0.2 - 2019-04-08

  • Fix missing signatures to control access of FSharp.Data implementations #465

2.0.1 - 2019-03-25

  • Fix linear interpolation #458
  • Fix FillMissingWith with nan #461
  • Fix InvalidOperationException from ValuesAll #462
  • Fix iterating seq multiple times in Frame.ofRecords #406

2.0.0 - 2019-03-13

  • Breaking changes of Stats.min and Stats.max #422
  • Inline stats functions #418
  • Fix error handling of group by column when dealing with missing value 253 and 380
  • Fix aggregateRowsBy with missing value 375
  • Fix format function #416
  • Fix arithmetic operator on frames #432
  • Fix wrong exception for empty Series #365
  • Fix tryLastValue using tryGetAt #339
  • Fix bug in ReadCsv missingValues parameters #439
  • Fix handling of missing column keys in case when inferTypes is false #63
  • Add Frame.dropSparseRowsBy #404
  • Add Series.intersect #407
  • Add Series.compare #411
  • Add Series.uniqueCount #413
  • Add Series.describe #414 and $422
  • Add Series.replace #427
  • Add Stats.quantile for series #428
  • Add Frame.slice #445
  • Removed compiler warning from ReadCsv #426
  • Rename stack/unstack to melt/unmelt #436

2.0.0-beta01 - 2018-08-04

  • Support for netstandard2.0 #382, #393 and #391
  • Excel support #255 and #399
  • Iterate once in Frame.ofRowsOrdinal #396
  • Fix for some concurrency errors #394
  • Fix bug in Series.hasNot #361
  • Fix bug in Frame.tryValues #359
  • Arithmetic operators for decimal series #351

1.2.5

  • Reading CSV (#332) and DropSparseRows (#333)
  • Fix where filter in C# (#338)

1.2.4

  • Fix RowsDense broken by BigDeedle changes (#319)
  • Make ChunkSizeInto behave according to documentation (#314)
  • Expand public fields (#313)
  • Keep order of columns/rows in FrameBuilder (#322)

1.2.3

  • Finish cleanup of BigDeedle code with partitioning support
  • Add BigDeedle partitioning comment to design notes
  • Update documentation tools dependencies

1.2.2

  • BigDeedle: Materialize series on grouping and other operations
  • BigDeedle: Support resampling without materializing series
  • Better handling of materialization via addressing schemes
  • Refactoring and cleanup of BigDeedle code
  • Fix bugs in ordinal virtual index
  • SelectOptional and SelectValues can be performed lazilly

1.2.1

  • Support public fields in Frame.ofRecords

1.2.0

  • Update version number for a BigDeedle release

1.1.5

  • Aggregate bug fixes from previous beta releases
  • Provide virtual index and virtual vector (aka BigDeedle)
  • Compare indices using lazy sequences (to support BigDeedle)

1.1.4-beta

  • Allow creation of empty ranges
  • Support more operations on virtualized sources
  • Fix handling of missing values in virtual Series.map

1.1.3-beta

  • Introduce generic Ranges<T> type to simplify working with ranges (mainly useful for custom BigDeedle implementations)

1.1.2-beta

  • Abstract handling of addresses (mainly for BigDeedle)
  • Avoid accessing series Length in series and frame printing

1.1.1-beta

  • Allow specifying custom NA values (#231)
  • Documentation improvements and add F# Frame extension docs (#254)
  • Use 100 rows for inference by default in C# and fix docs (#271)
  • Fix R interop documentation issue (#287)
  • More flexible conversion from R frames (#212)
  • Dropping sparse rows/columns should preserve frame structure (#277)
  • Change Stats.sum to return NaN for empty series (#259)
  • Change C#-version of ReadCsv to accept inferTypes param (#270)

1.1.0-beta

  • Enable materializing delayed series into a virtual series

1.0.7

  • Add typed frame access (frame.GetRowsAs) (#281)
  • BigDeedle improvements (#284, #285)
  • Expose type information via frame.ColumnTypes (#286)
  • Simplify load script (#292)
  • Remove F# Data dependency & use Paket (#288, #293)
  • Update depndencies (F# Formatting 2.6.2 and RProvider 1.1.8)

1.0.6

  • Fix bugs related to frame with no columns (#272)
  • Remove FSharp.Core dependency from BigDeedle public API

1.0.5

  • Update R provider reference to 1.0.17

1.0.4

  • Merge BigDeedle pull request (#247), add merging on big frames
  • Fix PivotTable (#248) and CSV writing (#242)
  • Update R provider reference to 1.0.16 (support shadow copy in F# 3.2.1)

1.0.3

  • Added Stats.min and Stats.max for frame

1.0.2

  • Operations GetAs, TryAs (ObjectSeries), GetColumns, GetRows, GetAllValues, ColumnApply (Frame) and filling of missing values uses "safe" conversion (allows conversion to bigger numeric type)
  • Avoid boxing when filling missing values (#222)
  • Fix documentation bugs (#221, #226) and update formatters from FsLab

1.0.1

  • Update RProvider references

1.0.0

  • Performance and API design improvements

1.0.0-alpha1

  • API redesign, performance improvements and new features

1.0.0-alpha2

  • Update to a new pre-release of RProvider

0.9.12

  • Improved C# compatibility, added C# documentation

0.9.11-beta

  • Fix bug when creating empty data frame

0.9.10-beta

  • Support time series in the R plugin

0.9.9-beta

  • Performance improvements, API additions, experimental R plugin

0.9.8-beta

  • Add reflection-based frame expansion

0.9.7-beta

  • Fix series formatting

0.9.6-beta

  • Load script automatically references F# data (for CSV reading)

0.9.5-beta

  • Update documentation and tools, adding functionality

0.9.4-beta

  • Rename and various fixes and additions

0.9.3-beta

  • Saving CSV, fix series alignment

0.9.2-beta

  • Update paths in NuGet package

0.9.1-beta

  • First beta version on NuGet

0.9.0-beta

  • Initial release