Logo Deedle

Big Deedle — virtual frames

Big Deedle opens large CSV or Parquet files as virtual frames: metadata and filters stay cheap, and cells are decoded when you read them. The typical workflow is load → filter → slice → project → materialize a subset → analytics / export.

1. Creating a virtual frame

Virtual.ReadCsv loads a CSV without materializing the full table. The sample below uses data/bigdeedle-prices.csv with inferred LookupRange on Category and Cycle.

let prices =
  Virtual.ReadCsv(
    path,
    searchColumns =
      [ VirtualSearchColumn.infer "Category"
        VirtualSearchColumn.infer "Cycle" ],
    columnKeys = [ "Category"; "Open"; "Close"; "Volume"; "Cycle" ])

Virtual.Describe prices
val prices: Frame<int64,string> =
  
      Category Open  Close Volume  Cycle 
0  -> tech     37.5  37.8  1200000 1     
1  -> energy   38.1  37.9  980000  2     
2  -> tech     37.95 38.4  1100000 3     
3  -> retail   38.5  38.2  870000  1     
4  -> tech     38.25 38.9  1350000 2     
5  -> energy   39    38.7  920000  3     
6  -> tech     38.8  39.2  1010000 1     
7  -> retail   39.4  39.1  760000  2     
8  -> tech     39.15 39.6  1180000 3     
9  -> energy   39.7  39.4  890000  1     
10 -> tech     39.5  40    1420000 2     
11 -> retail   40.1  39.8  810000  3     
12 -> tech     39.9  40.3  1250000 1     
13 -> energy   40.4  40.1  950000  2     
14 -> tech     40.2  40.7  1300000 3     
15 -> retail   40.8  40.5  780000  1     
16 -> tech     40.6  41    1150000 2     
17 -> energy   41.1  40.8  900000  3     
18 -> tech     40.9  41.4  1280000 1     
19 -> retail   41.5  41.2  830000  2     
20 -> tech     41.3  41.8  1400000 3     
21 -> energy   41.9  41.6  910000  1     
22 -> tech     41.7  42.1  1220000 2     
23 -> retail   42.2  41.9  790000  3     

val it: string = "rows=24, rowIndex=ordinal virtual (0..N-1), columns=5"
prices.ColumnKeys |> Seq.toList
val it: string list = ["Category"; "Open"; "Close"; "Volume"; "Cycle"]

ReadCsv parameters:

Path, IndexColumn, SearchColumn, ColumnKeys, ByteOffsetIndex

IndexColumn if passed - checks if the column is ascending and unique, if not, falls back to default - an ordinal index.

When to use ordinal vs ordered row index

If you pass a DateTime column as indexColumn, you have to use explicit type argument. If the column is not ordered or has duplicate values, the index will fall back to ordinal.

Empty/NA cells become missing values

SearchColumns -

You can choose columns for quick and virtual FilterByRows. For each column a VirtualLookupRange will be created. You can choose to either pass VirtualSearchColumn.infer, for Deedle to pick best LookupRange, or select an explicit mode so the full scan isn't performed. Be careful, if you pass a Step, and the data isn't actually cyclical, the results for operations on that column won't be correct - Deedle doesn't check correctness of explicitly passed VirtualSearchColumn mode.

columnKeys:

List of columns to be included in the Virtual Frame. If ommited, all columns will be used. Deedle takes the first row of the data as the column keys. If you have data without Labels - use hasHeaders = false. In that case columns will be named Column1, Column2 etc, same as in normal Frame. At this point schema is not supported in Virtual Frames.

2. VirtualLookupRange

To pass an explicit LookupRange, you have to know the type of data in the column (eg. VirtualSearchColumn.withString), the type of LookupRange (eg.VirtualLookupRange.forRepeatingCycle) and with cycle columns, the specific values - or a range (if for example there are 20 consecutive numbers that are repeating)

let explicitCycle =
  Virtual.ReadCsv(
    path,
    searchColumns =
      [ VirtualSearchColumn.withString "Category"
          (VirtualLookupRange.forRepeatingCycle [| "tech"; "energy"; "retail" |])
        VirtualSearchColumn.withInt64 "Cycle"
          (VirtualLookupRange.forRepeatingCycle [| 1L..3L |]) ],
    columnKeys = [ "Category"; "Open"; "Close"; "Volume"; "Cycle" ])

If you don't want to list all of the values, you can just use VirtualSearchColumn.infer. In this case there will be a full scan performedat the creation of the Frame.

Options for explicit LookupRanges:

Data shape

Helper

Repeating cycle

VirtualLookupRange.forRepeatingCycle words

Known categorical levels

VirtualLookupRange.forCategorical map

Build map once at construction

VirtualLookupRange.forCategoricalScan length valueAt

Irregular / high cardinality

VirtualLookupRange.scan length valueAt (correct, O(N) per filter)

Low-cardinality CSV/Parquet string

VirtualSearchColumn.infer "ColumnName" at load

3. Explore without materializing

You can inspect structure and filter rows without pulling every cell.

Row count and filter by column value:

prices.RowCount
val it: int = 24
let tech = prices |> Frame.filterRowsBy "Category" "tech"
tech.RowCount
val tech: Frame<int64,string> =
  
      Category Open  Close Volume  Cycle 
0  -> tech     37.5  37.8  1200000 1     
2  -> tech     37.95 38.4  1100000 3     
4  -> tech     38.25 38.9  1350000 2     
6  -> tech     38.8  39.2  1010000 1     
8  -> tech     39.15 39.6  1180000 3     
10 -> tech     39.5  40    1420000 2     
12 -> tech     39.9  40.3  1250000 1     
14 -> tech     40.2  40.7  1300000 3     
16 -> tech     40.6  41    1150000 2     
18 -> tech     40.9  41.4  1280000 1     
20 -> tech     41.3  41.8  1400000 3     
22 -> tech     41.7  42.1  1220000 2     

val it: int = 12
Virtual.IsVirtualRowIndex tech
val it: bool = true

Two predicates — filterRowsBy2 intersects both LookupRanges in one pass when the row index is ordered. On ordinal frames it falls back to two chained filterRowsBy calls (still virtual, still correct):

let techCycle1 =
  prices
  |> Frame.filterRowsBy2 "Category" "tech" "Cycle" 1L

techCycle1.RowCount
val techCycle1: Frame<int64,string> =
  
      Category Open Close Volume  Cycle 
0  -> tech     37.5 37.8  1200000 1     
6  -> tech     38.8 39.2  1010000 1     
12 -> tech     39.9 40.3  1250000 1     
18 -> tech     40.9 41.4  1280000 1     

val it: int = 4
let techCycle1Chain =
  prices
  |> Frame.filterRowsBy "Category" "tech"
  |> Frame.filterRowsBy "Cycle" 1L

techCycle1.RowCount = techCycle1Chain.RowCount
val techCycle1Chain: Frame<int64,string> =
  
      Category Open Close Volume  Cycle 
0  -> tech     37.5 37.8  1200000 1     
6  -> tech     38.8 39.2  1010000 1     
12 -> tech     39.9 40.3  1250000 1     
18 -> tech     40.9 41.4  1280000 1     

val it: bool = true

Peek one value — a single decode, not a full-column pull:

let firstTech = tech.RowKeys |> Seq.head
tech.GetColumn<float>("Close").[firstTech]
val firstTech: int64 = 0L
val it: float = 37.8

Other ways to explore without loading everything into memory:

4. Operations on virtual frames

Most Frame / Series APIs work. The distinction is whether the result stays virtual or pulls data into memory.

Stays virtual (prep pipeline):

Materializes (use on a filtered slice, not the full file):

Example prep that remains virtual:

let prepared =
  tech
  |> Frame.sliceCols [ "Open"; "Close" ]
  |> fun f -> f.Rows.[f.RowKeys |> Seq.head .. f.RowKeys |> Seq.skip 4 |> Seq.head]

let closeShifted = prepared.GetColumn<float>("Close") |> Series.shift 1
closeShifted
val prepared: Frame<int64,string> =
  
     Open  Close 
0 -> 37.5  37.8  
2 -> 37.95 38.4  
4 -> 38.25 38.9  
6 -> 38.8  39.2  
8 -> 39.15 39.6  

val closeShifted: Series<int64,float> =
  
2 -> 37.8 
4 -> 38.4 
6 -> 38.9 
8 -> 39.2 

val it: Series<int64,float> = 
2 -> 37.8 
4 -> 38.4 
6 -> 38.9 
8 -> 39.2

Stats.sum on a column reads every row in the subset (materialize pull over those rows only):

prepared.GetColumn<float>("Close") |> Stats.sum
val it: float = 193.9

5. What stays virtual vs what materializes

Operation

Result

Virtual.ReadCsv / ReadCsvDirectory / ReadParquet, metadata, Describe

VIRTUAL

filterRowsBy / filterRowsBy2 (with LookupRange)

VIRTUAL

Slice / map / fill / shift / diff / pctChange

VIRTUAL

Nested windowSize / chunkSize (identity)

VIRTUAL nested slices

Identical-ordinal zip / join

VIRTUAL

dropMissing

VIRTUAL (presence scan + sub-vector)

Full-series Stats.*

MATERIALIZE pull (O(N)); prefer slice first

Window aggregates, groupBy, value sortBy

MATERIALIZE

Mismatched-key join, joinOn, nearest lookup

MATERIALIZE

Virtual.MaterializeFloatBatches

Explicit subset pull for ML

6. ML export with MaterializeFloatBatches

MaterializeFloatBatches yields data one batch of a given size at a time, without performing a full scan. You can choose which columns will be used, and set a labels column, that will be returned separately. Each batch is produced by slicing the frame and reading only those rows × columns. Set order to FloatBatchOrder.Shuffled / ShuffledWithSeed if you want rows order to berandomized once per enumeration (each row appears in exactly one batch).

Parameter

Description

frame

Source frame (virtual or in-memory)

batchSize

Rows per batch (last batch may be smaller)

columns

Column keys to materialize (float or int64)

missingPolicy

Missing cells (default FloatMissingPolicy.NaN)

includeRowKeys

Copy row keys for each batch

labelsColumn

Optional label column (float or int64)

layout

Row-major (default) or column-major flat layout

includeMissingMask

FloatBatch.MissingMask for feature cells

maxRows

Cap total rows exported across all batches

order

FloatBatchOrder.Sequential (default) or shuffled variants

let batches =
  Virtual.MaterializeFloatBatches(
    tech,
    batchSize = 4L,
    columns = [ "Open"; "Close" ],
    order = FloatBatchOrder.ShuffledWithSeed 42,
    missingPolicy = FloatMissingPolicy.NaN)

let firstBatch = batches |> Seq.head
firstBatch.Rows, firstBatch.Cols
val batches: FloatBatch<int64> seq
val firstBatch: FloatBatch<int64> =
  { Rows = 4
    Cols = 2
    Layout = RowMajor
    FeaturesFlat = [|39.9; 40.3; 38.8; 39.2; 39.5; 40.0; 37.5; 37.8|]
    Labels = None
    MissingMask = None
    RowKeys = None }
val it: int * int = (4, 2)
firstBatch.FeaturesFlat.[0..1]
val it: float array = [|39.9; 40.3|]

7. DelayedSeries vs virtual vs ReadCsv

Model

When to use

*Frame.ReadCsv*

Small/medium data (as in the tutorial); full API in RAM

*Virtual.ReadCsv*

Single CSV; ordinal 0..N-1 by default, or ordered index when indexColumn is valid

*Virtual.ReadCsvDirectory*

Multiple same-schema CSVs concatenated as ordinal 0..N-1

*Virtual.ReadParquet*

Columnar files; same LookupRange story after open Deedle.Parquet

*DelayedSeries*

Lazy range loaders (DB/API); see Delay-loaded series

Virtual frames are source-first (IVirtualVectorSource), not a full custom builder rewrite. Design background: Design notes.

8. Custom IVirtualVectorSource

For backends other than CSV/Parquet, implement IVirtualVectorSource<'T> (Length, ValueAt, GetSubVector, and preferably LookupRange on searchable columns), then wrap with Virtual.CreateOrdinalFrame or Virtual.CreateFrame. All columns must share the same addressing scheme id.

let n = 20L
let cats = [| "tech"; "energy"; "retail" |]
let scheme = "demo-ordinal"

let catSource =
  OrdinalVirtualSource<string>(
    n,
    (fun i -> OptionalValue(cats.[int (i % int64 cats.Length)])),
    scheme,
    lookupRange = VirtualLookupRange.forRepeatingCycle cats)

let closeSource =
  OrdinalVirtualSource<float>(
    n,
    (fun i -> OptionalValue(40.0 + float i)),
    scheme)

let demo =
  Virtual.CreateOrdinalFrame(
    [ "Category"; "Close" ],
    [ catSource :> IVirtualVectorSource; closeSource :> IVirtualVectorSource ])

Virtual.Describe demo
val n: int64 = 20L
val cats: string array = [|"tech"; "energy"; "retail"|]
val scheme: string = "demo-ordinal"
val catSource: OrdinalVirtualSource<string>
val closeSource: OrdinalVirtualSource<float>
val demo: Frame<int64,string> =
  
      Category Close 
0  -> tech     40    
1  -> energy   41    
2  -> retail   42    
3  -> tech     43    
4  -> energy   44    
5  -> retail   45    
6  -> tech     46    
7  -> energy   47    
8  -> retail   48    
9  -> tech     49    
10 -> energy   50    
11 -> retail   51    
12 -> tech     52    
13 -> energy   53    
14 -> retail   54    
15 -> tech     55    
16 -> energy   56    
17 -> retail   57    
18 -> tech     58    
19 -> energy   59    

val it: string = "rows=20, rowIndex=ordinal virtual (0..N-1), columns=2"
(demo |> Frame.filterRowsBy "Category" "tech").RowCount
val it: int = 7
namespace System
namespace Deedle
namespace Deedle.Virtual
namespace Deedle.Vectors
namespace Deedle.Vectors.Virtual
val root: string
val path: string
val fsi: FSharp.Compiler.Interactive.InteractiveSession
member FSharp.Compiler.Interactive.InteractiveSession.AddPrinter: ('T -> string) -> unit
val o: obj
type obj = Object
val iface: Type
Object.GetType() : Type
val fmt: Reflection.MethodInfo
Type.GetMethod(name: string) : Reflection.MethodInfo
   (+0 other overloads)
Type.GetMethod(name: string, types: Type array) : Reflection.MethodInfo
   (+0 other overloads)
Type.GetMethod(name: string, bindingAttr: Reflection.BindingFlags) : Reflection.MethodInfo
   (+0 other overloads)
Type.GetMethod(name: string, types: Type array, modifiers: Reflection.ParameterModifier array) : Reflection.MethodInfo
   (+0 other overloads)
Type.GetMethod(name: string, bindingAttr: Reflection.BindingFlags, types: Type array) : Reflection.MethodInfo
   (+0 other overloads)
Type.GetMethod(name: string, genericParameterCount: int, types: Type array) : Reflection.MethodInfo
   (+0 other overloads)
Type.GetMethod(name: string, genericParameterCount: int, types: Type array, modifiers: Reflection.ParameterModifier array) : Reflection.MethodInfo
   (+0 other overloads)
Type.GetMethod(name: string, genericParameterCount: int, bindingAttr: Reflection.BindingFlags, types: Type array) : Reflection.MethodInfo
   (+0 other overloads)
Type.GetMethod(name: string, bindingAttr: Reflection.BindingFlags, binder: Reflection.Binder, types: Type array, modifiers: Reflection.ParameterModifier array) : Reflection.MethodInfo
   (+0 other overloads)
Type.GetMethod(name: string, bindingAttr: Reflection.BindingFlags, binder: Reflection.Binder, callConvention: Reflection.CallingConventions, types: Type array, modifiers: Reflection.ParameterModifier array) : Reflection.MethodInfo
   (+0 other overloads)
Reflection.MethodBase.Invoke(obj: obj, parameters: obj array) : obj
Reflection.MethodBase.Invoke(obj: obj, invokeAttr: Reflection.BindingFlags, binder: Reflection.Binder, parameters: obj array, culture: Globalization.CultureInfo) : obj
Multiple items
val string: value: 'T -> string

--------------------
type string = String
val prices: Frame<int64,string>
Multiple items
namespace Deedle.Virtual

--------------------
type Virtual = static member CreateFrame: indexSource: IVirtualVectorSource<'a> * keys: 'b seq * sources: IVirtualVectorSource seq -> Frame<'a,'b> (requires equality and equality) static member CreateOrdinalFrame: keys: 'a seq * sources: IVirtualVectorSource seq -> Frame<int64,'a> (requires equality) static member CreateOrdinalSeries: source: IVirtualVectorSource<'a> -> Series<int64,'a> static member CreateSeries: indexSource: IVirtualVectorSource<'a> * valueSource: IVirtualVectorSource<'b> -> Series<'a,'b> (requires equality) static member Describe: frame: Frame<'R,'C> -> string (requires equality and equality) static member GetRowIndexKind: frame: Frame<'R,'C> -> VirtualRowIndexKind (requires equality and equality) static member IsVirtualColumn: frame: Frame<'R,'C> * column: 'C -> bool (requires equality and equality) static member IsVirtualRowIndex: frame: Frame<'R,'C> -> bool (requires equality and equality) static member MaterializeFloatBatches: frame: Frame<'TRowKey,'TColumnKey> * batchSize: int64 * columns: 'TColumnKey list * ?missingPolicy: FloatMissingPolicy * ?includeRowKeys: bool * ?labelsColumn: 'TColumnKey * ?layout: FloatBatchLayout * ?includeMissingMask: bool * ?maxRows: int64 * ?order: FloatBatchOrder -> FloatBatch<'TRowKey> seq (requires equality and equality) static member TryGetLookupRange: frame: Frame<'R,'C> * column: 'C -> VirtualColumnLookupRange option (requires equality and equality) ...
<summary> Provides static methods for creating virtual series and virtual frames. Those provide necessary wrapping around `IVirtualVectorSource` values </summary>
static member Virtual.ReadCsv: path: string * ?searchColumns: VirtualSearchColumn list * ?columnKeys: string list * ?byteOffsetIndex: bool * ?hasHeaders: bool -> Frame<int64,string>
static member Virtual.ReadCsv: path: string * indexColumn: string * ?searchColumns: VirtualSearchColumn list * ?columnKeys: string list * ?byteOffsetIndex: bool * ?hasHeaders: bool -> Frame<'R,string> (requires equality)
Multiple items
module VirtualSearchColumn from Deedle.Virtual
<summary> Helpers for building [`VirtualSearchColumn`] lists. </summary>

--------------------
type VirtualSearchColumn = { Name: string Mode: VirtualSearchColumnMode }
<summary> One searchable column on [`Virtual.ReadCsv`] / [`Virtual.ReadParquet`]. </summary>
val infer: name: string -> VirtualSearchColumn
static member Virtual.Describe: frame: Frame<'R,'C> -> string (requires equality and equality)
property Frame.ColumnKeys: string seq with get
<category>Accessors and slicing</category>
module Seq from Microsoft.FSharp.Collections
val toList: source: 'T seq -> 'T list
val explicitCycle: Frame<int64,string>
val withString: name: string -> mode: LookupRangeMode<string> -> VirtualSearchColumn
module VirtualLookupRange from Deedle.Virtual
<summary> Helpers for configuring searchable columns on virtual sources. </summary>
val forRepeatingCycle: values: 'T array -> LookupRangeMode<'T> (requires equality)
<summary> Step LookupRange for values repeating on a fixed cycle (periodic categorical data). Unknown values yield an empty range (negative offset) instead of throwing. </summary>
val withInt64: name: string -> mode: LookupRangeMode<int64> -> VirtualSearchColumn
property Frame.RowCount: int with get
val tech: Frame<int64,string>
Multiple items
module Frame from Deedle
<summary> The `Frame` module provides an F#-friendly API for working with data frames. The module follows the usual desing for collection-processing in F#, so the functions work well with the pipelining operator (`|&gt;`). For example, given a frame with two columns representing prices, we can use `Frame.pctChange` to calculate daily returns like this: let df = frame [ "MSFT" =&gt; prices1; "AAPL" =&gt; prices2 ] let rets = df |&gt; Frame.pctChange 1 rets |&gt; Stats.mean Note that the `Stats.mean` operation is overloaded and works both on series (returning a number) and on frames (returning a series). You can also use `Frame.diff` if you need absolute differences rather than relative changes. The functions in this module are designed to be used from F#. For a C#-friendly API, see the `FrameExtensions` type. For working with individual series, see the `Series` module. The functions in the `Frame` module are grouped in a number of categories and documented below. Accessing frame data and lookup ------------------------------- Functions in this category provide access to the values in the fame. You can also add and remove columns from a frame (which both return a new value). - `addCol`, `replaceCol` and `dropCol` can be used to create a new data frame with a new column, by replacing an existing column with a new one, or by dropping an existing column - `cols` and `rows` return the columns or rows of a frame as a series containing objects; `getCols` and `getRows` return a generic series and cast the values to the type inferred from the context (columns or rows of incompatible types are skipped); `getNumericCols` returns columns of a type convertible to `float` for convenience. - You can get a specific row or column using `get[Col|Row]` or `lookup[Col|Row]` functions. The `lookup` variant lets you specify lookup behavior for key matching (e.g. find the nearest smaller key than the specified value). There are also `[try]get` and `[try]Lookup` functions that return optional values and functions returning entire observations (key together with the series). - `sliceCols` and `sliceRows` return a sub-frame containing only the specified columns or rows. Finally, `toArray2D` returns the frame data as a 2D array. Grouping, windowing and chunking -------------------------------- The basic grouping functions in this category can be used to group the rows of a data frame by a specified projection or column to create a frame with hierarchical index such as <c>Frame&lt;'K1 * 'K2, 'C&gt;</c>. The functions always aggregate rows, so if you want to group columns, you need to use `Frame.transpose` first. The function `groupRowsBy` groups rows by the value of a specified column. Use `groupRowsBy[Int|Float|String...]` if you want to specify the type of the column in an easier way than using type inference; `groupRowsUsing` groups rows using the specified _projection function_ and `groupRowsByIndex` projects the grouping key just from the row index. More advanced functions include: `aggregateRowsBy` which groups the rows by a specified sequence of columns and aggregates each group into a single value; `pivotTable` implements the pivoting operation [as documented in the tutorials](../frame.html#pivot). The `melt` and `unmelt` functions turn the data frame into a single data frame containing columns `Row`, `Column` and `Value` containing the data of the original frame; `unmelt` can be used to turn this representation back into an original frame. The `stack` and `unstack` functions implement pandas-style reshape operations. `stack` converts `Frame&lt;'R,'C&gt;` to a long-format `Frame&lt;'R*'C, string&gt;` where each cell becomes a row keyed by `(rowKey, colKey)` with a single `"Value"` column. `unstack` promotes the inner row-key level to column keys, producing `Frame&lt;'R1, 'C*'R2&gt;` from `Frame&lt;'R1*'R2,'C&gt;`. A simple windowing functions that are exposed for an entire frame operations are `window` and `windowInto`. For more complex windowing operations, you currently have to use `mapRows` or `mapCols` and apply windowing on individual series. Sorting and index manipulation ------------------------------ A frame is indexed by row keys and column keys. Both of these indices can be sorted (by the keys). A frame that is sorted allows a number of additional operations (such as lookup using the `Lookp.ExactOrSmaller` lookup behavior). The functions in this category provide ways for manipulating the indices. It is expected that most operations are done on rows and so more functions are available in a row-wise way. A frame can alwyas be transposed using `Frame.transpose`. Index operations: The existing row/column keys can be replaced by a sequence of new keys using the `indexColsWith` and `indexRowsWith` functions. Row keys can also be replaced by ordinal numbers using `indexRowsOrdinally`. The function `indexRows` uses the specified column of the original frame as the index. It removes the column from the resulting frame (to avoid this, use overloaded `IndexRows` method). This function infers the type of row keys from the context, so it is usually more convenient to use `indexRows[Date|String|Int|...]` functions. Finally, if you want to calculate the index value based on multiple columns of the row, you can use `indexRowsUsing`. Sorting frame rows: Frame rows can be sorted according to the value of a specified column using the `sortRows` function; `sortRowsBy` takes a projection function which lets you transform the value of a column (e.g. to project a part of the value). The functions `sortRowsByKey` and `sortColsByKey` sort the rows or columns using the default ordering on the key values. The result is a frame with ordered index. Expanding columns: When the frame contains a series with complex .NET objects such as F# records or C# classes, it can be useful to "expand" the column. This operation looks at the type of the objects, gets all properties of the objects (recursively) and generates multiple series representing the properties as columns. The function `expandCols` expands the specified columns while `expandAllCols` applies the expansion to all columns of the data frame. Frame transformations --------------------- Functions in this category perform standard transformations on data frames including projections, filtering, taking some sub-frame of the frame, aggregating values using scanning and so on. Projection and filtering functions such as `[map|filter][Cols|Rows]` call the specified function with the column or row key and an <c>ObjectSeries&lt;'K&gt;</c> representing the column or row. You can use functions ending with `Values` (such as `mapRowValues`) when you do not require the row key, but only the row series; `mapRowKeys` and `mapColKeys` can be used to transform the keys. You can use `reduceValues` to apply a custom reduction to values of columns. Other aggregations are available in the `Stats` module. You can also get a row with the greaterst or smallest value of a given column using `[min|max]RowBy`. The functions `take[Last]` and `skip[Last]` can be used to take a sub-frame of the original source frame by skipping a specified number of rows. Note that this does not require an ordered frame and it ignores the index - for index-based lookup use slicing, such as `df.Rows.[lo .. hi]`, instead. Finally the `shift` function can be used to obtain a frame with values shifted by the specified offset. This can be used e.g. to get previous value for each key using `Frame.shift 1 df`. The `diff` function calculates difference from previous value using `df - (Frame.shift offs df)`. Processing frames with exceptions --------------------------------- The functions in this group can be used to write computations over frames that may fail. They use the type <c>tryval&lt;'T&gt;</c> which is defined as a discriminated union with two cases: Success containing a value, or Error containing an exception. Using <c>tryval&lt;'T&gt;</c> as a value in a data frame is not generally recommended, because the type of values cannot be tracked in the type. For this reason, it is better to use <c>tryval&lt;'T&gt;</c> with individual series. However, `tryValues` and `fillErrorsWith` functions can be used to get values, or fill failed values inside an entire data frame. The `tryMapRows` function is more useful. It can be used to write a transformation that applies a computation (which may fail) to each row of a data frame. The resulting series is of type <c>Series&lt;'R, tryval&lt;'T&gt;&gt;</c> and can be processed using the <c>Series</c> module functions. Missing values -------------- This group of functions provides a way of working with missing values in a data frame. The category provides the following functions that can be used to fill missing values: * `fillMissingWith` fills missing values with a specified constant * `fillMissingUsing` calls a specified function for every missing value * `fillMissing` and variants propagates values from previous/later keys We use the terms _sparse_ and _dense_ to denote series that contain some missing values or do not contain any missing values, respectively. The functions `denseCols` and `denseRows` return a series that contains only dense columns or rows and all sparse rows or columns are replaced with a missing value. The `dropSparseCols` and `dropSparseRows` functions drop these missing values and return a frame with no missing values. Joining, merging and zipping ---------------------------- The simplest way to join two frames is to use the `join` operation which can be used to perform left, right, outer or inner join of two frames. When the row keys of the frames do not match exactly, you can use `joinAlign` which takes an additional parameter that specifies how to find matching key in left/right join (e.g. by taking the nearest smaller available key). Frames that do not contian overlapping values can be combined using `merge` (when combining just two frames) or using `mergeAll` (for larger number of frames). Tha latter is optimized to work well for a large number of data frames. Finally, frames with overlapping values can be combined using `zip`. It takes a function that is used to combine the overlapping values. A `zipAlign` function provides a variant with more flexible row key matching (as in `joinAlign`) Hierarchical index operations ----------------------------- A data frame has a hierarchical row index if the row index is formed by a tuple, such as <c>Frame&lt;'R1 * 'R2, 'C&gt;</c>. Frames of this kind are returned, for example, by the grouping functions such as <c>Frame.groupRowsBy</c>. The functions in this category provide ways for working with data frames that have hierarchical row keys. The functions <c>applyLevel</c> and <c>reduceLevel</c> can be used to reduce values according to one of the levels. The <c>applyLevel</c> function takes a reduction of type <c>Series&lt;'K, 'T&gt; -&gt; 'T</c> while <c>reduceLevel</c> reduces individual values using a function of type <c>'T -&gt; 'T -&gt; 'T</c>. The functions <c>nest</c> and <c>unnest</c> can be used to convert between frames with hierarchical indices (<c>Frame&lt;'K1 * 'K2, 'C&gt;</c>) and series of frames that represent individual groups (<c>Series&lt;'K1, Frame&lt;'K2, 'C&gt;&gt;</c>). The <c>nestBy</c> function can be used to perform group by operation and return the result as a series of frems. </summary>
<category>Frame and series operations</category>


--------------------
type Frame = static member ReadCsv: location: string * hasHeaders: Nullable<bool> * inferTypes: Nullable<bool> * inferRows: Nullable<int> * schema: string * separators: string * culture: string * maxRows: Nullable<int> * missingValues: string array * preferOptions: bool * encoding: Encoding -> Frame<int,string> + 1 overload static member ReadReader: reader: IDataReader -> Frame<int,string> static member CustomExpanders: Dictionary<Type,Func<obj,(string * Type * obj) seq>> static member NonExpandableInterfaces: ResizeArray<Type> static member NonExpandableTypes: HashSet<Type>
<summary> Provides static methods for creating frames, reading frame data from CSV files and database (via IDataReader). The type also provides global configuration for reflection-based expansion. </summary>
<category>Frame and series operations</category>


--------------------
type Frame<'TRowKey,'TColumnKey (requires equality and equality)> = interface IDynamicMetaObjectProvider interface INotifyCollectionChanged interface IFrameFormattable interface IFsiFormattable interface IFrame new: rowIndex: IIndex<'TRowKey> * columnIndex: IIndex<'TColumnKey> * data: IVector<IVector> * indexBuilder: IIndexBuilder * vectorBuilder: IVectorBuilder -> Frame<'TRowKey,'TColumnKey> + 1 overload member AddColumn: column: 'TColumnKey * series: 'V seq -> unit + 3 overloads member AggregateRowsBy: groupBy: 'TColumnKey seq * aggBy: 'TColumnKey seq * aggFunc: Func<Series<'TRowKey,'a>,'b> -> Frame<int,'TColumnKey> member Clone: unit -> Frame<'TRowKey,'TColumnKey> member ColumnApply: f: Func<Series<'TRowKey,'T>,ISeries<'TRowKey>> -> Frame<'TRowKey,'TColumnKey> + 1 overload ...
<summary> A frame is the key Deedle data structure (together with series). It represents a data table (think spreadsheet or CSV file) with multiple rows and columns. The frame consists of row index, column index and data. The indices are used for efficient lookup when accessing data by the row key `'TRowKey` or by the column key `'TColumnKey`. Deedle frames are optimized for the scenario when all values in a given column are of the same type (but types of different columns can differ). </summary>
<remarks><para>Joining, zipping and appending:</para><para> More info </para></remarks>
<category>Core frame and series types</category>


--------------------
new: names: 'TColumnKey seq * columns: ISeries<'TRowKey> seq -> Frame<'TRowKey,'TColumnKey>
new: rowIndex: Indices.IIndex<'TRowKey> * columnIndex: Indices.IIndex<'TColumnKey> * data: IVector<IVector> * indexBuilder: Indices.IIndexBuilder * vectorBuilder: Vectors.IVectorBuilder -> Frame<'TRowKey,'TColumnKey>
val filterRowsBy: column: 'C -> value: 'V -> frame: Frame<'R,'C> -> Frame<'R,'C> (requires equality and equality and equality)
<summary> Returns a new data frame containing only the rows of the input frame for which the specified `column` has the specified `value`. The operation may be implemented via an index for virtualized Deedle frames. </summary>
<param name="frame">Input data frame to be transformed</param>
<param name="column">The name of the column to be matched</param>
<param name="value">Required value of the column. Note that the function is generic and no conversions are performed, so the value has to match including the actual type.</param>
<category>Frame transformations</category>
static member Virtual.IsVirtualRowIndex: frame: Frame<'R,'C> -> bool (requires equality and equality)
val techCycle1: Frame<int64,string>
val filterRowsBy2: column1: 'C -> value1: 'V1 -> column2: 'C -> value2: 'V2 -> frame: Frame<'R,'C> -> Frame<'R,'C> (requires equality and equality and equality and equality)
<summary> Filter rows by two column/value predicates in one virtual Search. The two <c>LookupRange</c> results are intersected and applied once, so column <c>GetSubVector</c> runs a single time (unlike chaining <c>filterRowsBy</c>). Non-virtual frames fall back to two sequential <c>filterRowsBy</c> calls. </summary>
<category>Frame transformations</category>
val techCycle1Chain: Frame<int64,string>
val firstTech: int64
property Frame.RowKeys: int64 seq with get
<category>Accessors and slicing</category>
val head: source: 'T seq -> 'T
member Frame.GetColumn<'R> : column: 'TColumnKey -> Series<'TRowKey,'R>
member Frame.GetColumn<'R> : column: 'TColumnKey * lookup: Lookup -> Series<'TRowKey,'R>
Multiple items
val float: value: 'T -> float (requires member op_Explicit)

--------------------
type float = Double

--------------------
type float<'Measure> = float
val prepared: Frame<int64,string>
val sliceCols: columns: 'C seq -> frame: Frame<'R,'C> -> Frame<'R,'C> (requires equality and equality)
<summary> Returns a frame consisting of the specified columns from the original data frame. The function uses exact key matching semantics. &lt;category&gt;Accessing frame data and lookup&lt;/category&gt; </summary>
val f: Frame<int64,string>
property Frame.Rows: RowSeries<int64,string> with get
<category>Accessors and slicing</category>
val skip: count: int -> source: 'T seq -> 'T seq
val closeShifted: Series<int64,float>
Multiple items
module Series from Deedle
<summary> The `Series` module provides an F#-friendly API for working with data and time series. The API follows the usual design for collection-processing in F#, so the functions work well with the pipelining (<c>|&gt;</c>) operator. For example, given a series with ages, we can use `Series.filterValues` to filter outliers and then `Stats.mean` to calculate the mean: ages |&gt; Series.filterValues (fun v -&gt; v &gt; 0.0 &amp;&amp; v &lt; 120.0) |&gt; Stats.mean The module provides comprehensive set of functions for working with series. The same API is also exposed using C#-friendly extension methods. In C#, the above snippet could be written as: [lang=csharp] ages .Where(kvp =&gt; kvp.Value &gt; 0.0 &amp;&amp; kvp.Value &lt; 120.0) .Mean() For more information about similar frame-manipulation functions, see the `Frame` module. For more information about C#-friendly extensions, see `SeriesExtensions`. The functions in the `Series` module are grouped in a number of categories and documented below. Accessing series data and lookup -------------------------------- Functions in this category provide access to the values in the series. - The term _observation_ is used for a key value pair in the series. - When working with a sorted series, it is possible to perform lookup using keys that are not present in the series - you can specify to search for the previous or next available value using _lookup behavior_. - Functions such as `get` and `getAll` have their counterparts `lookup` and `lookupAll` that let you specify lookup behavior. - For most of the functions that may fail, there is a `try[Foo]` variant that returns `None` instead of failing. - Functions with a name ending with `At` perform lookup based on the absolute integer offset (and ignore the keys of the series) Series transformations ---------------------- Functions in this category perform standard transformations on series including projections, filtering, taking some sub-series of the series, aggregating values using scanning and so on. Projection and filtering functions generally skip over missing values, but there are variants `filterAll` and `mapAll` that let you handle missing values explicitly. Keys can be transformed using `mapKeys`. When you do not need to consider the keys, and only care about values, use `filterValues` and `mapValues` (which is also aliased as the `$` operator). Series supports standard set of folding functions including `reduce` and `fold` (to reduce series values into a single value) as well as the `scan[All]` function, which can be used to fold values of a series into a series of intermeidate folding results. The functions `take[Last]` and `skip[Last]` can be used to take a sub-series of the original source series by skipping a specified number of elements. Note that this does not require an ordered series and it ignores the index - for index-based lookup use slicing, such as `series.[lo .. hi]`, instead. Finally the `shift` function can be used to obtain a series with values shifted by the specified offset. This can be used e.g. to get previous value for each key using `Series.shift 1 ts`. The `diff` function calculates difference from previous value using `ts - (Series.shift offs ts)`. Processing series with exceptions --------------------------------- The functions in this group can be used to write computations over series that may fail. They use the type <c>tryval&lt;'T&gt;</c> which is defined as a discriminated union with two cases: Success containing a value, or Error containing an exception. The function `tryMap` lets you create <c>Series&lt;'K, tryval&lt;'T&gt;&gt;</c> by mapping over values of an original series. You can then extract values using `tryValues`, which throws `AggregateException` if there were any errors. Functions `tryErrors` and `trySuccesses` give series containing only errors and successes. You can fill failed values with a constant using `fillErrorsWith`. Hierarchical index operations ----------------------------- When the key of a series is tuple, the elements of the tuple can be treated as multiple levels of a index. For example <c>Series&lt;'K1 * 'K2, 'V&gt;</c> has two levels with keys of types <c>'K1</c> and <c>'K2</c> respectively. The functions in this cateogry provide a way for aggregating values in the series at one of the levels. For example, given a series `input` indexed by two-element tuple, you can calculate mean for different first-level values as follows: input |&gt; applyLevel fst Stats.mean Note that the `Stats` module provides helpers for typical statistical operations, so the above could be written just as `input |&gt; Stats.levelMean fst`. Grouping, windowing and chunking -------------------------------- This category includes functions that group data from a series in some way. Two key concepts here are _window_ and _chunk_. Window refers to (overlapping) sliding windows over the input series while chunk refers to non-overlapping blocks of the series. The boundary behavior can be specified using the `Boundary` flags. The value `Skip` means that boundaries (incomplete windows or chunks) should be skipped. The value `AtBeginning` and `AtEnding` can be used to define at which side should the boundary be returned (or skipped). For chunking, `AtBeginning ||| Skip` makes sense and it means that the incomplete chunk at the beginning should be skipped (aligning the last chunk with the end). The behavior may be specified in a number of ways (which is reflected in the name): - `dist` - using an absolute distance between the keys - `while` - using a condition on the first and last key - `size` - by specifying the absolute size of the window/chunk The functions ending with `Into` take a function to be applied to the window/chunk. The functions `window`, `windowInto` and `chunk`, `chunkInto` are simplified versions that take a size. There is also `pairwise` function for sliding window of size two. Missing values -------------- This group of functions provides a way of working with missing values in a series. The `dropMissing` function drops all keys for which there are no values in the series. The `withMissingFrom` function lets you copy missing values from another series. The remaining functions provide different mechanism for filling the missing values. * `fillMissingWith` fills missing values with a specified constant * `fillMissingUsing` calls a specified function for every missing value * `fillMissing` and variants propagates values from previous/later keys Sorting and index manipulation ------------------------------ A series that is sorted by keys allows a number of additional operations (such as lookup using the `Lookp.ExactOrSmaller` lookup behavior). However, it is also possible to sort series based on the values - although the functions for manipulation with series do not guarantee that the order will be preserved. To sort series by keys, use `sortByKey`. Other sorting functions let you sort the series using a specified comparer function (`sortWith`), using a projection function (`sortBy`) and using the default comparison (`sort`). In addition, you can also replace the keys of a series with other keys using `indexWith` or with integers using `indexOrdinally`. To pick and reorder series values using to match a list of keys use `realign`. Sampling, resampling and advanced lookup ---------------------------------------- Given a (typically) time series sampling or resampling makes it possible to get time series with representative values at lower or uniform frequency. We use the following terminology: - `lookup` and `sample` functions find values at specified key; if a key is not available, they can look for value associated with the nearest smaller or the nearest greater key. - `resample` function aggregate values values into chunks based on a specified collection of keys (e.g. explicitly provided times), or based on some relation between keys (e.g. date times having the same date). - `resampleUniform` is similar to resampling, but we specify keys by providing functions that generate a uniform sequence of keys (e.g. days), the operation also fills value for days that have no corresponding observations in the input sequence. Joining, merging and zipping ---------------------------- Given two series, there are two ways to combine the values. If the keys in the series are not overlapping (or you want to throw away values from one or the other series), then you can use `merge` or `mergeUsing`. To merge more than 2 series efficiently, use the `mergeAll` function, which has been optimized for large number of series. If you want to align two series, you can use the _zipping_ operation. This aligns two series based on their keys and gives you tuples of values. The default behavior (`zip`) uses outer join and exact matching. For ordered series, you can specify other forms of key lookups (e.g. find the greatest smaller key) using `zipAlign`. functions ending with `Into` are generally easier to use as they call a specified function to turn the tuple (of possibly missing values) into a new value. For more complicated behaviors, it is often convenient to use joins on frames instead of working with series. Create two frames with single columns and then use the join operation. The result will be a frame with two columns (which is easier to use than series of tuples). </summary>
<category>Frame and series operations</category>


--------------------
type Series = static member ofNullables: values: Nullable<'a> seq -> Series<int,'a> (requires default constructor and value type and 'a :> ValueType) static member ofObservations: observations: ('a * 'b) seq -> Series<'a,'b> (requires equality) static member ofOptionalObservations: observations: ('K * 'a option) seq -> Series<'K,'a> (requires equality) static member ofValues: values: 'a seq -> Series<int,'a>

--------------------
type Series<'K,'V (requires equality)> = interface ISeriesFormattable interface IFsiFormattable interface ISeries<'K> new: index: IIndex<'K> * vector: IVector<'V> * vectorBuilder: IVectorBuilder * indexBuilder: IIndexBuilder -> Series<'K,'V> + 3 overloads member After: lowerExclusive: 'K -> Series<'K,'V> member Aggregate: aggregation: Aggregation<'K> * keySelector: Func<DataSegment<Series<'K,'V>>,'TNewKey> * valueSelector: Func<DataSegment<Series<'K,'V>>,OptionalValue<'R>> -> Series<'TNewKey,'R> (requires equality) + 1 overload member AsyncMaterialize: unit -> Async<Series<'K,'V>> member Before: upperExclusive: 'K -> Series<'K,'V> member Between: lowerInclusive: 'K * upperInclusive: 'K -> Series<'K,'V> member Compare: another: Series<'K,'V> -> Series<'K,Diff<'V>> ...
<summary> The type <c>Series&lt;K, V&gt;</c> represents a data series consisting of values `V` indexed by keys `K`. The keys of a series may or may not be ordered </summary>
<category>Core frame and series types</category>


--------------------
new: pairs: Collections.Generic.KeyValuePair<'K,'V> seq -> Series<'K,'V>
new: keys: 'K seq * values: 'V seq -> Series<'K,'V>
new: keys: 'K array * values: 'V array -> Series<'K,'V>
new: index: Indices.IIndex<'K> * vector: IVector<'V> * vectorBuilder: Vectors.IVectorBuilder * indexBuilder: Indices.IIndexBuilder -> Series<'K,'V>
val shift: offset: int -> series: Series<'K,'T> -> Series<'K,'T> (requires equality)
<summary> Returns a series with values shifted by the specified offset. When the offset is positive, the values are shifted forward and first `offset` keys are dropped. When the offset is negative, the values are shifted backwards and the last `offset` keys are dropped. Expressed in pseudo-code: result[k] = series[k - offset] </summary>
<param name="offset">Can be both positive and negative number.</param>
<param name="series">The input series to be shifted.</param>
<remarks> If you want to calculate the difference, e.g. `s - (Series.shift 1 s)`, you can use `Series.diff` which will be a little bit faster. </remarks>
<category>Series transformations</category>
type Stats = static member corr: series1: Series<'K,'V1> -> series2: Series<'K,'V2> -> float (requires equality) static member corrFrame: frame: Frame<'R,'C> -> Frame<'C,'C> (requires equality and equality) static member count: series: Series<'K,'V> -> int (requires equality) + 1 overload static member cov: series1: Series<'K,'V1> -> series2: Series<'K,'V2> -> float (requires equality) static member covFrame: frame: Frame<'R,'C> -> Frame<'C,'C> (requires equality and equality) static member describe: series: Series<'K,'V> -> Series<string,float> (requires equality and equality) + 1 overload static member expandingCount: series: Series<'K,'V> -> Series<'K,float> (requires equality) static member expandingKurt: series: Series<'K,'V> -> Series<'K,float> (requires equality) static member expandingMax: series: Series<'K,'V> -> Series<'K,float> (requires equality) static member expandingMean: series: Series<'K,'V> -> Series<'K,float> (requires equality) ...
static member Stats.sum: frame: Frame<'R,'C> -> Series<'C,float> (requires equality and equality)
static member Stats.sum: series: Series<'K,'V> -> float (requires equality)
val batches: FloatBatch<int64> seq
static member Virtual.MaterializeFloatBatches: frame: Frame<'TRowKey,'TColumnKey> * batchSize: int64 * columns: 'TColumnKey list * ?missingPolicy: FloatMissingPolicy * ?includeRowKeys: bool * ?labelsColumn: 'TColumnKey * ?layout: FloatBatchLayout * ?includeMissingMask: bool * ?maxRows: int64 * ?order: FloatBatchOrder -> FloatBatch<'TRowKey> seq (requires equality and equality)
type FloatBatchOrder = | Sequential | Shuffled | ShuffledWithSeed of seed: int
<summary> Row order when splitting a frame into mini-batches. </summary>
union case FloatBatchOrder.ShuffledWithSeed: seed: int -> FloatBatchOrder
<summary> Like &lt;see cref="Shuffled"/&gt;, with a fixed seed for reproducibility. </summary>
type FloatMissingPolicy = | NaN | Value of float
<summary> Missing-value handling used by [`Virtual.MaterializeFloatBatches`]. </summary>
union case FloatMissingPolicy.NaN: FloatMissingPolicy
<summary> Map missing cells to `Double.NaN`. </summary>
val firstBatch: FloatBatch<int64>
FloatBatch.Rows: int
FloatBatch.Cols: int
FloatBatch.FeaturesFlat: float array
<summary> Contiguous feature matrix (`Rows * Cols` elements). </summary>
val n: int64
val cats: string array
val scheme: string
val catSource: OrdinalVirtualSource<string>
Multiple items
type OrdinalVirtualSource<'T> = interface IVirtualVectorSourceLookupDiagnostics interface IVirtualVectorSource<'T> interface IVirtualVectorSource new: length: int64 * valueAt: (int64 -> OptionalValue<'T>) * schemeId: string * ?asLong: ('T -> int64) * ?lookupRange: LookupRangeMode<'T> * ?searchColumnConfigured: bool -> OrdinalVirtualSource<'T> member RawValueAt: i: int64 -> OptionalValue<'T> member TryGetLookupRange: unit -> VirtualColumnLookupRange option member Length: int64
<summary> Ordinal pull-on-read virtual source with optional LookupRange semantics. </summary>

--------------------
new: length: int64 * valueAt: (int64 -> OptionalValue<'T>) * schemeId: string * ?asLong: ('T -> int64) * ?lookupRange: LookupRangeMode<'T> * ?searchColumnConfigured: bool -> OrdinalVirtualSource<'T>
val i: int64
Multiple items
module OptionalValue from Deedle
<summary> Provides various helper functions for using the <c>OptionalValue&lt;T&gt;</c> type from F# (The functions are similar to those in the standard <c>Option</c> module). </summary>
<category>Primitive types and values</category>


--------------------
type OptionalValue = class end
<summary> Non-generic type that makes it easier to create <c>OptionalValue&lt;T&gt;</c> values from C# by benefiting the type inference for generic method invocations. </summary>
<category>Primitive types and values</category>


--------------------
type OptionalValue<'T> = new: value: 'T -> OptionalValue<'T> override Equals: y: obj -> bool override GetHashCode: unit -> int override ToString: unit -> string member HasValue: bool member Value: 'T member ValueOrDefault: 'T static member Missing: OptionalValue<'T>
<summary> Value type that represents a potentially missing value. This is similar to <c>System.Nullable&lt;T&gt;</c>, but does not restrict the contained value to be a value type, so it can be used for storing values of any types. When obtained from <c>DataFrame&lt;R, C&gt;</c> or <c>Series&lt;K, T&gt;</c>, the <c>Value</c> will never be <c>Double.NaN</c> or <c>null</c> (but this is not, in general, checked when constructing the value). The type is only used in C#-friendly API. F# operations generally use expose standard F# <c>option&lt;T&gt;</c> type instead. However, there the <c>OptionalValue</c> module contains helper functions for using this type from F# as well as <c>Missing</c> and <c>Present</c> active patterns. </summary>
<category>Primitive types and values</category>


--------------------
OptionalValue ()
new: value: 'T -> OptionalValue<'T>
Multiple items
val int: value: 'T -> int (requires member op_Explicit)

--------------------
type int = int32

--------------------
type int<'Measure> = int
Multiple items
val int64: value: 'T -> int64 (requires member op_Explicit)

--------------------
type int64 = Int64

--------------------
type int64<'Measure> = int64
property Array.Length: int with get
<summary>Gets the total number of elements in all the dimensions of the <see cref="T:System.Array" />.</summary>
<exception cref="T:System.OverflowException">The array is multidimensional and contains more than <see cref="F:System.Int32.MaxValue">Int32.MaxValue</see> elements.</exception>
<returns>The total number of elements in all the dimensions of the <see cref="T:System.Array" />; zero if there are no elements in the array.</returns>
val closeSource: OrdinalVirtualSource<float>
val demo: Frame<int64,string>
static member Virtual.CreateOrdinalFrame: keys: 'a seq * sources: IVirtualVectorSource seq -> Frame<int64,'a> (requires equality)
Multiple items
type IVirtualVectorSource = abstract Invoke: IVirtualVectorSourceOperation<'R> -> 'R abstract AddressOperations: IAddressOperations abstract AddressingSchemeID: string abstract ElementType: Type abstract Length: int64
<summary> Non-generic part of the `IVirtualVectorSource&lt;'V&gt;` interface, which provides some basic information about the virtualized data source </summary>

--------------------
type IVirtualVectorSource<'V> = inherit IVirtualVectorSource abstract GetSubVector: RangeRestriction<Address> -> IVirtualVectorSource<'V> abstract LookupRange: 'V -> RangeRestriction<Address> abstract LookupValue: 'V * Lookup * Func<Address,bool> -> OptionalValue<'V * Address> abstract MergeWith: IVirtualVectorSource<'V> seq -> IVirtualVectorSource<'V> abstract ValueAt: IVectorLocation -> OptionalValue<'V>
<summary> Represents a data source for Big Deedle. The interface is used both as a representation of data source for `VirtualVector` (this file) and `VirtualIndex` (another file). The index uses `Length` and `ValueAt` to perform binary search when looking for a key; the vector simply provides an access to values using `ValueAt`. </summary>

Type something to start searching.