- Stats moving/expanding windows: eliminate O(N) intermediate
Series<'K, float>allocation inapplyMovingSumsTransformandapplyExpandingMomentsTransform. Values are now streamed lazily from the original series, reducing peak memory usage for large series. - Stats
updateSumsDense/initSumsDense: replacepown x 2/3/4with 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.
- CI cache keys now include
.config/dotnet-tools.jsonso tool version changes correctly invalidate the cached NuGet packages.
- Rename NuGet package
Deedle.Excel.Reader→Deedle.ExcelReaderto match the existingDeedle.ExcelReadernamespace (closes #713)
- Deedle.ExcelWriter: cross-platform
.xlsxwriting via MiniExcel —Frame.writeExcel,Frame.writeExcelSheet,Frame.writeExcelSheets, stream overloads, C#ExcelFrameWriterstatic API (closes #714)
- Deedle.Parquet: Fix
Frame.writeParquetandFrame.writeParquetStreamwriting empty files (only column schema, no row data). Root cause: theIParquetRowGroupWriterreturned bywriter.CreateRowGroup()was not disposed, so the row group was never committed to the stream. Fixed by usinguse rg = writer.CreateRowGroup().
Deedle.Arrow,Deedle.Parquet, andDeedle.ExcelReaderare now F# namespaces instead of top-level modules. Functions likereadArrow,readParquet, andreadExcelare no longer brought into scope directly byopen; useFrame.readArrow,Frame.readParquet,Frame.readExcel, etc. instead. C# static factory types (ArrowFrame,ParquetFrame,ExcelFrame) and extension methods are unchanged.- Removed obsolete
Deedle.PerfTestandDeedle.PerfTestsprojects (.NET Framework–only performance runner); useDeedle.Benchmarks(BenchmarkDotNet) instead - Rename
Deedle.Interactivepackage toDeedle.DotNetInteractiveto match the folder name and clarify purpose - Rename
Deedle.Mathpackage and namespace toDeedle.MathNetNumericsto clarify the MathNet.Numerics dependency; the oldDeedle.Mathnamespace is preserved with[<Obsolete>]type aliases - Remove stale docs and project solution folders from
Deedle.sln - Reorganise documentation into three categories: Guides, Integrations, Design
- Add
docs/dotnetinteractive.fsx— documentation page forDeedle.DotNetInteractivenotebook formatting with configuration reference
- Deedle.Parquet: Apache Parquet interop —
Frameread/write via Parquet.Net, stream I/O, row-key preservation, C# extensions
- Add
Frame.Stack/Frame.UnstackC# extension methods for reshaping frames between wide and long format - Add
Frame.MeltByC# extension method for pandas-style wide-to-long pivot - Add
Frame.WhereRowsByMask/Frame.WhereColsByMaskC# extension methods for boolean-mask filtering - Add
Frame.RenameColumn/Frame.RenameColumnsC# extension methods for column renaming - Add
Frame.JoinOn/Frame.JoinOnString/Frame.JoinOnIntC# extension methods for joining frames on a column value - Add
Frame.CompareC# extension method for column-by-column frame diffing
- Add
docs/excel.fsx— comprehensive documentation page forDeedle.Excel.Reader(cross-platform xlsx/xls reading) andDeedle.Excel(Windows live-Excel integration)
Frame.stack: precompute per-column data vectors and per-row addresses before the nested loop, eliminating O(rows × cols) redundant index lookupsFrame.unstack: single-pass extraction of unique r1 and r2 keys usingHashSet-backedResizeArray, replacing two separateSeq.map |> Seq.distinct |> Array.ofSeqtraversals
- Add
Finance.ewmCrossCov— EWMA pairwise covariance between two return series (mean-corrected, consistent withewmCovMatrix) (#81) - Add
Finance.ewmCrossVol— signed square root ofewmCrossCov, giving cross-volatility in vol units with sign indicating direction of co-movement (#81)
- 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.Runtimein vendored TextRuntime.fs for newer F# compilers - Replace deprecated
Frame.indexRowsDate/Frame.indexRowsDateOffsusage in tests withFrame.indexRowsDateTime/Frame.indexRowsDateTimeOffset
- Fix doc generation "No value returned by any evaluator" errors (#692)
- Deedle.Arrow: Apache Arrow / Feather interop —
Frame/Series↔RecordBatch, IPC I/O, Feather aliases, UInt/Date types, C# extensions, row-key preservation (#675, #681, #685) - Deedle.MicrosoftML: ML.NET
IDataViewintegration withVBuffer<float32>/VBuffer<float>vector column support (#677, #680) - Deedle.Excel.Reader: cross-platform xlsx/xls reading via ExcelDataReader (#679)
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.indexRowsDateTimeOffsetaliases (#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.emptymodule functions (#607)ilocinteger-position indexing forFrameandSeries(#631)
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.diffDateOffset—DateTime/DateTimeOffsetdifferences (#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)
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 aFrame(#682)Stats.describeforFrame— pandas-style per-column summary statistics (#612)
WindowWhile,ChunkWhile,PairwiseWith,MapRows,MapCols(#666)ZipInto,ZipAlignInto,ZipInnerforSeries(#657)
Frame.ReadCsvaccepts URLs (#658)Frame.ReadCsvtypeResolverparameter for custom type inference (#649)Frame.ReadCsv/Frame.SaveCsvencodingparameter (#617)
- Eliminate
seq/refoverhead inStatsmoving and expanding window helpers (#683) - Optimise
Frame.AggregateRowsByto avoid per-group sub-frame allocation (#669) - Cache
ToString()in CSV writer for repeated values (#621)
- Fix delayed series display showing
(Suppressed)— show key range instead (#662) - Fix
DateTimekey formatting and locale-dependent formatting in FSI output (#633, #643) - Fix
Frame.fillMissingWithto handle numeric type widening (#632) - Fix: throw
InvalidOperationExceptionfor inexactLookupon unordered series (#644) - Fix
DelayedSeries.Betweento correctly updateRangeMin/RangeMax(#624) - Fix
AsDecimalto support scientific notation (#623) - Fix
Frame.ReadCsvschema being ignored wheninferTypes=false(#615) - Fix
Finance.ewmVolcomputing RMS instead of standard deviation (#593) - Fix
Frame.GetRowKeyAtto acceptintinstead ofint64(#588) - Fix
Frame.ofRecordsfor internal/private record types (#580) - Fix
IndexOutOfRangeExceptioninSeries.windowSizefor series shorter than window (#573) - Truncate long cell values in FSI/
ToStringoutput (#646) - Fix
filterRows/filterRowValues/WherelosingColumnTypeson all-missing columns (#601) - Fix CSV schema parsing for column names containing parentheses (#604)
- Fix
Frame.indexRowsWithto produce missing values for extra row keys (#595)
- Add C# cookbook (
docs/csharp.md) — coversSeriesBuilder,Frame.ReadCsv,Frame.FromRecords, column/row slicing viaColumns[...]/Rows[...],GetColumn<T>, dynamic access, missing values, statistics, windowing, joining, andGetRowsAs<T>(#308)
- 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]toGetRow/TryGetRowandObjectSeriestyped accessors (#654)
- Breaking change:
Frame.stackandFrame.unstacknow implement pandas-style reshape operations.stackconvertsFrame<'R,'C>to a long-formatFrame<'R*'C, string>(tuple row keys, single"Value"column).unstackconvertsFrame<'R1*'R2,'C>to wide-formatFrame<'R1, 'C*'R2>by promoting the inner row-key level to column keys. - The old denormalised-table operations previously called
stack/unstackwere already renamed tomelt/unmeltin an earlier release; the obsolete aliases are now removed.
- Migrate to .NET 9
- Migrate documentation to fsdocs
- Remove FAKE build system, replace with simple build scripts
- Remove R Provider plugin
- Fix missing value in Stats.cov552
- Add Deedle.DotNetInteractive package for formatting in dotnet notebooks
- Adjust and extend formatting interfaces accordingly.
- Restore Deedle.RPlugin targeting net5.0
- Add TryMin and TryMax in extension to be utilized in C#
- Relax types for Matrix.dot of two frames 536
- Add conversions between jagged array and frame 532
- Add Frame.ReadCsvString 530
- .NET Standard 2.0 only
- Add dropEmptyRows and dropEmptyCols 510
- Fix ambiguous sum function when calling it from Frame 515
- Update to latest NetOffice Excel package 505
- 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
- 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
- Fix assembly version #472
- Fix missing preferoptions in C# extension Frame.Readcsv from stream #471
- Optimize Frame.AggregateRowsBy #469
- Fix missing signatures to control access of FSharp.Data implementations #465
- Fix linear interpolation #458
- Fix FillMissingWith with nan #461
- Fix InvalidOperationException from ValuesAll #462
- Fix iterating seq multiple times in Frame.ofRecords #406
- 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
- 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
- Reading CSV (#332) and DropSparseRows (#333)
- Fix where filter in C# (#338)
- 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)
- Finish cleanup of BigDeedle code with partitioning support
- Add BigDeedle partitioning comment to design notes
- Update documentation tools dependencies
- 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
- Support public fields in Frame.ofRecords
- Update version number for a BigDeedle release
- Aggregate bug fixes from previous beta releases
- Provide virtual index and virtual vector (aka BigDeedle)
- Compare indices using lazy sequences (to support BigDeedle)
- Allow creation of empty ranges
- Support more operations on virtualized sources
- Fix handling of missing values in virtual Series.map
- Introduce generic
Ranges<T>type to simplify working with ranges (mainly useful for custom BigDeedle implementations)
- Abstract handling of addresses (mainly for BigDeedle)
- Avoid accessing series Length in series and frame printing
- 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)
- Enable materializing delayed series into a virtual series
- 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)
- Fix bugs related to frame with no columns (#272)
- Remove FSharp.Core dependency from BigDeedle public API
- Update R provider reference to 1.0.17
- 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)
- Added Stats.min and Stats.max for frame
- 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
- Update RProvider references
- Performance and API design improvements
- API redesign, performance improvements and new features
- Update to a new pre-release of RProvider
- Improved C# compatibility, added C# documentation
- Fix bug when creating empty data frame
- Support time series in the R plugin
- Performance improvements, API additions, experimental R plugin
- Add reflection-based frame expansion
- Fix series formatting
- Load script automatically references F# data (for CSV reading)
- Update documentation and tools, adding functionality
- Rename and various fixes and additions
- Saving CSV, fix series alignment
- Update paths in NuGet package
- First beta version on NuGet
- Initial release