deepbox 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +344 -0
- package/dist/CSRMatrix-CwGwQRea.d.cts +219 -0
- package/dist/CSRMatrix-KzNt6QpS.d.ts +219 -0
- package/dist/Tensor-BQLk1ltW.d.cts +147 -0
- package/dist/Tensor-g8mUClel.d.ts +147 -0
- package/dist/chunk-4S73VUBD.js +677 -0
- package/dist/chunk-4S73VUBD.js.map +1 -0
- package/dist/chunk-5R4S63PF.js +2925 -0
- package/dist/chunk-5R4S63PF.js.map +1 -0
- package/dist/chunk-6AE5FKKQ.cjs +9264 -0
- package/dist/chunk-6AE5FKKQ.cjs.map +1 -0
- package/dist/chunk-AD436M45.js +3854 -0
- package/dist/chunk-AD436M45.js.map +1 -0
- package/dist/chunk-ALS7ETWZ.cjs +4263 -0
- package/dist/chunk-ALS7ETWZ.cjs.map +1 -0
- package/dist/chunk-AU7XHGKJ.js +2092 -0
- package/dist/chunk-AU7XHGKJ.js.map +1 -0
- package/dist/chunk-B5TNKUEY.js +1481 -0
- package/dist/chunk-B5TNKUEY.js.map +1 -0
- package/dist/chunk-BCR7G3A6.js +9136 -0
- package/dist/chunk-BCR7G3A6.js.map +1 -0
- package/dist/chunk-C4PKXY74.cjs +1917 -0
- package/dist/chunk-C4PKXY74.cjs.map +1 -0
- package/dist/chunk-DWZY6PIP.cjs +6400 -0
- package/dist/chunk-DWZY6PIP.cjs.map +1 -0
- package/dist/chunk-E3EU5FZO.cjs +2113 -0
- package/dist/chunk-E3EU5FZO.cjs.map +1 -0
- package/dist/chunk-F3JWBINJ.js +1054 -0
- package/dist/chunk-F3JWBINJ.js.map +1 -0
- package/dist/chunk-FJYLIGJX.js +1940 -0
- package/dist/chunk-FJYLIGJX.js.map +1 -0
- package/dist/chunk-JSCDE774.cjs +729 -0
- package/dist/chunk-JSCDE774.cjs.map +1 -0
- package/dist/chunk-LWECRCW2.cjs +2412 -0
- package/dist/chunk-LWECRCW2.cjs.map +1 -0
- package/dist/chunk-MLBMYKCG.js +6379 -0
- package/dist/chunk-MLBMYKCG.js.map +1 -0
- package/dist/chunk-OX6QXFMV.cjs +3874 -0
- package/dist/chunk-OX6QXFMV.cjs.map +1 -0
- package/dist/chunk-PHV2DKRS.cjs +1072 -0
- package/dist/chunk-PHV2DKRS.cjs.map +1 -0
- package/dist/chunk-PL7TAYKI.js +4056 -0
- package/dist/chunk-PL7TAYKI.js.map +1 -0
- package/dist/chunk-PR647I7R.js +1898 -0
- package/dist/chunk-PR647I7R.js.map +1 -0
- package/dist/chunk-QERHVCHC.cjs +2960 -0
- package/dist/chunk-QERHVCHC.cjs.map +1 -0
- package/dist/chunk-XEG44RF6.cjs +1514 -0
- package/dist/chunk-XEG44RF6.cjs.map +1 -0
- package/dist/chunk-XMWVME2W.js +2377 -0
- package/dist/chunk-XMWVME2W.js.map +1 -0
- package/dist/chunk-ZB75FESB.cjs +1979 -0
- package/dist/chunk-ZB75FESB.cjs.map +1 -0
- package/dist/chunk-ZLW62TJG.cjs +4061 -0
- package/dist/chunk-ZLW62TJG.cjs.map +1 -0
- package/dist/chunk-ZXKBDFP3.js +4235 -0
- package/dist/chunk-ZXKBDFP3.js.map +1 -0
- package/dist/core/index.cjs +204 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +2 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/dataframe/index.cjs +22 -0
- package/dist/dataframe/index.cjs.map +1 -0
- package/dist/dataframe/index.d.cts +3 -0
- package/dist/dataframe/index.d.ts +3 -0
- package/dist/dataframe/index.js +5 -0
- package/dist/dataframe/index.js.map +1 -0
- package/dist/datasets/index.cjs +134 -0
- package/dist/datasets/index.cjs.map +1 -0
- package/dist/datasets/index.d.cts +3 -0
- package/dist/datasets/index.d.ts +3 -0
- package/dist/datasets/index.js +5 -0
- package/dist/datasets/index.js.map +1 -0
- package/dist/index-74AB8Cyh.d.cts +1126 -0
- package/dist/index-9oQx1HgV.d.cts +1180 -0
- package/dist/index-BJY2SI4i.d.ts +483 -0
- package/dist/index-BWGhrDlr.d.ts +733 -0
- package/dist/index-B_DK4FKY.d.cts +242 -0
- package/dist/index-BbA2Gxfl.d.ts +456 -0
- package/dist/index-BgHYAoSS.d.cts +837 -0
- package/dist/index-BndMbqsM.d.ts +1439 -0
- package/dist/index-C1mfVYoo.d.ts +2517 -0
- package/dist/index-CCvlwAmL.d.cts +809 -0
- package/dist/index-CDw5CnOU.d.ts +785 -0
- package/dist/index-Cn3SdB0O.d.ts +1126 -0
- package/dist/index-CrqLlS-a.d.ts +776 -0
- package/dist/index-D61yaSMY.d.cts +483 -0
- package/dist/index-D9Loo1_A.d.cts +2517 -0
- package/dist/index-DIT_OO9C.d.cts +785 -0
- package/dist/index-DIp_RrRt.d.ts +242 -0
- package/dist/index-DbultU6X.d.cts +1427 -0
- package/dist/index-DmEg_LCm.d.cts +776 -0
- package/dist/index-DoPWVxPo.d.cts +1439 -0
- package/dist/index-DuCxd-8d.d.ts +837 -0
- package/dist/index-Dx42TZaY.d.ts +809 -0
- package/dist/index-DyZ4QQf5.d.cts +456 -0
- package/dist/index-GFAVyOWO.d.ts +1427 -0
- package/dist/index-WHQLn0e8.d.cts +733 -0
- package/dist/index-ZtI1Iy4L.d.ts +1180 -0
- package/dist/index-eJgeni9c.d.cts +1911 -0
- package/dist/index-tk4lSYod.d.ts +1911 -0
- package/dist/index.cjs +72 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +17 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/linalg/index.cjs +86 -0
- package/dist/linalg/index.cjs.map +1 -0
- package/dist/linalg/index.d.cts +3 -0
- package/dist/linalg/index.d.ts +3 -0
- package/dist/linalg/index.js +5 -0
- package/dist/linalg/index.js.map +1 -0
- package/dist/metrics/index.cjs +158 -0
- package/dist/metrics/index.cjs.map +1 -0
- package/dist/metrics/index.d.cts +3 -0
- package/dist/metrics/index.d.ts +3 -0
- package/dist/metrics/index.js +5 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/ml/index.cjs +87 -0
- package/dist/ml/index.cjs.map +1 -0
- package/dist/ml/index.d.cts +3 -0
- package/dist/ml/index.d.ts +3 -0
- package/dist/ml/index.js +6 -0
- package/dist/ml/index.js.map +1 -0
- package/dist/ndarray/index.cjs +501 -0
- package/dist/ndarray/index.cjs.map +1 -0
- package/dist/ndarray/index.d.cts +5 -0
- package/dist/ndarray/index.d.ts +5 -0
- package/dist/ndarray/index.js +4 -0
- package/dist/ndarray/index.js.map +1 -0
- package/dist/nn/index.cjs +142 -0
- package/dist/nn/index.cjs.map +1 -0
- package/dist/nn/index.d.cts +6 -0
- package/dist/nn/index.d.ts +6 -0
- package/dist/nn/index.js +5 -0
- package/dist/nn/index.js.map +1 -0
- package/dist/optim/index.cjs +77 -0
- package/dist/optim/index.cjs.map +1 -0
- package/dist/optim/index.d.cts +4 -0
- package/dist/optim/index.d.ts +4 -0
- package/dist/optim/index.js +4 -0
- package/dist/optim/index.js.map +1 -0
- package/dist/plot/index.cjs +114 -0
- package/dist/plot/index.cjs.map +1 -0
- package/dist/plot/index.d.cts +6 -0
- package/dist/plot/index.d.ts +6 -0
- package/dist/plot/index.js +5 -0
- package/dist/plot/index.js.map +1 -0
- package/dist/preprocess/index.cjs +82 -0
- package/dist/preprocess/index.cjs.map +1 -0
- package/dist/preprocess/index.d.cts +4 -0
- package/dist/preprocess/index.d.ts +4 -0
- package/dist/preprocess/index.js +5 -0
- package/dist/preprocess/index.js.map +1 -0
- package/dist/random/index.cjs +74 -0
- package/dist/random/index.cjs.map +1 -0
- package/dist/random/index.d.cts +3 -0
- package/dist/random/index.d.ts +3 -0
- package/dist/random/index.js +5 -0
- package/dist/random/index.js.map +1 -0
- package/dist/stats/index.cjs +142 -0
- package/dist/stats/index.cjs.map +1 -0
- package/dist/stats/index.d.cts +3 -0
- package/dist/stats/index.d.ts +3 -0
- package/dist/stats/index.js +5 -0
- package/dist/stats/index.js.map +1 -0
- package/dist/tensor-B96jjJLQ.d.cts +205 -0
- package/dist/tensor-B96jjJLQ.d.ts +205 -0
- package/package.json +226 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dataframe/index.ts","../src/dataframe/utils.ts","../src/dataframe/Series.ts","../src/dataframe/DataFrame.ts"],"names":["tensor","i"],"mappings":"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","file":"chunk-PL7TAYKI.js","sourcesContent":["export { DataFrame, DataFrameGroupBy } from \"./DataFrame.js\";\nexport { Series } from \"./Series.js\";\nexport type {\n AggregateFunction,\n DataFrameData,\n DataFrameOptions,\n SeriesOptions,\n} from \"./types.js\";\n","/**\n * Internal utilities for DataFrame and Series.\n */\n\n/**\n * Checks if a value is a Record (object but not null or array).\n */\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n/**\n * Generates a unique string key for a value or array of values.\n * Handles distinctions between:\n * - null vs undefined\n * - NaN vs other numbers\n * - Infinity vs -Infinity\n * - 1 vs \"1\"\n * - Nested arrays\n */\nexport const createKey = (value: unknown): string => {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n\n const type = typeof value;\n\n if (type === \"number\") {\n if (Number.isNaN(value)) return \"NaN\";\n if (value === Infinity) return \"Infinity\";\n if (value === -Infinity) return \"-Infinity\";\n return `n:${value}`;\n }\n\n if (type === \"string\") {\n return `s:${value}`;\n }\n\n if (type === \"boolean\") {\n return `b:${value}`;\n }\n\n if (type === \"bigint\") {\n return `bi:${value.toString()}`;\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(createKey).join(\",\")}]`;\n }\n\n // For objects, we'll do a stable sort of keys to ensure {a:1, b:2} === {b:2, a:1}\n if (isRecord(value)) {\n const keys = Object.keys(value).sort();\n const parts = keys.map((k) => `${createKey(k)}:${createKey(value[k])}`);\n return `{${parts.join(\",\")}}`;\n }\n\n return String(value);\n};\n\n/**\n * Checks if a value is a valid number (not NaN, not Infinity).\n */\nexport const isValidNumber = (value: unknown): value is number => {\n return typeof value === \"number\" && !Number.isNaN(value) && Number.isFinite(value);\n};\n","import { DataValidationError, IndexError, InvalidParameterError } from \"../core/errors/index.js\";\nimport { type Tensor, tensor } from \"../ndarray/index.js\";\nimport type { SeriesOptions } from \"./types.js\";\nimport { createKey } from \"./utils.js\";\n\n/**\n * One-dimensional labeled array capable of holding any data type.\n *\n * A Series is like a column in a spreadsheet or database table. It combines:\n * - An array of data values\n * - An array of index labels (can be strings or numbers)\n * - An optional name\n *\n * Similar to pandas Series in Python.\n *\n * @template T - The type of data stored in the Series\n *\n * @example\n * ```ts\n * // Create a numeric series\n * const s = new Series([1, 2, 3, 4], { name: 'numbers' });\n *\n * // Create a series with custom index\n * const s2 = new Series(['a', 'b', 'c'], {\n * index: ['row1', 'row2', 'row3'],\n * name: 'letters'\n * });\n * ```\n *\n * @see {@link https://pandas.pydata.org/docs/reference/api/pandas.Series.html | Pandas Series}\n */\nexport class Series<T = unknown> {\n // Internal storage for the actual data values\n private _data: T[];\n // Internal storage for index labels (can be strings or numbers)\n private _index: (string | number)[];\n // Fast label -> position lookup for O(1) label-based access\n private _indexPos: Map<string | number, number>;\n // Optional name for this Series\n private _name: string | undefined;\n\n /**\n * Creates a new Series instance.\n *\n * @param data - Array of values to store in the Series\n * @param options - Configuration options\n * @param options.index - Custom index labels (defaults to 0, 1, 2, ...)\n * @param options.name - Optional name for the Series\n *\n * @example\n * ```ts\n * const s = new Series([10, 20, 30], {\n * index: ['a', 'b', 'c'],\n * name: 'values'\n * });\n * ```\n */\n constructor(data: T[], options: SeriesOptions = {}) {\n // Store a shallow copy to prevent external mutation of internal state, unless copy=false\n this._data = options.copy === false ? data : [...data];\n\n // Use provided index or generate default numeric index [0, 1, 2, ...]\n this._index = options.index\n ? options.copy === false\n ? options.index\n : [...options.index]\n : Array.from({ length: this._data.length }, (_, i) => i);\n\n if (this._index.length !== this._data.length) {\n throw new DataValidationError(\n `Index length (${this._index.length}) must match data length (${this._data.length})`\n );\n }\n\n // Build index lookup map and enforce unique labels (required for unambiguous label-based access)\n this._indexPos = new Map();\n for (let i = 0; i < this._index.length; i++) {\n const label = this._index[i];\n if (label === undefined) {\n throw new DataValidationError(\"Index labels cannot be undefined\");\n }\n if (this._indexPos.has(label)) {\n throw new DataValidationError(`Duplicate index label '${String(label)}' is not supported`);\n }\n this._indexPos.set(label, i);\n }\n\n // Store the optional name\n this._name = options.name;\n }\n\n /**\n * Get the underlying data array.\n *\n * @returns Read-only view of the data array\n */\n get data(): readonly T[] {\n return this._data;\n }\n\n /**\n * Get the index labels.\n *\n * @returns Read-only view of the index array\n */\n get index(): readonly (string | number)[] {\n return this._index;\n }\n\n /**\n * Get the Series name.\n *\n * @returns The name of this Series, or undefined if not set\n */\n get name(): string | undefined {\n return this._name;\n }\n\n /**\n * Get the number of elements in the Series.\n *\n * @returns Length of the Series\n */\n get length(): number {\n return this._data.length;\n }\n\n /**\n * Get a value by label.\n *\n * This method is an alias for `loc()`. It performs strict label-based lookup.\n * For positional access, use `iloc()`.\n *\n * @param label - The index label to look up\n * @returns The value at that label, or undefined if not found\n *\n * @example\n * ```ts\n * const s = new Series([10, 20, 30], { index: ['a', 'b', 'c'] });\n * s.get('a'); // 10\n * s.get('z'); // undefined\n * ```\n */\n get(label: number | string): T | undefined {\n const position = this._indexPos.get(label);\n return position === undefined ? undefined : this._data[position];\n }\n\n /**\n * Access a value by label (label-based indexing).\n *\n * @param label - The index label to look up\n * @returns The value at that label, or undefined if not found\n *\n * @example\n * ```ts\n * const s = new Series([10, 20], { index: ['a', 'b'] });\n * s.loc('a'); // 10\n * ```\n */\n loc(label: string | number): T | undefined {\n const position = this._indexPos.get(label);\n return position === undefined ? undefined : this._data[position];\n }\n\n /**\n * Access a value by integer position (position-based indexing).\n *\n * @param position - The integer position (0-based)\n * @returns The value at that position, or undefined if out of bounds\n * @throws {IndexError} If position is out of bounds\n *\n * @example\n * ```ts\n * const s = new Series([10, 20, 30]);\n * s.iloc(0); // 10\n * s.iloc(2); // 30\n * ```\n */\n iloc(position: number): T | undefined {\n if (this._data.length === 0) {\n throw new IndexError(`Series is empty`, {\n index: position,\n validRange: [0, 0],\n });\n }\n if (position < 0 || position >= this._data.length) {\n throw new IndexError(`Position ${position} is out of bounds (0-${this._data.length - 1})`, {\n index: position,\n validRange: [0, this._data.length - 1],\n });\n }\n // Direct array access by position\n return this._data[position];\n }\n\n /**\n * Return the first n elements.\n *\n * @param n - Number of elements to return (default: 5)\n * @returns New Series with the first n elements\n *\n * @example\n * ```ts\n * const s = new Series([1, 2, 3, 4, 5, 6]);\n * s.head(3); // Series([1, 2, 3])\n * ```\n */\n head(n: number = 5): Series<T> {\n if (!Number.isFinite(n) || !Number.isInteger(n) || n < 0) {\n throw new InvalidParameterError(\"n must be a non-negative integer\", \"n\", n);\n }\n // Slice both data and index from start to n\n const options: SeriesOptions = {\n index: this._index.slice(0, n),\n };\n if (this._name !== undefined) {\n options.name = this._name;\n }\n return new Series(this._data.slice(0, n), options);\n }\n\n /**\n * Return the last n elements.\n *\n * @param n - Number of elements to return (default: 5)\n * @returns New Series with the last n elements\n *\n * @example\n * ```ts\n * const s = new Series([1, 2, 3, 4, 5, 6]);\n * s.tail(3); // Series([4, 5, 6])\n * ```\n */\n tail(n: number = 5): Series<T> {\n if (!Number.isFinite(n) || !Number.isInteger(n) || n < 0) {\n throw new InvalidParameterError(\"n must be a non-negative integer\", \"n\", n);\n }\n const sliceStart = this._data.length - n;\n const options: SeriesOptions = {\n index: this._index.slice(sliceStart),\n };\n if (this._name !== undefined) {\n options.name = this._name;\n }\n return new Series(this._data.slice(sliceStart), options);\n }\n\n /**\n * Filter Series by a boolean predicate function.\n *\n * Filters both data AND index to maintain alignment.\n *\n * @param predicate - Function that returns true for elements to keep\n * @returns New Series with only elements that passed the predicate\n *\n * @example\n * ```ts\n * const s = new Series([1, 2, 3, 4, 5]);\n * s.filter(x => x > 2); // Series([3, 4, 5])\n * ```\n */\n filter(predicate: (value: T, index: number) => boolean): Series<T> {\n // Filter data and collect corresponding indices\n const filteredData: T[] = [];\n const filteredIndex: (string | number)[] = [];\n\n // Iterate through data and keep matching elements + their indices\n let dataIndex = 0;\n for (const dataItem of this._data) {\n const indexItem = this._index[dataIndex];\n if (indexItem === undefined) {\n throw new DataValidationError(\"Index labels cannot be undefined\");\n }\n\n if (predicate(dataItem, dataIndex)) {\n filteredData.push(dataItem);\n filteredIndex.push(indexItem);\n }\n dataIndex++;\n }\n\n // Create new Series with aligned data and index\n const options: SeriesOptions = {\n index: filteredIndex,\n };\n if (this._name !== undefined) {\n options.name = this._name;\n }\n return new Series(filteredData, options);\n }\n\n /**\n * Transform each element using a mapping function.\n *\n * @template U - The type of the transformed values\n * @param fn - Function to apply to each element\n * @returns New Series with transformed values\n *\n * @example\n * ```ts\n * const s = new Series([1, 2, 3]);\n * s.map(x => x * 2); // Series([2, 4, 6])\n * ```\n */\n map<U>(fn: (value: T, index: number) => U): Series<U> {\n // Map over data, preserving index and name\n const options: SeriesOptions = {\n index: this._index,\n };\n if (this._name !== undefined) {\n options.name = this._name;\n }\n return new Series(this._data.map(fn), options);\n }\n\n /**\n * Sort the Series values.\n *\n * Preserves index-value mapping by sorting `[value, index]` pairs.\n *\n * @param ascending - Sort in ascending order (default: true)\n * @returns New sorted Series with index reordered to match\n *\n * @example\n * ```ts\n * const s = new Series([3, 1, 2], { index: ['a', 'b', 'c'] });\n * s.sort(); // Series([1, 2, 3]) with index ['b', 'c', 'a']\n * ```\n */\n sort(ascending: boolean = true): Series<T> {\n // Create array of [value, index] pairs to maintain association\n const paired: Array<[T, string | number]> = [];\n let pairIndex = 0;\n for (const value of this._data) {\n const idx = this._index[pairIndex];\n if (idx === undefined) {\n throw new DataValidationError(\"Index labels cannot be undefined\");\n }\n paired.push([value, idx]);\n pairIndex++;\n }\n\n // Sort the pairs by value\n paired.sort((a, b) => {\n const aVal = a[0];\n const bVal = b[0];\n\n // Handle numeric comparison (NaN sorts to end)\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\n const aIsNaN = Number.isNaN(aVal);\n const bIsNaN = Number.isNaN(bVal);\n if (aIsNaN && bIsNaN) return 0;\n if (aIsNaN) return 1;\n if (bIsNaN) return -1;\n return ascending ? aVal - bVal : bVal - aVal;\n }\n\n // Handle string comparison\n if (typeof aVal === \"string\" && typeof bVal === \"string\") {\n return ascending ? aVal.localeCompare(bVal) : bVal.localeCompare(aVal);\n }\n\n // Fallback: convert to string and compare\n const aStr = String(aVal);\n const bStr = String(bVal);\n return ascending ? aStr.localeCompare(bStr) : bStr.localeCompare(aStr);\n });\n\n // Separate back into data and index arrays\n const sortedData = paired.map((p) => p[0]);\n const sortedIndex = paired.map((p) => p[1]);\n\n const options: SeriesOptions = {\n index: sortedIndex,\n };\n if (this._name !== undefined) {\n options.name = this._name;\n }\n return new Series(sortedData, options);\n }\n\n /**\n * Get unique values in the Series.\n *\n * @returns Array of unique values (order preserved)\n *\n * @example\n * ```ts\n * const s = new Series([1, 2, 2, 3, 1]);\n * s.unique(); // [1, 2, 3]\n * ```\n */\n unique(): T[] {\n // Use Set to remove duplicates, then convert back to array\n return [...new Set(this._data)];\n }\n\n /**\n * Count occurrences of unique values.\n *\n * Returns a Series where index is the unique values and data is their counts.\n *\n * @returns Series where index is unique values and data is their counts\n *\n * @example\n * ```ts\n * const s = new Series(['a', 'b', 'a', 'c', 'a']);\n * s.valueCounts(); // Series([3, 1, 1]) with index ['a', 'b', 'c']\n * ```\n */\n valueCounts(): Series<number> {\n // Validate types: must be string or number\n for (const v of this._data) {\n if (typeof v !== \"string\" && typeof v !== \"number\" && v !== null && v !== undefined) {\n throw new DataValidationError(\"Series.valueCounts() only supports Series<string | number>\");\n }\n }\n\n const counts = new Map<string, number>();\n const keyToValue = new Map<string, T>();\n\n for (const v of this._data) {\n const key = createKey(v);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n if (!keyToValue.has(key)) {\n keyToValue.set(key, v);\n }\n }\n\n // Sort keys by count (descending)\n const sortedKeys = [...counts.keys()].sort((a, b) => {\n const countA = counts.get(a) ?? 0;\n const countB = counts.get(b) ?? 0;\n return countB - countA;\n });\n\n const values = sortedKeys.map((k) => counts.get(k) ?? 0);\n // Use the original values as index labels.\n const index = sortedKeys.map((k) => {\n const val = keyToValue.get(k);\n if (typeof val === \"string\" || typeof val === \"number\") {\n return val;\n }\n return String(val);\n });\n\n return new Series(values, {\n index: index,\n name: this._name ? `${this._name}_counts` : \"counts\",\n });\n }\n\n /**\n * Calculate the sum of all values.\n *\n * Skips null, undefined, and NaN values.\n *\n * @returns Sum of all numeric values.\n * @throws {DataValidationError} If Series is empty or contains non-numeric data\n *\n * @example\n * ```ts\n * const s = new Series([1, 2, null, 3, 4]);\n * s.sum(); // 10\n * ```\n */\n sum(): number {\n if (this._data.length === 0) {\n throw new DataValidationError(\"Cannot get sum of empty Series\");\n }\n\n let total = 0;\n for (const val of this._data) {\n if (val === null || val === undefined) continue;\n if (typeof val !== \"number\") {\n throw new DataValidationError(\"Series.sum() only works on numeric data\");\n }\n if (Number.isNaN(val)) continue;\n\n total += val;\n }\n\n return total;\n }\n\n /**\n * Calculate the arithmetic mean (average) of all values.\n *\n * Skips null, undefined, and NaN values.\n *\n * @returns Mean of all numeric values.\n * @throws {DataValidationError} If Series is empty or contains non-numeric data\n *\n * @example\n * ```ts\n * const s = new Series([1, 2, null, 3, 4]);\n * s.mean(); // 2.5\n * ```\n */\n mean(): number {\n if (this._data.length === 0) {\n throw new DataValidationError(\"Cannot get mean of empty Series\");\n }\n\n let total = 0;\n let count = 0;\n\n for (const val of this._data) {\n if (val === null || val === undefined) continue;\n if (typeof val !== \"number\") {\n throw new DataValidationError(\"Series.mean() only works on numeric data\");\n }\n if (Number.isNaN(val)) continue;\n\n total += val;\n count++;\n }\n\n return count > 0 ? total / count : NaN;\n }\n\n /**\n * Calculate the median (middle value) of all values.\n *\n * Skips null, undefined, and NaN values.\n * For even-length Series, returns the average of the two middle values.\n *\n * @returns Median value.\n * @throws {DataValidationError} If Series is empty or contains non-numeric data\n *\n * @example\n * ```ts\n * const s = new Series([1, 2, 3, 4, 5]);\n * s.median(); // 3\n * ```\n */\n median(): number {\n if (this._data.length === 0) {\n throw new DataValidationError(\"Cannot get median of empty Series\");\n }\n\n const numericData: number[] = [];\n for (const value of this._data) {\n if (value === null || value === undefined) continue;\n if (typeof value !== \"number\") {\n throw new DataValidationError(\"Series.median() only works on numeric data\");\n }\n if (!Number.isNaN(value)) {\n numericData.push(value);\n }\n }\n\n if (numericData.length === 0) {\n return NaN;\n }\n\n // Create a sorted copy (don't mutate numericData)\n const sorted = [...numericData].sort((a, b) => a - b);\n\n // Find the middle index\n const middle = Math.floor(sorted.length / 2);\n\n // If even length, average the two middle values\n // If odd length, return the single middle value\n if (sorted.length % 2 === 0) {\n const val1 = sorted[middle - 1];\n const val2 = sorted[middle];\n if (val1 === undefined || val2 === undefined) {\n return NaN;\n }\n return (val1 + val2) / 2;\n }\n const val = sorted[middle];\n return val !== undefined ? val : NaN;\n }\n\n /**\n * Calculate the standard deviation of all values.\n *\n * Skips null, undefined, and NaN values.\n * Uses sample standard deviation (divides by n-1).\n *\n * @returns Standard deviation.\n * @throws {DataValidationError} If Series is empty or contains non-numeric data\n *\n * @example\n * ```ts\n * const s = new Series([2, 4, 6, 8]);\n * s.std(); // ~2.58\n * ```\n */\n std(): number {\n if (this._data.length === 0) {\n throw new DataValidationError(\"Cannot get std of empty Series\");\n }\n\n const numericData: number[] = [];\n for (const value of this._data) {\n if (value === null || value === undefined) continue;\n if (typeof value !== \"number\") {\n throw new DataValidationError(\"Series.std() only works on numeric data\");\n }\n if (!Number.isNaN(value)) {\n numericData.push(value);\n }\n }\n\n // Need at least 2 values for sample std\n if (numericData.length < 2) {\n return NaN;\n }\n\n // Calculate mean first\n const sum = numericData.reduce((acc, val) => acc + val, 0);\n const meanVal = sum / numericData.length;\n\n // Sum of squared differences from mean\n let sumSquaredDiff = 0;\n for (const val of numericData) {\n const diff = val - meanVal;\n sumSquaredDiff += diff * diff;\n }\n\n // Sample standard deviation: divide by (n-1) then sqrt\n return Math.sqrt(sumSquaredDiff / (numericData.length - 1));\n }\n\n /**\n * Calculate the variance of all values.\n *\n * Skips null, undefined, and NaN values.\n * Uses sample variance (divides by n-1).\n *\n * @returns Variance.\n * @throws {DataValidationError} If Series is empty or contains non-numeric data\n *\n * @example\n * ```ts\n * const s = new Series([2, 4, 6, 8]);\n * s.var(); // ~6.67\n * ```\n */\n var(): number {\n if (this._data.length === 0) {\n throw new DataValidationError(\"Cannot get variance of empty Series\");\n }\n\n const numericData: number[] = [];\n for (const value of this._data) {\n if (value === null || value === undefined) continue;\n if (typeof value !== \"number\") {\n throw new DataValidationError(\"Series.var() only works on numeric data\");\n }\n if (!Number.isNaN(value)) {\n numericData.push(value);\n }\n }\n\n // Need at least 2 values for sample variance\n if (numericData.length < 2) {\n return NaN;\n }\n\n // Calculate mean first\n const sum = numericData.reduce((acc, val) => acc + val, 0);\n const meanVal = sum / numericData.length;\n\n // Sum of squared differences from mean\n let sumSquaredDiff = 0;\n for (const val of numericData) {\n const diff = val - meanVal;\n sumSquaredDiff += diff * diff;\n }\n\n // Sample variance: divide by (n-1)\n return sumSquaredDiff / (numericData.length - 1);\n }\n\n /**\n * Find the minimum value in the Series.\n *\n * Skips null, undefined, and NaN values.\n *\n * @returns Minimum value.\n * @throws {DataValidationError} If Series is empty or contains non-numeric data\n *\n * @example\n * ```ts\n * const s = new Series([5, 2, 8, 1, 9]);\n * s.min(); // 1\n * ```\n */\n min(): number {\n if (this._data.length === 0) {\n throw new DataValidationError(\"Cannot get min of empty Series\");\n }\n\n let minVal = Infinity;\n let hasNumeric = false;\n\n for (const val of this._data) {\n if (val === null || val === undefined) continue;\n if (typeof val !== \"number\") {\n throw new DataValidationError(\"Series.min() only works on numeric data\");\n }\n if (!Number.isNaN(val)) {\n if (val < minVal) {\n minVal = val;\n }\n hasNumeric = true;\n }\n }\n\n return hasNumeric ? minVal : NaN;\n }\n\n /**\n * Find the maximum value in the Series.\n *\n * Skips null, undefined, and NaN values.\n *\n * @returns Maximum value.\n * @throws {DataValidationError} If Series is empty or contains non-numeric data\n *\n * @example\n * ```ts\n * const s = new Series([5, 2, 8, 1, 9]);\n * s.max(); // 9\n * ```\n */\n max(): number {\n if (this._data.length === 0) {\n throw new DataValidationError(\"Cannot get max of empty Series\");\n }\n\n let maxVal = -Infinity;\n let hasNumeric = false;\n\n for (const val of this._data) {\n if (val === null || val === undefined) continue;\n if (typeof val !== \"number\") {\n throw new DataValidationError(\"Series.max() only works on numeric data\");\n }\n if (!Number.isNaN(val)) {\n if (val > maxVal) {\n maxVal = val;\n }\n hasNumeric = true;\n }\n }\n\n return hasNumeric ? maxVal : NaN;\n }\n\n /**\n * Convert the Series to a plain JavaScript array.\n *\n * Returns a shallow copy of the data.\n *\n * @returns Array copy of the data\n *\n * @example\n * ```ts\n * const s = new Series([1, 2, 3]);\n * const arr = s.toArray(); // [1, 2, 3]\n * ```\n */\n toArray(): T[] {\n // Return a copy to prevent external mutation\n return [...this._data];\n }\n\n /**\n * Convert the Series to an ndarray Tensor.\n *\n * Uses the `tensor()` factory function.\n *\n * @returns Tensor containing the Series data\n * @throws {DataValidationError} If data cannot be converted to Tensor\n *\n * @example\n * ```ts\n * import { Series } from 'deepbox/dataframe';\n *\n * const s = new Series([1, 2, 3, 4]);\n * const t = s.toTensor(); // Tensor([1, 2, 3, 4])\n * ```\n */\n toTensor(): Tensor {\n const numeric: number[] = [];\n for (const v of this._data) {\n if (typeof v === \"number\") {\n numeric.push(v);\n } else if (v === null || v === undefined) {\n numeric.push(NaN);\n } else {\n throw new DataValidationError(\n \"Series.toTensor() only works on numeric data (or null/undefined)\"\n );\n }\n }\n return tensor(numeric);\n }\n\n /**\n * Return a human-readable string representation of this Series.\n *\n * Each row is printed as `index value`, with an optional name/dtype\n * footer. Large Series are truncated with an ellipsis.\n *\n * @param maxRows - Maximum rows to display before summarizing (default: 20).\n * @returns Formatted string representation\n *\n * @example\n * ```ts\n * const s = new Series([10, 20, 30], { name: 'values' });\n * s.toString();\n * // \"0 10\\n1 20\\n2 30\\nName: values, Length: 3\"\n * ```\n */\n toString(maxRows = 20): string {\n const n = this._data.length;\n const half = Math.floor(maxRows / 2);\n const showAll = n <= maxRows;\n\n const rows: string[][] = [];\n\n const topCount = showAll ? n : half;\n const bottomCount = showAll ? 0 : half;\n\n for (let i = 0; i < topCount; i++) {\n const idx = this._index[i];\n const val = this._data[i];\n rows.push([String(idx ?? i), val === null || val === undefined ? \"null\" : String(val)]);\n }\n\n if (!showAll) {\n rows.push([\"...\", \"...\"]);\n for (let i = n - bottomCount; i < n; i++) {\n const idx = this._index[i];\n const val = this._data[i];\n rows.push([String(idx ?? i), val === null || val === undefined ? \"null\" : String(val)]);\n }\n }\n\n // Calculate column widths\n let idxWidth = 0;\n let valWidth = 0;\n for (const [idx, val] of rows) {\n if ((idx ?? \"\").length > idxWidth) idxWidth = (idx ?? \"\").length;\n if ((val ?? \"\").length > valWidth) valWidth = (val ?? \"\").length;\n }\n\n const lines: string[] = [];\n for (const [idx, val] of rows) {\n lines.push(`${(idx ?? \"\").padStart(idxWidth)} ${val ?? \"\"}`);\n }\n\n // Footer\n const parts: string[] = [];\n if (this._name !== undefined) parts.push(`Name: ${this._name}`);\n parts.push(`Length: ${n}`);\n lines.push(parts.join(\", \"));\n\n return lines.join(\"\\n\");\n }\n}\n","import { type Axis, normalizeAxis } from \"../core\";\nimport { DataValidationError, IndexError, InvalidParameterError } from \"../core/errors/index.js\";\nimport { reshape, type Tensor, tensor } from \"../ndarray/index.js\";\nimport { Series } from \"./Series.js\";\nimport type { AggregateFunction, DataFrameData, DataFrameOptions } from \"./types.js\";\nimport { createKey, isRecord, isValidNumber } from \"./utils.js\";\n\nconst isNumberValue = (value: unknown): value is number => typeof value === \"number\";\n\nconst isIndexLabel = (value: unknown): value is string | number =>\n typeof value === \"string\" || typeof value === \"number\";\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n\nconst isIndexLabelArray = (value: unknown): value is (string | number)[] =>\n Array.isArray(value) && value.every(isIndexLabel);\n\nconst ensureUniqueLabels = (labels: readonly string[], labelName: string): void => {\n const seen = new Set<string>();\n for (const label of labels) {\n if (seen.has(label)) {\n throw new DataValidationError(`Duplicate ${labelName} '${label}' is not supported`);\n }\n seen.add(label);\n }\n};\n\nconst toNumericValues = (values: readonly unknown[]): number[] => values.filter(isValidNumber);\n\n/**\n * Two-dimensional, size-mutable, potentially heterogeneous tabular data.\n *\n * A DataFrame is like a spreadsheet or SQL table. It consists of:\n * - Rows (observations) identified by an index\n * - Columns (variables) identified by column names\n * - Data stored in a columnar format for efficient access\n *\n * Similar to pandas DataFrame in Python.\n *\n * @example\n * ```ts\n * import { DataFrame } from 'deepbox/dataframe';\n *\n * const df = new DataFrame({\n * name: ['Alice', 'Bob', 'Charlie'],\n * age: [25, 30, 35],\n * score: [85.5, 92.0, 78.5]\n * });\n *\n * console.log(df.shape); // [3, 3]\n * console.log(df.columns); // ['name', 'age', 'score']\n * ```\n *\n * @see {@link https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html | Pandas DataFrame}\n */\nexport class DataFrame {\n // Internal storage: Map of column names to data arrays\n private _data: Map<string, unknown[]>;\n // Row labels (can be strings or numbers)\n private _index: (string | number)[];\n // Fast label -> position lookup for O(1) loc() access\n private _indexPos: Map<string | number, number>;\n // Column names\n private _columns: string[];\n\n /**\n * Creates a new DataFrame instance.\n *\n * @param data - Object mapping column names to arrays of values.\n * All arrays must have the same length.\n * @param options - Configuration options\n * @param options.columns - Custom column order (defaults to Object.keys(data))\n * @param options.index - Custom row labels (defaults to 0, 1, 2, ...)\n *\n * @example\n * ```ts\n * const df = new DataFrame({\n * col1: [1, 2, 3],\n * col2: ['a', 'b', 'c']\n * }, {\n * index: ['row1', 'row2', 'row3']\n * });\n * ```\n */\n constructor(data: DataFrameData, options: DataFrameOptions = {}) {\n // Determine column order (use provided order or infer from data object keys)\n this._columns = options.columns ? [...options.columns] : Object.keys(data);\n ensureUniqueLabels(this._columns, \"column name\");\n\n // If user provided columns, enforce that each requested column exists in data.\n for (const col of this._columns) {\n if (!(col in data)) {\n throw new DataValidationError(`Column '${col}' not found in DataFrame data`);\n }\n }\n\n // Determine number of rows from first column\n let firstColumnLength = 0;\n if (this._columns.length > 0) {\n const firstCol = this._columns[0];\n if (firstCol === undefined) {\n throw new DataValidationError(\"First column is undefined\");\n }\n const firstColData = data[firstCol];\n if (!Array.isArray(firstColData)) {\n throw new DataValidationError(`Column '${firstCol}' must be an array`);\n }\n firstColumnLength = firstColData.length;\n }\n\n // Create row index (use provided labels or generate 0, 1, 2, ...)\n this._index = options.index\n ? options.copy === false\n ? options.index\n : [...options.index]\n : Array.from({ length: firstColumnLength }, (_, i) => i);\n\n // Validate index length matches the inferred row count.\n // If we have columns, row count is defined by column length.\n // If we have no columns (index-only DataFrame), row count is defined by index length.\n if (this._columns.length > 0 && this._index.length !== firstColumnLength) {\n throw new DataValidationError(\n `Index length (${this._index.length}) must match row count (${firstColumnLength})`\n );\n }\n\n // Build index lookup map and enforce unique labels (required for unambiguous O(1) loc()).\n this._indexPos = new Map();\n for (let i = 0; i < this._index.length; i++) {\n const label = this._index[i];\n if (label === undefined) {\n throw new DataValidationError(`Index label at position ${i} is undefined`);\n }\n if (this._indexPos.has(label)) {\n throw new DataValidationError(`Duplicate index label '${String(label)}' is not supported`);\n }\n this._indexPos.set(label, i);\n }\n\n // Store data in a Map for efficient column access\n this._data = new Map();\n for (const col of this._columns) {\n // Enforce column exists (validated above) and is aligned with row count.\n const colData = data[col];\n if (!Array.isArray(colData)) {\n throw new DataValidationError(`Column '${col}' not found in DataFrame data`);\n }\n if (colData.length !== firstColumnLength) {\n throw new DataValidationError(\n `Column '${col}' length (${colData.length}) must match row count (${firstColumnLength})`\n );\n }\n // Store a copy to avoid external mutation, unless copy=false.\n this._data.set(col, options.copy === false ? colData : [...colData]);\n }\n }\n\n /**\n * Get the dimensions of the DataFrame.\n *\n * @returns Tuple of [rows, columns]\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2, 3], b: [4, 5, 6] });\n * df.shape; // [3, 2]\n * ```\n */\n get shape(): [number, number] {\n return [this._index.length, this._columns.length];\n }\n\n /**\n * Get the column names.\n *\n * @returns Array of column names (copy)\n */\n get columns(): string[] {\n return [...this._columns];\n }\n\n /**\n * Get the row index labels.\n *\n * @returns Array of index labels (copy)\n */\n get index(): (string | number)[] {\n return [...this._index];\n }\n\n /**\n * Get a column as a Series.\n *\n * @param column - Column name to retrieve\n * @returns Series containing the column data\n * @throws {InvalidParameterError} If column doesn't exist\n *\n * @example\n * ```ts\n * const df = new DataFrame({ age: [25, 30, 35], name: ['Alice', 'Bob', 'Carol'] });\n * const ageSeries = df.get('age'); // Series([25, 30, 35])\n * ```\n */\n get(column: string): Series<unknown>;\n get<T>(column: string, guard: (value: unknown) => value is T): Series<T>;\n get<T>(column: string, guard?: (value: unknown) => value is T): Series<unknown> | Series<T> {\n // Check if column exists\n const data = this._data.get(column);\n if (data === undefined) {\n throw new InvalidParameterError(\n `Column '${column}' not found in DataFrame`,\n \"column\",\n column\n );\n }\n\n if (guard) {\n const validated: T[] = [];\n for (const value of data) {\n if (!guard(value)) {\n throw new DataValidationError(\n `Column '${column}' contains values that do not match the requested type`\n );\n }\n validated.push(value);\n }\n return new Series(validated, {\n index: this._index,\n name: column,\n copy: false,\n });\n }\n\n return new Series(data, {\n index: this._index,\n name: column,\n copy: false,\n });\n }\n\n /**\n * Access a row by label (label-based indexing).\n *\n * @param row - The index label of the row\n * @returns Object mapping column names to values for that row\n * @throws {IndexError} If row label not found\n *\n * @example\n * ```ts\n * const df = new DataFrame(\n * { age: [25, 30], name: ['Alice', 'Bob'] },\n * { index: ['row1', 'row2'] }\n * );\n * df.loc('row1'); // { age: 25, name: 'Alice' }\n * ```\n */\n loc(row: string | number): Record<string, unknown> {\n // Find position of this label in the index (O(1) via lookup map)\n const position = this._indexPos.get(row) ?? -1;\n\n if (position === -1) {\n throw new IndexError(`Row label '${row}' not found in index`);\n }\n\n // Build object with all column values for this row\n const result: Record<string, unknown> = {};\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (colData) {\n result[col] = colData[position];\n }\n }\n\n return result;\n }\n\n /**\n * Access a row by integer position (position-based indexing).\n *\n * @param position - The integer position (0-based)\n * @returns Object mapping column names to values for that row\n * @throws {IndexError} If position is out of bounds\n *\n * @example\n * ```ts\n * const df = new DataFrame({ age: [25, 30], name: ['Alice', 'Bob'] });\n * df.iloc(0); // { age: 25, name: 'Alice' }\n * df.iloc(1); // { age: 30, name: 'Bob' }\n * ```\n */\n iloc(position: number): Record<string, unknown> {\n // Validate position is within bounds\n if (this._index.length === 0) {\n throw new IndexError(`DataFrame is empty`, {\n index: position,\n validRange: [0, 0],\n });\n }\n if (position < 0 || position >= this._index.length) {\n throw new IndexError(`Position ${position} is out of bounds (0-${this._index.length - 1})`, {\n index: position,\n validRange: [0, this._index.length - 1],\n });\n }\n\n // Build object with all column values at this position\n const result: Record<string, unknown> = {};\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (colData) {\n result[col] = colData[position];\n }\n }\n\n return result;\n }\n\n /**\n * Return the first n rows.\n *\n * @param n - Number of rows to return (default: 5)\n * @returns New DataFrame with first n rows\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2, 3, 4, 5], b: [6, 7, 8, 9, 10] });\n * df.head(3); // DataFrame with rows 0-2\n * ```\n */\n head(n: number = 5): DataFrame {\n if (!Number.isFinite(n) || !Number.isInteger(n) || n < 0) {\n throw new InvalidParameterError(\"n must be a non-negative integer\", \"n\", n);\n }\n // Slice each column's data to first n rows\n const newData: DataFrameData = {};\n for (const col of this._columns) {\n const colData = this._data.get(col);\n newData[col] = colData ? colData.slice(0, n) : [];\n }\n\n // Create new DataFrame with sliced data and index\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index.slice(0, n),\n });\n }\n\n /**\n * Return the last n rows.\n *\n * @param n - Number of rows to return (default: 5)\n * @returns New DataFrame with last n rows\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2, 3, 4, 5], b: [6, 7, 8, 9, 10] });\n * df.tail(3); // DataFrame with rows 2-4\n * ```\n */\n tail(n: number = 5): DataFrame {\n if (!Number.isFinite(n) || !Number.isInteger(n) || n < 0) {\n throw new InvalidParameterError(\"n must be a non-negative integer\", \"n\", n);\n }\n const sliceStart = this._index.length - n;\n const newData: DataFrameData = {};\n for (const col of this._columns) {\n const colData = this._data.get(col);\n newData[col] = colData ? colData.slice(sliceStart) : [];\n }\n\n // Create new DataFrame with sliced data and index\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index.slice(sliceStart),\n });\n }\n\n /**\n * Filter rows based on a boolean predicate function.\n *\n * @param predicate - Function that returns true for rows to keep\n * @returns New DataFrame with filtered rows\n *\n * @example\n * ```ts\n * const df = new DataFrame({ age: [25, 30, 35], name: ['Alice', 'Bob', 'Carol'] });\n * const filtered = df.filter(row => row.age > 28);\n * // DataFrame with Bob and Carol\n * ```\n */\n filter(predicate: (row: Record<string, unknown>) => boolean): DataFrame {\n const nCols = this._columns.length;\n const nRows = this._index.length;\n\n // Pre-fetch column arrays into a flat array for direct indexed access\n const colArrays: unknown[][] = new Array(nCols);\n for (let c = 0; c < nCols; c++) {\n colArrays[c] = this._data.get(this._columns[c] as string) ?? [];\n }\n\n // First pass: find matching row indices using a reusable row object\n const matchIndices: number[] = [];\n const row: Record<string, unknown> = {};\n for (let i = 0; i < nRows; i++) {\n for (let c = 0; c < nCols; c++) {\n row[this._columns[c] as string] = (colArrays[c] as unknown[])[i];\n }\n if (predicate(row)) {\n matchIndices.push(i);\n }\n }\n\n // Second pass: build output columns from matched indices\n const matchCount = matchIndices.length;\n const filteredData: DataFrameData = {};\n for (let c = 0; c < nCols; c++) {\n const src = colArrays[c] as unknown[];\n const dst = new Array(matchCount);\n for (let m = 0; m < matchCount; m++) {\n dst[m] = src[matchIndices[m] as number];\n }\n filteredData[this._columns[c] as string] = dst;\n }\n\n const filteredIndex = new Array<string | number>(matchCount);\n for (let m = 0; m < matchCount; m++) {\n filteredIndex[m] = this._index[matchIndices[m] as number] as string | number;\n }\n\n return new DataFrame(filteredData, {\n columns: this._columns,\n index: filteredIndex,\n copy: false,\n });\n }\n\n /**\n * Select a subset of columns.\n *\n * @param columns - Array of column names to select\n * @returns New DataFrame with only specified columns\n * @throws {InvalidParameterError} If any column doesn't exist\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2], b: [3, 4], c: [5, 6] });\n * df.select(['a', 'c']); // DataFrame with only columns a and c\n * ```\n */\n select(columns: string[]): DataFrame {\n // Validate all columns exist\n for (const col of columns) {\n if (!this._data.has(col)) {\n throw new InvalidParameterError(`Column '${col}' not found in DataFrame`, \"columns\", col);\n }\n }\n\n // Build new data with only selected columns (slice to avoid shared mutation)\n const newData: DataFrameData = {};\n for (const col of columns) {\n const colData = this._data.get(col);\n newData[col] = colData ? colData.slice() : [];\n }\n\n return new DataFrame(newData, {\n columns: columns,\n index: this._index,\n copy: false,\n });\n }\n\n /**\n * Drop (remove) specified columns.\n *\n * @param columns - Array of column names to drop\n * @returns New DataFrame without the dropped columns\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2], b: [3, 4], c: [5, 6] });\n * df.drop(['b']); // DataFrame with only columns a and c\n * ```\n */\n drop(columns: string[]): DataFrame {\n if (!isStringArray(columns)) {\n throw new InvalidParameterError(\"columns must be an array of strings\", \"columns\", columns);\n }\n ensureUniqueLabels(columns, \"column name\");\n for (const col of columns) {\n if (!this._data.has(col)) {\n throw new InvalidParameterError(`Column '${col}' not found in DataFrame`, \"columns\", col);\n }\n }\n\n // Get columns to keep (all columns except the ones to drop)\n const columnsToKeep = this._columns.filter((col) => !columns.includes(col));\n\n // Build new data with remaining columns\n const newData: DataFrameData = {};\n for (const col of columnsToKeep) {\n const colData = this._data.get(col);\n newData[col] = colData ? [...colData] : [];\n }\n\n return new DataFrame(newData, {\n columns: columnsToKeep,\n index: this._index,\n });\n }\n\n /**\n * Sort DataFrame by one or more columns.\n *\n * @param by - Column name or array of column names to sort by\n * @param ascending - Sort in ascending order (default: true)\n * @returns New sorted DataFrame\n *\n * @example\n * ```ts\n * const df = new DataFrame({ age: [30, 25, 35], name: ['Bob', 'Alice', 'Carol'] });\n * df.sort('age'); // Sorted by age ascending\n * df.sort(['age'], false); // Sorted by age descending\n * ```\n */\n sort(by: string | string[], ascending: boolean = true): DataFrame {\n const sortCols = Array.isArray(by) ? by : [by];\n\n // Validate sort columns exist\n for (const col of sortCols) {\n if (!this._data.has(col)) {\n throw new InvalidParameterError(`Column '${col}' not found in DataFrame`, \"by\", col);\n }\n }\n\n const nRows = this._index.length;\n\n // Pre-fetch sort column arrays for direct indexed access\n const sortColArrays: unknown[][] = new Array(sortCols.length);\n for (let c = 0; c < sortCols.length; c++) {\n sortColArrays[c] = this._data.get(sortCols[c] as string) ?? [];\n }\n\n // Sort row indices instead of full row objects\n const indices = new Array<number>(nRows);\n for (let i = 0; i < nRows; i++) indices[i] = i;\n\n indices.sort((ai, bi) => {\n for (let c = 0; c < sortColArrays.length; c++) {\n const colArr = sortColArrays[c] as unknown[];\n const aVal = colArr[ai];\n const bVal = colArr[bi];\n\n // Handle numeric comparison (NaN sorts to end)\n if (isNumberValue(aVal) && isNumberValue(bVal)) {\n const aIsNaN = Number.isNaN(aVal);\n const bIsNaN = Number.isNaN(bVal);\n if (aIsNaN && bIsNaN) continue;\n if (aIsNaN) return 1;\n if (bIsNaN) return -1;\n const diff = aVal - bVal;\n if (diff !== 0) return ascending ? diff : -diff;\n }\n // Handle string comparison\n else if (typeof aVal === \"string\" && typeof bVal === \"string\") {\n const cmp = aVal.localeCompare(bVal);\n if (cmp !== 0) return ascending ? cmp : -cmp;\n }\n // Fallback: convert to string\n else {\n const cmp = String(aVal).localeCompare(String(bVal));\n if (cmp !== 0) return ascending ? cmp : -cmp;\n }\n }\n return 0;\n });\n\n // Build sorted data by gathering from original columns using sorted indices\n const sortedData: DataFrameData = {};\n for (const col of this._columns) {\n const src = this._data.get(col) ?? [];\n const dst = new Array(nRows);\n for (let i = 0; i < nRows; i++) {\n dst[i] = src[indices[i] as number];\n }\n sortedData[col] = dst;\n }\n\n const sortedIndex = new Array<string | number>(nRows);\n for (let i = 0; i < nRows; i++) {\n sortedIndex[i] = this._index[indices[i] as number] as string | number;\n }\n\n return new DataFrame(sortedData, {\n columns: this._columns,\n index: sortedIndex,\n });\n }\n\n /**\n * Group DataFrame by one or more columns.\n *\n * Returns a DataFrameGroupBy object for performing aggregations.\n *\n * @param by - Column name or array of column names to group by\n * @returns DataFrameGroupBy object for aggregation operations\n *\n * @example\n * ```ts\n * const df = new DataFrame({\n * category: ['A', 'B', 'A', 'B'],\n * value: [10, 20, 30, 40]\n * });\n * const grouped = df.groupBy('category');\n * grouped.sum(); // Sum values by category\n * ```\n */\n groupBy(by: string | string[]): DataFrameGroupBy {\n return new DataFrameGroupBy(this, by);\n }\n\n /**\n * Join with another DataFrame using SQL-style join.\n *\n * Uses hash join algorithm for O(n + m) time complexity.\n * Optimized for large datasets with minimal memory overhead.\n *\n * @param other - DataFrame to join with\n * @param on - Column name to join on (must exist in both DataFrames)\n * @param how - Type of join operation\n * - 'inner': Only rows with matching keys in both DataFrames\n * - 'left': All rows from left, matched rows from right (nulls for non-matches)\n * - 'right': All rows from right, matched rows from left (nulls for non-matches)\n * - 'outer': All rows from both DataFrames (nulls for non-matches)\n * @returns New DataFrame with joined data\n *\n * @throws {InvalidParameterError} If join column doesn't exist in either DataFrame\n *\n * @example\n * ```ts\n * const customers = new DataFrame({\n * id: [1, 2, 3],\n * name: ['Alice', 'Bob', 'Charlie']\n * });\n * const orders = new DataFrame({\n * id: [1, 1, 2, 4],\n * product: ['Laptop', 'Mouse', 'Keyboard', 'Monitor']\n * });\n *\n * // Inner join - only customers with orders\n * const inner = customers.join(orders, 'id', 'inner');\n * // Result: Alice with 2 orders, Bob with 1 order\n *\n * // Left join - all customers, with/without orders\n * const left = customers.join(orders, 'id', 'left');\n * // Result: Alice, Bob, Charlie (Charlie has null for product)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Hash_join | Hash Join Algorithm}\n */\n join(\n other: DataFrame,\n on: string,\n how: \"inner\" | \"left\" | \"right\" | \"outer\" = \"inner\"\n ): DataFrame {\n if (![\"inner\", \"left\", \"right\", \"outer\"].includes(how)) {\n throw new InvalidParameterError(\n 'how must be one of \"inner\", \"left\", \"right\", or \"outer\"',\n \"how\",\n how\n );\n }\n // Validate join column exists in both DataFrames\n if (!this._columns.includes(on)) {\n throw new InvalidParameterError(`Join column '${on}' not found in left DataFrame`, \"on\", on);\n }\n if (!other._columns.includes(on)) {\n throw new InvalidParameterError(`Join column '${on}' not found in right DataFrame`, \"on\", on);\n }\n\n // Build hash table from right DataFrame for O(1) lookups\n // Hash map: key value -> array of row indices in right DataFrame\n const rightHash = new Map<string, number[]>();\n const rightData = other._data.get(on) ?? [];\n\n // Build phase: O(m) where m is rows in right DataFrame\n for (let i = 0; i < rightData.length; i++) {\n const val = rightData[i];\n if (val === null || val === undefined) continue;\n const key = createKey(val);\n const indices = rightHash.get(key) ?? [];\n indices.push(i);\n rightHash.set(key, indices);\n }\n\n // Track which right rows were matched (for outer join)\n const matchedRightRows = new Set<number>();\n\n // Detect overlapping non-key columns and build output column mappings\n const rightNonKeyColumns = other._columns.filter((col) => col !== on);\n const overlapping = new Set<string>();\n for (const col of rightNonKeyColumns) {\n if (this._columns.includes(col)) {\n overlapping.add(col);\n }\n }\n\n // Build left output column names (suffix overlapping ones with _left)\n const leftOutputNames: string[] = [];\n for (const col of this._columns) {\n if (col !== on && overlapping.has(col)) {\n leftOutputNames.push(`${col}_left`);\n } else {\n leftOutputNames.push(col);\n }\n }\n\n // Build right output column names (suffix overlapping ones with _right, skip join key)\n const rightOutputNames: string[] = [];\n for (const col of rightNonKeyColumns) {\n if (overlapping.has(col)) {\n rightOutputNames.push(`${col}_right`);\n } else {\n rightOutputNames.push(col);\n }\n }\n\n const allColumns = [...leftOutputNames, ...rightOutputNames];\n\n // Result data structure\n const resultData: DataFrameData = {};\n\n // Initialize result columns\n for (const col of allColumns) {\n resultData[col] = [];\n }\n\n const leftData = this._data.get(on) ?? [];\n\n // Probe phase: O(n) where n is rows in left DataFrame\n for (let i = 0; i < leftData.length; i++) {\n const leftKey = createKey(leftData[i]);\n const matches = rightHash.get(leftKey) ?? [];\n\n if (matches.length > 0) {\n // Found match(es) in right DataFrame\n for (const rightIdx of matches) {\n matchedRightRows.add(rightIdx);\n\n // Add data from left DataFrame\n for (let j = 0; j < this._columns.length; j++) {\n const originalCol = this._columns[j];\n const outputCol = leftOutputNames[j];\n if (originalCol && outputCol) {\n const colData = this._data.get(originalCol);\n resultData[outputCol]?.push(colData?.[i] ?? null);\n }\n }\n\n // Add data from right DataFrame (skip join column to avoid duplicate)\n for (let j = 0; j < rightNonKeyColumns.length; j++) {\n const originalCol = rightNonKeyColumns[j];\n const outputCol = rightOutputNames[j];\n if (originalCol && outputCol) {\n const colData = other._data.get(originalCol);\n resultData[outputCol]?.push(colData?.[rightIdx] ?? null);\n }\n }\n }\n } else if (how === \"left\" || how === \"outer\") {\n // No match - include left row with nulls for right columns\n for (let j = 0; j < this._columns.length; j++) {\n const originalCol = this._columns[j];\n const outputCol = leftOutputNames[j];\n if (originalCol && outputCol) {\n const colData = this._data.get(originalCol);\n resultData[outputCol]?.push(colData?.[i] ?? null);\n }\n }\n for (const col of rightOutputNames) {\n resultData[col]?.push(null);\n }\n }\n // For 'right' and 'inner' joins, skip unmatched left rows\n }\n\n // For right/outer join: add unmatched right rows\n if (how === \"right\" || how === \"outer\") {\n for (let i = 0; i < rightData.length; i++) {\n if (!matchedRightRows.has(i)) {\n // Add values for left columns: join column gets right value, others get null\n for (let j = 0; j < this._columns.length; j++) {\n const originalCol = this._columns[j];\n const outputCol = leftOutputNames[j];\n if (originalCol && outputCol) {\n if (originalCol === on) {\n // For join column, use value from right DataFrame\n const colData = other._data.get(on);\n resultData[outputCol]?.push(colData?.[i] ?? null);\n } else {\n resultData[outputCol]?.push(null);\n }\n }\n }\n // Add data from right DataFrame (skip join column as already added)\n for (let j = 0; j < rightNonKeyColumns.length; j++) {\n const originalCol = rightNonKeyColumns[j];\n const outputCol = rightOutputNames[j];\n if (originalCol && outputCol) {\n const colData = other._data.get(originalCol);\n resultData[outputCol]?.push(colData?.[i] ?? null);\n }\n }\n }\n }\n }\n\n return new DataFrame(resultData, { columns: allColumns });\n }\n\n /**\n * Merge with another DataFrame using pandas-style merge.\n *\n * More flexible than join() - supports different column names for join keys.\n * Uses hash join algorithm for O(n + m) complexity.\n *\n * @param other - DataFrame to merge with\n * @param options - Merge configuration\n * - on: Column name to join on (must exist in both DataFrames)\n * - left_on: Column name in left DataFrame\n * - right_on: Column name in right DataFrame\n * - how: Join type ('inner', 'left', 'right', 'outer')\n * - suffixes: Suffix for duplicate column names ['_x', '_y']\n * @returns New DataFrame with merged data\n *\n * @throws {InvalidParameterError} If merge columns don't exist or conflicting options provided\n *\n * @example\n * ```ts\n * const employees = new DataFrame({\n * emp_id: [1, 2, 3],\n * name: ['Alice', 'Bob', 'Charlie']\n * });\n * const salaries = new DataFrame({\n * employee_id: [1, 2, 4],\n * salary: [50000, 60000, 55000]\n * });\n *\n * // Merge on different column names\n * const result = employees.merge(salaries, {\n * left_on: 'emp_id',\n * right_on: 'employee_id',\n * how: 'left'\n * });\n * ```\n *\n * @see {@link https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html | Pandas merge}\n */\n merge(\n other: DataFrame,\n options: {\n readonly on?: string;\n readonly left_on?: string;\n readonly right_on?: string;\n readonly how?: \"inner\" | \"left\" | \"right\" | \"outer\";\n readonly suffixes?: readonly [string, string];\n } = {}\n ): DataFrame {\n const how = options.how ?? \"inner\";\n if (![\"inner\", \"left\", \"right\", \"outer\"].includes(how)) {\n throw new InvalidParameterError(\n 'how must be one of \"inner\", \"left\", \"right\", or \"outer\"',\n \"how\",\n how\n );\n }\n\n if (options.suffixes !== undefined) {\n if (\n !Array.isArray(options.suffixes) ||\n options.suffixes.length !== 2 ||\n typeof options.suffixes[0] !== \"string\" ||\n typeof options.suffixes[1] !== \"string\"\n ) {\n throw new InvalidParameterError(\n \"suffixes must be a tuple of two strings\",\n \"suffixes\",\n options.suffixes\n );\n }\n }\n const suffixes = options.suffixes ?? [\"_x\", \"_y\"];\n\n // Determine join columns\n let leftOn: string;\n let rightOn: string;\n\n if (options.on) {\n if (typeof options.on !== \"string\") {\n throw new InvalidParameterError(\"on must be a string\", \"on\", options.on);\n }\n // Same column name in both DataFrames\n if (options.left_on || options.right_on) {\n throw new InvalidParameterError('Cannot specify both \"on\" and \"left_on\"/\"right_on\"');\n }\n leftOn = options.on;\n rightOn = options.on;\n } else if (options.left_on && options.right_on) {\n if (typeof options.left_on !== \"string\") {\n throw new InvalidParameterError(\"left_on must be a string\", \"left_on\", options.left_on);\n }\n if (typeof options.right_on !== \"string\") {\n throw new InvalidParameterError(\"right_on must be a string\", \"right_on\", options.right_on);\n }\n // Different column names\n leftOn = options.left_on;\n rightOn = options.right_on;\n } else {\n throw new InvalidParameterError('Must specify either \"on\" or both \"left_on\" and \"right_on\"');\n }\n\n // Validate columns exist\n if (!this._columns.includes(leftOn)) {\n throw new InvalidParameterError(\n `Column '${leftOn}' not found in left DataFrame`,\n \"left_on\",\n leftOn\n );\n }\n if (!other._columns.includes(rightOn)) {\n throw new InvalidParameterError(\n `Column '${rightOn}' not found in right DataFrame`,\n \"right_on\",\n rightOn\n );\n }\n\n // Build hash table from right DataFrame\n const rightHash = new Map<string, number[]>();\n const rightData = other._data.get(rightOn) ?? [];\n\n for (let i = 0; i < rightData.length; i++) {\n const val = rightData[i];\n if (val === null || val === undefined) continue;\n const key = createKey(val);\n const indices = rightHash.get(key) ?? [];\n indices.push(i);\n rightHash.set(key, indices);\n }\n\n const matchedRightRows = new Set<number>();\n const resultData: DataFrameData = {};\n\n // Handle column name conflicts with suffixes\n const leftColumns = this._columns.map((col) => {\n if (col === leftOn) return col; // Keep join column as-is\n if (other._columns.includes(col) && col !== rightOn) {\n return col + suffixes[0]; // Add suffix for conflicts\n }\n return col;\n });\n\n const leftColumnSet = new Set(leftColumns);\n const rightColumns: string[] = [];\n\n // Create a Set of original left columns for checking collisions\n const originalLeftColumns = new Set(this._columns);\n\n for (const col of other._columns) {\n if (leftOn === rightOn && col === rightOn) {\n continue;\n }\n\n let resultCol = col;\n\n // Check if this column existed in the left DataFrame (collision)\n // If so, we must apply the right suffix, unless it's the join key\n if (originalLeftColumns.has(col) && col !== leftOn) {\n resultCol = `${col}${suffixes[1]}`;\n }\n\n // Ensure uniqueness against already generated left columns (and previous right columns)\n if (leftColumnSet.has(resultCol)) {\n let suffixIndex = 0;\n let candidate = `${resultCol}`;\n // If we didn't suffix it yet (no collision with original), but it collides with a generated name\n // (rare, but possible e.g. left has 'A_x' and we generate 'A_x' from collision)\n // Or if the suffixed name itself collides.\n\n // Simpler approach: If it collides with result set, append increments\n while (leftColumnSet.has(candidate)) {\n suffixIndex++;\n // If we already added suffix, append number. If not, append suffix then number?\n // Pandas strategy: _x, _y. If _x exists, it stays _x.\n // Here we just need to ensure uniqueness.\n candidate = `${resultCol}_${suffixIndex}`;\n }\n resultCol = candidate;\n }\n\n rightColumns.push(resultCol);\n leftColumnSet.add(resultCol);\n }\n\n const allColumns = [...leftColumns, ...rightColumns];\n\n // Initialize result columns\n for (const col of allColumns) {\n resultData[col] = [];\n }\n\n const leftData = this._data.get(leftOn) ?? [];\n\n // Probe phase\n for (let i = 0; i < leftData.length; i++) {\n const key = createKey(leftData[i]);\n const rightIndices = rightHash.get(key) ?? [];\n\n if (rightIndices.length > 0) {\n for (const rightIdx of rightIndices) {\n matchedRightRows.add(rightIdx);\n\n // Add left DataFrame data with potential suffix\n for (let j = 0; j < this._columns.length; j++) {\n const originalCol = this._columns[j];\n if (!originalCol) continue;\n const resultCol = leftColumns[j];\n const colData = this._data.get(originalCol);\n if (resultCol) resultData[resultCol]?.push(colData?.[i] ?? null);\n }\n\n // Add right DataFrame data (excluding join column, with potential suffix)\n let rightColIdx = 0;\n for (const originalCol of other._columns) {\n // Only skip rightOn if it's implicitly excluded from rightColumns (same as leftOn)\n const shouldSkip = leftOn === rightOn && originalCol === rightOn;\n if (shouldSkip || !originalCol) continue;\n\n const resultCol = rightColumns[rightColIdx];\n const colData = other._data.get(originalCol);\n if (resultCol) resultData[resultCol]?.push(colData?.[rightIdx] ?? null);\n rightColIdx++;\n }\n }\n } else if (how === \"left\" || how === \"outer\") {\n // No match - left row with nulls\n for (let j = 0; j < this._columns.length; j++) {\n const originalCol = this._columns[j];\n if (!originalCol) continue;\n const resultCol = leftColumns[j];\n const colData = this._data.get(originalCol);\n if (resultCol) resultData[resultCol]?.push(colData?.[i] ?? null);\n }\n for (const col of rightColumns) {\n resultData[col]?.push(null);\n }\n }\n }\n\n // Add unmatched right rows for right/outer joins\n if (how === \"right\" || how === \"outer\") {\n for (let i = 0; i < rightData.length; i++) {\n if (!matchedRightRows.has(i)) {\n // Add values for left columns (handling join column)\n for (let j = 0; j < this._columns.length; j++) {\n const originalCol = this._columns[j];\n const resultCol = leftColumns[j];\n\n if (originalCol && resultCol) {\n if (originalCol === leftOn && leftOn === rightOn) {\n // For join column, use value from right DataFrame ONLY if they are the same column conceptually\n const rightJoinData = other._data.get(rightOn);\n resultData[resultCol]?.push(rightJoinData?.[i] ?? null);\n } else {\n resultData[resultCol]?.push(null);\n }\n }\n }\n\n // Data from right DataFrame\n let rightColIdx = 0;\n for (const originalCol of other._columns) {\n // We only skip rightOn if it was excluded from rightColumns.\n // rightColumns excludes rightOn ONLY if leftOn === rightOn.\n const shouldSkip = leftOn === rightOn && originalCol === rightOn;\n\n if (shouldSkip) {\n continue;\n }\n\n const resultCol = rightColumns[rightColIdx];\n const colData = other._data.get(originalCol);\n if (resultCol) resultData[resultCol]?.push(colData?.[i] ?? null);\n rightColIdx++;\n }\n }\n }\n }\n\n return new DataFrame(resultData, { columns: allColumns });\n }\n\n /**\n * Concatenate with another DataFrame.\n *\n * @param other - DataFrame to concatenate\n * @param axis - Axis to concatenate along.\n * - 0 or \"rows\" or \"index\": Stack vertically (append rows)\n * - 1 or \"columns\": Stack horizontally (append columns)\n * @returns Concatenated DataFrame\n *\n * @example\n * ```ts\n * const df1 = new DataFrame({ a: [1, 2], b: [3, 4] });\n * const df2 = new DataFrame({ a: [5, 6], b: [7, 8] });\n * df1.concat(df2, \"rows\"); // Stack vertically: 4 rows\n * df1.concat(df2, \"columns\"); // Stack horizontally: 4 columns\n * ```\n */\n concat(other: DataFrame, axis: Axis = 0): DataFrame {\n const ax = normalizeAxis(axis, 2);\n\n if (ax === 0) {\n // Concatenate rows (stack vertically)\n // Columns must match\n for (const col of this._columns) {\n if (!other._columns.includes(col)) {\n throw new DataValidationError(\n `Cannot concat on axis=0: missing column '${col}' in other DataFrame`\n );\n }\n }\n for (const col of other._columns) {\n if (!this._columns.includes(col)) {\n throw new DataValidationError(\n `Cannot concat on axis=0: extra column '${col}' in other DataFrame`\n );\n }\n }\n const newData: DataFrameData = {};\n\n // Copy data from both DataFrames for each column\n for (const col of this._columns) {\n const thisColData = this._data.get(col) ?? [];\n const otherColData = other._data.get(col) ?? [];\n newData[col] = [...thisColData, ...otherColData];\n }\n\n // Reset index to sequential integers to avoid duplicate index errors\n const totalRows = this._index.length + other._index.length;\n const newIndex = Array.from({ length: totalRows }, (_, i) => i);\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: newIndex,\n });\n } else {\n // Concatenate columns (stack horizontally) with index alignment\n // 1. Determine new index (Union of indices)\n const newIndex = [...this._index];\n const seenIndices = new Set(this._index);\n\n for (const idx of other._index) {\n if (!seenIndices.has(idx)) {\n newIndex.push(idx);\n seenIndices.add(idx);\n }\n }\n\n // 2. Build new data\n const newData: DataFrameData = {};\n const newColumns: string[] = [];\n\n // Helper to align data\n const alignColumn = (\n df: DataFrame,\n col: string,\n targetIndex: (string | number)[]\n ): unknown[] => {\n const sourceData = df._data.get(col);\n if (!sourceData) return [];\n\n // Use _indexPos for O(1) lookup\n const indexPos = df._indexPos;\n\n return targetIndex.map((label) => {\n const pos = indexPos.get(label);\n if (pos !== undefined) {\n return sourceData[pos];\n }\n return null;\n });\n };\n\n // Detect overlapping column names\n const rightColSet = new Set(other._columns);\n const overlapping = new Set<string>();\n for (const col of this._columns) {\n if (rightColSet.has(col)) {\n overlapping.add(col);\n }\n }\n\n // Copy all columns from this DataFrame, suffixing overlapping ones\n for (const col of this._columns) {\n const outputName = overlapping.has(col) ? `${col}_left` : col;\n newData[outputName] = alignColumn(this, col, newIndex);\n newColumns.push(outputName);\n }\n\n // Add columns from other DataFrame, suffixing overlapping ones\n for (const col of other._columns) {\n const outputName = overlapping.has(col) ? `${col}_right` : col;\n newData[outputName] = alignColumn(other, col, newIndex);\n newColumns.push(outputName);\n }\n\n return new DataFrame(newData, {\n columns: newColumns,\n index: newIndex,\n });\n }\n }\n\n /**\n * Fill missing values (null or undefined) with a specified value.\n *\n * @param value - Value to use for filling missing values\n * @returns New DataFrame with missing values filled\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, null, 3], b: [4, 5, undefined] });\n * df.fillna(0); // Replace null/undefined with 0\n * ```\n */\n fillna(value: unknown): DataFrame {\n const newData: DataFrameData = {};\n\n // Replace null/undefined in each column\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (colData) {\n newData[col] = colData.map((v) =>\n v === null || v === undefined || (typeof v === \"number\" && Number.isNaN(v)) ? value : v\n );\n }\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index,\n });\n }\n\n /**\n * Drop rows that contain any missing values (null or undefined).\n *\n * @returns New DataFrame with rows containing missing values removed\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, null, 3], b: [4, 5, 6] });\n * df.dropna(); // Only keeps rows 0 and 2\n * ```\n */\n dropna(): DataFrame {\n const newData: DataFrameData = {};\n const newIndex: (string | number)[] = [];\n\n // Initialize empty arrays for each column\n for (const col of this._columns) {\n newData[col] = [];\n }\n\n // Check each row for missing values\n for (let i = 0; i < this._index.length; i++) {\n let hasNA = false;\n\n // Check if any column has null/undefined/NaN at this row\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (colData) {\n const val = colData[i];\n if (val === null || val === undefined || (typeof val === \"number\" && Number.isNaN(val))) {\n hasNA = true;\n break;\n }\n }\n }\n\n // If row has no missing values, keep it\n if (!hasNA) {\n const idx = this._index[i];\n if (idx !== undefined) newIndex.push(idx);\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (colData) {\n newData[col]?.push(colData[i]);\n }\n }\n }\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: newIndex,\n });\n }\n\n /**\n * Generate descriptive statistics.\n *\n * Computes count, mean, std, min, 25%, 50%, 75%, max for numeric columns.\n *\n * @returns DataFrame with statistics\n */\n describe(): DataFrame {\n const stats: DataFrameData = {};\n const metrics = [\"count\", \"mean\", \"std\", \"min\", \"25%\", \"50%\", \"75%\", \"max\"];\n\n // Handle empty DataFrame - return DataFrame with metrics as index and no data columns\n if (this._columns.length === 0 || this._index.length === 0) {\n return new DataFrame({}, { columns: [], index: metrics });\n }\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (!colData) continue;\n\n const numericData = colData.filter(isValidNumber);\n if (numericData.length === 0) continue;\n\n const sorted = [...numericData].sort((a, b) => a - b);\n const sum = numericData.reduce((acc, val) => acc + val, 0);\n const mean = sum / numericData.length;\n let variance: number;\n let std: number;\n\n if (numericData.length > 1) {\n variance =\n numericData.reduce((acc, val) => acc + (val - mean) ** 2, 0) / (numericData.length - 1);\n std = Math.sqrt(variance);\n } else {\n variance = NaN;\n std = NaN;\n }\n\n const getPercentile = (p: number) => {\n const idx = (p / 100) * (sorted.length - 1);\n const lower = Math.floor(idx);\n const upper = Math.ceil(idx);\n const weight = idx - lower;\n return (sorted[lower] ?? 0) * (1 - weight) + (sorted[upper] ?? 0) * weight;\n };\n\n const minVal = sorted[0];\n const maxVal = sorted[sorted.length - 1];\n if (minVal === undefined || maxVal === undefined) {\n throw new DataValidationError(`Unable to compute min/max for column '${col}'`);\n }\n\n stats[col] = [\n numericData.length,\n mean,\n std,\n minVal,\n getPercentile(25),\n getPercentile(50),\n getPercentile(75),\n maxVal,\n ];\n }\n\n // If no numeric columns were found, return DataFrame with metrics as index and no data columns\n if (Object.keys(stats).length === 0) {\n return new DataFrame({}, { columns: [], index: metrics });\n }\n\n return new DataFrame(stats, { index: metrics });\n }\n\n /**\n * Compute correlation matrix.\n *\n * Uses pairwise complete observations (ignores missing values for each pair).\n *\n * @returns DataFrame containing pairwise correlations\n */\n corr(): DataFrame {\n const numericCols: string[] = [];\n\n // Identify numeric columns\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (!colData) continue;\n // Check if column has at least one number\n if (colData.some(isValidNumber)) {\n numericCols.push(col);\n }\n }\n\n const corrMatrix: DataFrameData = {};\n\n for (const col1 of numericCols) {\n corrMatrix[col1] = [];\n const data1 = this._data.get(col1);\n\n for (const col2 of numericCols) {\n const data2 = this._data.get(col2);\n\n if (!data1 || !data2) {\n corrMatrix[col1]?.push(NaN);\n continue;\n }\n\n // Collect pairwise valid observations\n const valid1: number[] = [];\n const valid2: number[] = [];\n\n for (let i = 0; i < this._index.length; i++) {\n const v1 = data1[i];\n const v2 = data2[i];\n\n if (isValidNumber(v1) && isValidNumber(v2)) {\n valid1.push(v1);\n valid2.push(v2);\n }\n }\n\n if (valid1.length < 2) {\n corrMatrix[col1]?.push(NaN);\n continue;\n }\n\n // Compute correlation\n const mean1 = valid1.reduce((a, b) => a + b, 0) / valid1.length;\n const mean2 = valid2.reduce((a, b) => a + b, 0) / valid2.length;\n\n let num = 0;\n let den1 = 0;\n let den2 = 0;\n\n for (let k = 0; k < valid1.length; k++) {\n const val1 = valid1[k];\n const val2 = valid2[k];\n // val1 and val2 are guaranteed to be numbers from valid1/valid2 construction\n // However, we check for undefined to satisfy strict null checks (noUncheckedIndexedAccess)\n if (val1 === undefined || val2 === undefined) continue;\n\n const diff1 = val1 - mean1;\n const diff2 = val2 - mean2;\n num += diff1 * diff2;\n den1 += diff1 * diff1;\n den2 += diff2 * diff2;\n }\n\n const corr = den1 === 0 || den2 === 0 ? NaN : num / Math.sqrt(den1 * den2);\n corrMatrix[col1]?.push(corr);\n }\n }\n\n return new DataFrame(corrMatrix, {\n index: numericCols,\n columns: numericCols,\n });\n }\n\n /**\n * Compute covariance matrix.\n *\n * Uses pairwise complete observations.\n *\n * @returns DataFrame containing pairwise covariances\n */\n cov(): DataFrame {\n const numericCols: string[] = [];\n\n // Identify numeric columns\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (!colData) continue;\n if (colData.some(isValidNumber)) {\n numericCols.push(col);\n }\n }\n\n const covMatrix: DataFrameData = {};\n\n for (const col1 of numericCols) {\n covMatrix[col1] = [];\n const data1 = this._data.get(col1);\n\n for (const col2 of numericCols) {\n const data2 = this._data.get(col2);\n\n if (!data1 || !data2) {\n covMatrix[col1]?.push(NaN);\n continue;\n }\n\n // Collect pairwise valid observations\n const valid1: number[] = [];\n const valid2: number[] = [];\n\n for (let i = 0; i < this._index.length; i++) {\n const v1 = data1[i];\n const v2 = data2[i];\n\n if (isValidNumber(v1) && isValidNumber(v2)) {\n valid1.push(v1);\n valid2.push(v2);\n }\n }\n\n if (valid1.length < 2) {\n covMatrix[col1]?.push(NaN);\n continue;\n }\n\n // Compute covariance\n const mean1 = valid1.reduce((a, b) => a + b, 0) / valid1.length;\n const mean2 = valid2.reduce((a, b) => a + b, 0) / valid2.length;\n\n let cov = 0;\n for (let k = 0; k < valid1.length; k++) {\n const val1 = valid1[k];\n const val2 = valid2[k];\n // val1 and val2 are guaranteed to be numbers from valid1/valid2 construction\n // However, we check for undefined to satisfy strict null checks (noUncheckedIndexedAccess)\n if (val1 === undefined || val2 === undefined) continue;\n\n cov += (val1 - mean1) * (val2 - mean2);\n }\n cov /= valid1.length - 1;\n\n covMatrix[col1]?.push(cov);\n }\n }\n\n return new DataFrame(covMatrix, {\n index: numericCols,\n columns: numericCols,\n });\n }\n\n /**\n * Apply a function along an axis of the DataFrame.\n *\n * When `axis=1`, the provided Series is indexed by column names.\n *\n * @param fn - Function to apply to each Series\n * @param axis - Axis to apply along (0=columns, 1=rows)\n * @returns New DataFrame with function applied\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2, 3], b: [4, 5, 6] });\n * // Apply function to each column\n * df.apply(series => series.map(x => Number(x) * 2), 0);\n * ```\n */\n apply<U = unknown>(fn: (series: Series<unknown>) => Series<U>, axis: Axis = 0): DataFrame {\n const ax = normalizeAxis(axis, 2);\n if (ax === 0) {\n // Apply function to each column\n const newData: DataFrameData = {};\n\n for (const col of this._columns) {\n const series = this.get(col);\n const result = fn(series);\n if (!(result instanceof Series)) {\n throw new DataValidationError(\"Function must return a Series when axis=0\");\n }\n newData[col] = [...result.data];\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index,\n });\n } else {\n // Apply function to each row.\n const results: Series<U>[] = [];\n const columnLabelMap = new Map<string, string | number>();\n const newColumns: string[] = [];\n\n // First pass: Apply function and collect results + columns\n for (let i = 0; i < this._index.length; i++) {\n const rowValues: unknown[] = [];\n for (const col of this._columns) {\n rowValues.push(this._data.get(col)?.[i]);\n }\n\n const rowSeries = new Series(rowValues, {\n name: \"row\",\n index: this._columns,\n copy: false,\n });\n const result = fn(rowSeries);\n\n if (!(result instanceof Series)) {\n throw new DataValidationError(\"Function must return a Series when axis=1\");\n }\n\n results.push(result);\n\n for (const label of result.index) {\n const columnName = String(label);\n const existing = columnLabelMap.get(columnName);\n if (existing !== undefined && existing !== label) {\n throw new DataValidationError(\n `Column label '${columnName}' is ambiguous between '${String(\n existing\n )}' and '${String(label)}'`\n );\n }\n if (!columnLabelMap.has(columnName)) {\n newColumns.push(columnName);\n columnLabelMap.set(columnName, label);\n }\n }\n }\n\n const newData: DataFrameData = {};\n\n for (const col of newColumns) {\n newData[col] = [];\n }\n\n // Second pass: Populate new data\n for (const result of results) {\n for (const col of newColumns) {\n const label = columnLabelMap.get(col);\n if (label === undefined) {\n throw new DataValidationError(`Missing label mapping for column '${col}'`);\n }\n // Use get() to handle missing values (returns undefined/null)\n // We convert undefined to null for consistency\n const val = result.get(label);\n newData[col]?.push(val === undefined ? null : val);\n }\n }\n\n return new DataFrame(newData, {\n columns: newColumns,\n index: this._index,\n });\n }\n }\n\n /**\n * Convert DataFrame to a 2D Tensor.\n *\n * All columns must contain numeric data.\n *\n * @returns 2D Tensor with shape [rows, columns]\n * @throws {DataValidationError} If data is non-numeric\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2, 3], b: [4, 5, 6] });\n * const t = df.toTensor(); // 2D tensor [[1,4], [2,5], [3,6]]\n * ```\n */\n toTensor(): Tensor {\n // Convert to 2D array first\n const arr = this.toArray();\n\n // Flatten to 1D array in row-major order\n const flat: number[] = [];\n for (const row of arr) {\n for (const val of row) {\n if (typeof val === \"number\") {\n flat.push(val);\n } else if (val === null || val === undefined) {\n flat.push(NaN);\n } else {\n throw new DataValidationError(\n `Non-numeric value found: ${val}. All data must be numeric (or null/undefined) for tensor conversion.`\n );\n }\n }\n }\n\n // Create 1D tensor and reshape to [rows, cols]\n const t = tensor(flat);\n const [rows, cols] = this.shape;\n return reshape(t, [rows, cols]);\n }\n\n /**\n * Convert DataFrame to a 2D JavaScript array.\n *\n * Each inner array represents a row.\n *\n * @returns 2D array of values\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2], b: [3, 4] });\n * df.toArray(); // [[1, 3], [2, 4]]\n * ```\n */\n toArray(): unknown[][] {\n const result: unknown[][] = [];\n\n // Build each row\n for (let i = 0; i < this._index.length; i++) {\n const row: unknown[] = [];\n for (const col of this._columns) {\n const colData = this._data.get(col);\n row.push(colData ? colData[i] : undefined);\n }\n result.push(row);\n }\n\n return result;\n }\n\n /**\n * Parse CSV string into DataFrame with full type inference and quote handling.\n * Time complexity: O(n) where n is number of characters.\n */\n static fromCsvString(\n csvString: string,\n options: {\n readonly delimiter?: string;\n readonly quoteChar?: string;\n readonly hasHeader?: boolean;\n readonly skipRows?: number;\n } = {}\n ): DataFrame {\n const delimiter = options.delimiter ?? \",\";\n const quoteChar = options.quoteChar ?? '\"';\n const hasHeader = options.hasHeader ?? true;\n const skipRows = options.skipRows ?? 0;\n\n const rows: string[][] = [];\n let fields: string[] = [];\n let currentField = \"\";\n let inQuotes = false;\n let rowCount = 0;\n\n // Parse character by character to handle newlines in quoted fields\n for (let i = 0; i < csvString.length; i++) {\n const char = csvString[i];\n const nextChar = csvString[i + 1];\n\n if (char === quoteChar) {\n if (inQuotes && nextChar === quoteChar) {\n // Escaped quote\n currentField += quoteChar;\n i++;\n } else {\n // Toggle quote state\n inQuotes = !inQuotes;\n }\n } else if (char === delimiter && !inQuotes) {\n // Field separator\n fields.push(currentField);\n currentField = \"\";\n } else if ((char === \"\\n\" || char === \"\\r\") && !inQuotes) {\n // End of row (but not if inside quotes)\n if (char === \"\\r\" && nextChar === \"\\n\") {\n i++; // Skip \\n in \\r\\n\n }\n fields.push(currentField);\n currentField = \"\";\n\n // Skip empty rows and rows before skipRows\n if (fields.some((f) => f.trim() !== \"\")) {\n if (rowCount >= skipRows) {\n rows.push(fields);\n }\n rowCount++;\n }\n fields = [];\n } else {\n // Regular character (including newlines inside quotes)\n currentField += char;\n }\n }\n\n // Handle last row if no trailing newline\n if (currentField !== \"\" || fields.length > 0) {\n fields.push(currentField);\n if (fields.some((f) => f.trim() !== \"\") && rowCount >= skipRows) {\n rows.push(fields);\n }\n }\n\n if (inQuotes) {\n throw new DataValidationError(\"CSV contains an unmatched quote\");\n }\n\n if (rows.length === 0) {\n throw new DataValidationError(\"CSV contains no data rows\");\n }\n\n let columns: string[];\n let dataRows: string[][];\n\n if (hasHeader) {\n const firstRow = rows[0];\n if (!firstRow) throw new DataValidationError(\"CSV has no header row\");\n columns = firstRow;\n ensureUniqueLabels(columns, \"column name\");\n dataRows = rows.slice(1);\n } else {\n const numCols = rows[0]?.length ?? 0;\n columns = Array.from({ length: numCols }, (_, i) => `col${i}`);\n dataRows = rows;\n }\n\n for (let i = 0; i < dataRows.length; i++) {\n const row = dataRows[i];\n if (row && row.length !== columns.length) {\n throw new DataValidationError(\n `Row ${i + (hasHeader ? 2 : 1)} has ${row.length} fields, expected ${columns.length}`\n );\n }\n }\n\n const data: DataFrameData = {};\n for (let colIdx = 0; colIdx < columns.length; colIdx++) {\n const colName = columns[colIdx];\n const colData: unknown[] = [];\n\n for (const row of dataRows) {\n const value = row[colIdx];\n if (value === undefined || value === \"\" || value === \"null\" || value === \"undefined\") {\n colData.push(null);\n } else if (\n !Number.isNaN(Number(value)) &&\n value !== \"\" &&\n // Allow \"0\", \"0.5\", \"10\", but not \"01\" (unless it's \"0.1\")\n (value === \"0\" || !value.startsWith(\"0\") || value.startsWith(\"0.\"))\n ) {\n colData.push(Number(value));\n } else if (value === \"true\" || value === \"false\") {\n colData.push(value === \"true\");\n } else {\n colData.push(value);\n }\n }\n\n if (colName) data[colName] = colData;\n }\n\n return new DataFrame(data, { columns });\n }\n\n /**\n * Read CSV file - environment-aware (Node.js fs or browser fetch).\n * Time complexity: O(n) for file read + O(m) for parsing.\n */\n static async readCsv(\n path: string,\n options: {\n readonly delimiter?: string;\n readonly quoteChar?: string;\n readonly hasHeader?: boolean;\n readonly skipRows?: number;\n } = {}\n ): Promise<DataFrame> {\n let csvString: string;\n\n if (typeof process !== \"undefined\" && process.versions?.node) {\n try {\n const fs = await import(\"node:fs/promises\");\n csvString = await fs.readFile(path, \"utf-8\");\n } catch (error) {\n throw new DataValidationError(\n `Failed to read CSV file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n } else if (typeof fetch !== \"undefined\") {\n try {\n const response = await fetch(path);\n if (!response.ok) {\n throw new DataValidationError(`HTTP ${response.status}: ${response.statusText}`);\n }\n csvString = await response.text();\n } catch (error) {\n throw new DataValidationError(\n `Failed to fetch CSV: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n } else {\n throw new DataValidationError(\"Environment not supported\");\n }\n\n return DataFrame.fromCsvString(csvString, options);\n }\n\n /**\n * Convert DataFrame to CSV string with proper quoting and escaping.\n * Time complexity: O(n × m) where n is rows, m is columns.\n */\n toCsvString(\n options: {\n readonly delimiter?: string;\n readonly quoteChar?: string;\n readonly includeIndex?: boolean;\n readonly header?: boolean;\n } = {}\n ): string {\n const delimiter = options.delimiter ?? \",\";\n const quoteChar = options.quoteChar ?? '\"';\n const includeIndex = options.includeIndex ?? false;\n const header = options.header ?? true;\n\n const lines: string[] = [];\n\n const escapeField = (value: unknown): string => {\n const str = String(value ?? \"\");\n if (\n str.includes(delimiter) ||\n str.includes(quoteChar) ||\n str.includes(\"\\n\") ||\n str.includes(\"\\r\")\n ) {\n return quoteChar + str.split(quoteChar).join(quoteChar + quoteChar) + quoteChar;\n }\n return str;\n };\n\n if (header) {\n const headerFields = includeIndex ? [\"index\", ...this._columns] : [...this._columns];\n lines.push(headerFields.map(escapeField).join(delimiter));\n }\n\n for (let i = 0; i < this._index.length; i++) {\n const rowFields: unknown[] = [];\n\n if (includeIndex) {\n rowFields.push(this._index[i]);\n }\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n rowFields.push(colData?.[i] ?? \"\");\n }\n\n lines.push(rowFields.map(escapeField).join(delimiter));\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Write DataFrame to CSV file - environment-aware.\n * Time complexity: O(n × m) for generation + O(k) for write.\n */\n async toCsv(\n path: string,\n options: {\n readonly delimiter?: string;\n readonly quoteChar?: string;\n readonly includeIndex?: boolean;\n readonly header?: boolean;\n } = {}\n ): Promise<void> {\n const csvString = this.toCsvString(options);\n\n if (typeof process !== \"undefined\" && process.versions?.node) {\n try {\n const fs = await import(\"node:fs/promises\");\n await fs.writeFile(path, csvString, \"utf-8\");\n } catch (error) {\n throw new DataValidationError(\n `Failed to write CSV file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n } else if (typeof document !== \"undefined\" && typeof URL !== \"undefined\") {\n const blob = new Blob([csvString], { type: \"text/csv;charset=utf-8;\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = path;\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n } else {\n throw new DataValidationError(\"Environment not supported\");\n }\n }\n\n /**\n * Serialize DataFrame to JSON string.\n * Time complexity: O(n × m).\n */\n toJsonString(): string {\n return JSON.stringify(\n {\n columns: this._columns,\n index: this._index,\n data: Object.fromEntries(this._data),\n },\n null,\n 2\n );\n }\n\n /**\n * Create DataFrame from JSON string.\n * Time complexity: O(n × m).\n */\n static fromJsonString(jsonStr: string): DataFrame {\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonStr);\n } catch (error) {\n throw new DataValidationError(\n `Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (!isRecord(parsed)) {\n throw new DataValidationError(\"Invalid JSON: expected object (not array)\");\n }\n\n const obj = parsed;\n\n if (!isStringArray(obj[\"columns\"])) {\n throw new DataValidationError(\n 'Invalid JSON: missing or invalid \"columns\" field (expected array)'\n );\n }\n\n if (!isIndexLabelArray(obj[\"index\"])) {\n throw new DataValidationError(\n 'Invalid JSON: missing or invalid \"index\" field (expected array)'\n );\n }\n\n if (!isRecord(obj[\"data\"])) {\n throw new DataValidationError(\n 'Invalid JSON: missing or invalid \"data\" field (expected object)'\n );\n }\n\n const columns = obj[\"columns\"];\n const index = obj[\"index\"];\n const rawData = obj[\"data\"];\n\n ensureUniqueLabels(columns, \"column name\");\n\n const dataKeys = Object.keys(rawData);\n for (const col of columns) {\n if (!(col in rawData)) {\n throw new DataValidationError(`Missing data for column '${col}'`);\n }\n }\n for (const key of dataKeys) {\n if (!columns.includes(key)) {\n throw new DataValidationError(`Unexpected data column '${key}' not listed in columns`);\n }\n }\n\n const data: DataFrameData = {};\n for (const [key, value] of Object.entries(rawData)) {\n if (!Array.isArray(value)) {\n throw new DataValidationError(`Invalid data for column '${key}': expected array`);\n }\n data[key] = value;\n }\n\n return new DataFrame(data, {\n columns,\n index,\n });\n }\n\n /**\n * Read JSON file - environment-aware.\n * Time complexity: O(n) for file read + O(m) for parsing.\n */\n static async readJson(path: string): Promise<DataFrame> {\n let jsonString: string;\n\n if (typeof process !== \"undefined\" && process.versions?.node) {\n try {\n const fs = await import(\"node:fs/promises\");\n jsonString = await fs.readFile(path, \"utf-8\");\n } catch (error) {\n throw new DataValidationError(\n `Failed to read JSON file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n } else if (typeof fetch !== \"undefined\") {\n try {\n const response = await fetch(path);\n if (!response.ok) {\n throw new DataValidationError(`HTTP ${response.status}: ${response.statusText}`);\n }\n jsonString = await response.text();\n } catch (error) {\n throw new DataValidationError(\n `Failed to fetch JSON: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n } else {\n throw new DataValidationError(\"Environment not supported\");\n }\n\n return DataFrame.fromJsonString(jsonString);\n }\n\n /**\n * Write DataFrame to JSON file - environment-aware.\n * Time complexity: O(n × m) for generation + O(k) for write.\n */\n async toJson(path: string): Promise<void> {\n const jsonString = this.toJsonString();\n\n if (typeof process !== \"undefined\" && process.versions?.node) {\n try {\n const fs = await import(\"node:fs/promises\");\n await fs.writeFile(path, jsonString, \"utf-8\");\n } catch (error) {\n throw new DataValidationError(\n `Failed to write JSON file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n } else if (typeof document !== \"undefined\" && typeof URL !== \"undefined\") {\n const blob = new Blob([jsonString], {\n type: \"application/json;charset=utf-8;\",\n });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = path;\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n } else {\n throw new DataValidationError(\"Environment not supported\");\n }\n }\n\n /**\n * Create DataFrame from a Tensor.\n *\n * @param tensor - Tensor to convert (must be 1D or 2D)\n * @param columns - Column names (optional). If provided, length must match tensor columns.\n * @returns DataFrame\n *\n * @example\n * ```ts\n * import { tensor } from 'deepbox/ndarray';\n *\n * const t = tensor([[1, 2], [3, 4], [5, 6]]);\n * const df = DataFrame.fromTensor(t, ['col1', 'col2']);\n * ```\n */\n static fromTensor(tensor: Tensor, columns?: string[]): DataFrame {\n const storage = tensor.data;\n let data: unknown[];\n\n if (storage instanceof BigInt64Array) {\n data = Array.from(storage, (v) => Number(v));\n } else if (ArrayBuffer.isView(storage)) {\n data = Array.from(storage, (v) => Number(v));\n } else if (Array.isArray(storage)) {\n data = [...storage];\n } else {\n throw new DataValidationError(\"Unsupported tensor storage type\");\n }\n\n if (tensor.ndim === 1) {\n if (columns && columns.length !== 1) {\n throw new DataValidationError(\n `Expected exactly 1 column name for 1D tensor, received ${columns.length}`\n );\n }\n const colName = columns?.[0] ?? \"col0\";\n return new DataFrame({ [colName]: data });\n }\n\n if (tensor.ndim === 2) {\n const rows = tensor.shape[0];\n const cols = tensor.shape[1];\n\n if (rows === undefined || cols === undefined) {\n throw new DataValidationError(\"Invalid tensor shape\");\n }\n\n if (columns && columns.length !== cols) {\n throw new DataValidationError(\n `Column count (${columns.length}) must match tensor columns (${cols})`\n );\n }\n\n const dfData: DataFrameData = {};\n\n for (let c = 0; c < cols; c++) {\n const colName = columns?.[c] ?? `col${c}`;\n const colData: unknown[] = [];\n\n for (let r = 0; r < rows; r++) {\n colData.push(data[r * cols + c]);\n }\n\n dfData[colName] = colData;\n }\n\n return new DataFrame(dfData, {\n columns: columns ?? Array.from({ length: cols }, (_, i) => `col${i}`),\n });\n }\n\n throw new DataValidationError(\n `Cannot create DataFrame from ${tensor.ndim}D tensor. Only 1D and 2D tensors supported.`\n );\n }\n\n /**\n * Remove duplicate rows from DataFrame.\n * Time complexity: O(n × m) where n is rows, m is columns.\n *\n * @param subset - Columns to consider for identifying duplicates (default: all columns)\n * @param keep - Which duplicates to keep: 'first', 'last', or false (remove all)\n * @returns New DataFrame with duplicates removed\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 1, 2], b: [3, 3, 4] });\n * df.drop_duplicates(); // Keeps first occurrence: [[1, 3], [2, 4]]\n * df.drop_duplicates(undefined, 'last'); // Keeps last occurrence\n * ```\n */\n drop_duplicates(subset?: string[], keep: \"first\" | \"last\" | false = \"first\"): DataFrame {\n // Determine which columns to check for duplicates\n const checkCols = subset ?? this._columns;\n\n // Validate subset columns exist\n for (const col of checkCols) {\n if (!this._columns.includes(col)) {\n throw new DataValidationError(`Column '${col}' not found in DataFrame`);\n }\n }\n\n // Track seen row signatures\n const seen = new Map<string, number[]>();\n const keepIndices: number[] = [];\n\n for (let i = 0; i < this._index.length; i++) {\n const signature: unknown[] = [];\n for (const col of checkCols) {\n signature.push(this._data.get(col)?.[i]);\n }\n const key = createKey(signature);\n\n const existing = seen.get(key);\n if (existing === undefined) {\n seen.set(key, [i]);\n } else {\n existing.push(i);\n }\n }\n\n for (const [_key, indices] of seen.entries()) {\n if (keep === \"first\") {\n const firstIndex = indices[0];\n if (firstIndex !== undefined) {\n keepIndices.push(firstIndex);\n }\n } else if (keep === \"last\") {\n const lastIndex = indices[indices.length - 1];\n if (lastIndex !== undefined) {\n keepIndices.push(lastIndex);\n }\n } else if (keep === false && indices.length === 1) {\n const onlyIndex = indices[0];\n if (onlyIndex !== undefined) {\n keepIndices.push(onlyIndex);\n }\n }\n }\n\n keepIndices.sort((a, b) => a - b);\n\n // Build result DataFrame from kept indices\n const newData: DataFrameData = {};\n const newIndex: (string | number)[] = [];\n\n for (const col of this._columns) {\n newData[col] = [];\n }\n\n for (const idx of keepIndices) {\n const label = this._index[idx];\n if (label === undefined) {\n throw new DataValidationError(`Index label at position ${idx} is undefined`);\n }\n newIndex.push(label);\n for (const col of this._columns) {\n newData[col]?.push(this._data.get(col)?.[idx]);\n }\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: newIndex,\n });\n }\n\n /**\n * Return boolean Series indicating duplicate rows.\n * Time complexity: O(n × m).\n *\n * @param subset - Columns to consider for identifying duplicates\n * @param keep - Which duplicates to mark as False: 'first', 'last', or false (mark all)\n * @returns Series of booleans (true = duplicate, false = unique)\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 1, 2], b: [3, 3, 4] });\n * df.duplicated(); // Series([false, true, false])\n * ```\n */\n duplicated(subset?: string[], keep: \"first\" | \"last\" | false = \"first\"): Series<boolean> {\n const checkCols = subset ?? this._columns;\n\n for (const col of checkCols) {\n if (!this._columns.includes(col)) {\n throw new DataValidationError(`Column '${col}' not found in DataFrame`);\n }\n }\n\n const seen = new Map<string, number[]>();\n\n for (let i = 0; i < this._index.length; i++) {\n const signature: unknown[] = [];\n for (const col of checkCols) {\n signature.push(this._data.get(col)?.[i]);\n }\n const key = createKey(signature);\n\n const existing = seen.get(key);\n if (existing === undefined) {\n seen.set(key, [i]);\n } else {\n existing.push(i);\n }\n }\n\n const isDuplicate: boolean[] = new Array(this._index.length).fill(false);\n\n for (const [_key, indices] of seen.entries()) {\n if (indices.length > 1) {\n if (keep === \"first\") {\n for (let i = 1; i < indices.length; i++) {\n const idx = indices[i];\n if (idx !== undefined) isDuplicate[idx] = true;\n }\n } else if (keep === \"last\") {\n for (let i = 0; i < indices.length - 1; i++) {\n const idx = indices[i];\n if (idx !== undefined) isDuplicate[idx] = true;\n }\n } else if (keep === false) {\n for (const idx of indices) {\n isDuplicate[idx] = true;\n }\n }\n }\n }\n\n return new Series(isDuplicate, { index: this._index });\n }\n\n /**\n * Rename columns or index labels.\n * Time complexity: O(m) for columns, O(n) for index.\n *\n * @param mapper - Object mapping old names to new names, or function to transform names\n * @param axis - 0 for index, 1 for columns\n * @returns New DataFrame with renamed labels\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2], b: [3, 4] });\n * df.rename({ a: 'x', b: 'y' }, 1); // Rename columns a->x, b->y\n * df.rename((name) => name.toUpperCase(), 1); // Uppercase all column names\n * ```\n */\n rename(mapper: Record<string, string> | ((name: string) => string), axis: 0 | 1 = 1): DataFrame {\n if (axis === 1) {\n // Rename columns\n const newColumns = this._columns.map((col) => {\n if (typeof mapper === \"function\") {\n return mapper(col);\n }\n return mapper[col] ?? col;\n });\n\n const newData: DataFrameData = {};\n for (let i = 0; i < this._columns.length; i++) {\n const oldCol = this._columns[i];\n const newCol = newColumns[i];\n if (oldCol && newCol) {\n const colData = this._data.get(oldCol);\n if (colData) {\n newData[newCol] = [...colData];\n }\n }\n }\n\n return new DataFrame(newData, {\n columns: newColumns,\n index: this._index,\n });\n } else {\n // Rename index\n const newIndex = this._index.map((label) => {\n const labelStr = String(label);\n if (typeof mapper === \"function\") {\n return mapper(labelStr);\n }\n return mapper[labelStr] ?? label;\n });\n\n const newData: DataFrameData = {};\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (colData) {\n newData[col] = [...colData];\n }\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: newIndex,\n });\n }\n }\n\n /**\n * Reset index to default integer index.\n * Time complexity: O(n).\n *\n * @param drop - If true, don't add old index as column.\n * If a column named \"index\" already exists, the new column will be\n * named \"index_1\", \"index_2\", etc.\n * @returns New DataFrame with reset index\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2] }, { index: ['x', 'y'] });\n * df.reset_index(); // Index becomes [0, 1], adds 'index' column with ['x', 'y']\n * df.reset_index(true); // Index becomes [0, 1], no new column\n * ```\n */\n reset_index(drop: boolean = false): DataFrame {\n const newData: DataFrameData = {};\n\n let indexName = \"index\";\n if (!drop) {\n if (this._columns.includes(indexName)) {\n let suffix = 1;\n while (this._columns.includes(`${indexName}_${suffix}`)) {\n suffix++;\n }\n indexName = `${indexName}_${suffix}`;\n }\n newData[indexName] = [...this._index];\n }\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (colData) {\n newData[col] = [...colData];\n }\n }\n\n const newColumns = drop ? this._columns : [indexName, ...this._columns];\n\n return new DataFrame(newData, {\n columns: newColumns,\n index: Array.from({ length: this._index.length }, (_, i) => i),\n });\n }\n\n /**\n * Set a column as the index.\n * Time complexity: O(n).\n *\n * @param column - Column name to use as index\n * @param drop - If true, remove the column after setting it as index\n * @returns New DataFrame with new index\n *\n * @example\n * ```ts\n * const df = new DataFrame({ id: ['a', 'b', 'c'], value: [1, 2, 3] });\n * df.set_index('id'); // Index becomes ['a', 'b', 'c']\n * ```\n */\n set_index(column: string, drop: boolean = true): DataFrame {\n if (!this._columns.includes(column)) {\n throw new InvalidParameterError(\n `Column '${column}' not found in DataFrame`,\n \"column\",\n column\n );\n }\n\n const newIndexData = this._data.get(column);\n if (!newIndexData) {\n throw new DataValidationError(`Column '${column}' has no data`);\n }\n\n const newIndex = newIndexData.map((v) =>\n typeof v === \"string\" || typeof v === \"number\" ? v : String(v)\n );\n\n const newData: DataFrameData = {};\n const newColumns: string[] = [];\n\n for (const col of this._columns) {\n if (col === column && drop) continue;\n const colData = this._data.get(col);\n if (colData) {\n newData[col] = [...colData];\n newColumns.push(col);\n }\n }\n\n return new DataFrame(newData, {\n columns: newColumns,\n index: newIndex,\n });\n }\n\n /**\n * Return boolean DataFrame showing null values.\n * Time complexity: O(n × m).\n *\n * @returns DataFrame of booleans (true = null/undefined, false = not null)\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, null, 3], b: [4, 5, undefined] });\n * df.isnull(); // [[false, false], [true, false], [false, true]]\n * ```\n */\n isnull(): DataFrame {\n const newData: DataFrameData = {};\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (colData) {\n newData[col] = colData.map((v) => v === null || v === undefined);\n }\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index,\n });\n }\n\n /**\n * Return boolean DataFrame showing non-null values.\n * Time complexity: O(n × m).\n *\n * @returns DataFrame of booleans (true = not null, false = null/undefined)\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, null, 3], b: [4, 5, undefined] });\n * df.notnull(); // [[true, true], [false, true], [true, false]]\n * ```\n */\n notnull(): DataFrame {\n const newData: DataFrameData = {};\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (colData) {\n newData[col] = colData.map((v) => v !== null && v !== undefined);\n }\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index,\n });\n }\n\n /**\n * Replace values in DataFrame.\n * Time complexity: O(n × m).\n *\n * @param toReplace - Value or array of values to replace\n * @param value - Replacement value\n * @returns New DataFrame with replaced values\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2, 3], b: [4, 5, 6] });\n * df.replace(2, 99); // Replace all 2s with 99\n * df.replace([1, 2], 0); // Replace 1s and 2s with 0\n * ```\n */\n replace(toReplace: unknown | unknown[], value: unknown): DataFrame {\n const replaceSet = new Set(Array.isArray(toReplace) ? toReplace : [toReplace]);\n\n const newData: DataFrameData = {};\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (colData) {\n newData[col] = colData.map((v) => (replaceSet.has(v) ? value : v));\n }\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index,\n });\n }\n\n /**\n * Clip (limit) values in a range.\n * Time complexity: O(n × m).\n *\n * @param lower - Minimum value (values below are set to this)\n * @param upper - Maximum value (values above are set to this)\n * @returns New DataFrame with clipped values\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 5, 10], b: [2, 8, 15] });\n * df.clip(3, 9); // [[3, 3], [5, 8], [9, 9]]\n * ```\n */\n clip(lower?: number, upper?: number): DataFrame {\n const newData: DataFrameData = {};\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (colData) {\n newData[col] = colData.map((v) => {\n if (typeof v !== \"number\") return v;\n let result = v;\n if (lower !== undefined && result < lower) result = lower;\n if (upper !== undefined && result > upper) result = upper;\n return result;\n });\n }\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index,\n });\n }\n\n /**\n * Return a random sample of rows.\n * Time complexity: O(n) for sampling.\n *\n * @param n - Number of rows to sample\n * @param random_state - Random seed for reproducibility\n * @returns New DataFrame with sampled rows\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2, 3, 4, 5], b: [6, 7, 8, 9, 10] });\n * df.sample(3); // Random 3 rows\n * ```\n */\n sample(n: number, random_state?: number): DataFrame {\n if (!Number.isFinite(n) || !Number.isInteger(n)) {\n throw new InvalidParameterError(\"n must be a finite integer\", \"n\", n);\n }\n if (random_state !== undefined) {\n if (!Number.isFinite(random_state) || !Number.isInteger(random_state)) {\n throw new InvalidParameterError(\n \"random_state must be a finite integer\",\n \"random_state\",\n random_state\n );\n }\n }\n if (n < 0 || n > this._index.length) {\n throw new DataValidationError(`Sample size ${n} must be between 0 and ${this._index.length}`);\n }\n\n const rng = random_state !== undefined ? this.seededRandom(random_state) : Math.random;\n\n const indices = Array.from({ length: this._index.length }, (_, i) => i);\n\n for (let i = indices.length - 1; i > 0; i--) {\n const j = Math.floor(rng() * (i + 1));\n const current = indices[i];\n const swap = indices[j];\n if (current === undefined || swap === undefined) {\n throw new DataValidationError(\"Sample index resolution failed\");\n }\n indices[i] = swap;\n indices[j] = current;\n }\n\n const sampledIndices = indices.slice(0, n);\n\n const newData: DataFrameData = {};\n const newIndex: (string | number)[] = [];\n\n for (const col of this._columns) {\n newData[col] = [];\n }\n\n for (const idx of sampledIndices) {\n const label = this._index[idx];\n if (label === undefined) {\n throw new DataValidationError(`Index label at position ${idx} is undefined`);\n }\n newIndex.push(label);\n for (const col of this._columns) {\n newData[col]?.push(this._data.get(col)?.[idx]);\n }\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: newIndex,\n });\n }\n\n /**\n * Seeded random number generator for reproducibility.\n * @private\n */\n private seededRandom(seed: number): () => number {\n let state = seed >>> 0;\n return () => {\n state = (state * 1664525 + 1013904223) % 2 ** 32;\n return state / 2 ** 32;\n };\n }\n\n /**\n * Return values at the given quantile.\n * Time complexity: O(n log n) per column due to sorting.\n *\n * @param q - Quantile to compute (0 to 1)\n * @returns Series with quantile values for each numeric column\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2, 3, 4, 5], b: [10, 20, 30, 40, 50] });\n * df.quantile(0.5); // Median: Series({ a: 3, b: 30 })\n * df.quantile(0.25); // 25th percentile\n * ```\n */\n quantile(q: number): Series<number> {\n if (!Number.isFinite(q) || q < 0 || q > 1) {\n throw new InvalidParameterError(\"q must be a finite number between 0 and 1\", \"q\", q);\n }\n\n const result: number[] = [];\n const resultIndex: string[] = [];\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (!colData) continue;\n\n const numericData = toNumericValues(colData);\n if (numericData.length === 0) {\n result.push(NaN);\n resultIndex.push(col);\n continue;\n }\n\n const sorted = [...numericData].sort((a, b) => a - b);\n const idx = q * (sorted.length - 1);\n const lower = Math.floor(idx);\n const upper = Math.ceil(idx);\n const weight = idx - lower;\n\n const value = (sorted[lower] ?? 0) * (1 - weight) + (sorted[upper] ?? 0) * weight;\n\n result.push(value);\n resultIndex.push(col);\n }\n\n return new Series(result, { index: resultIndex });\n }\n\n /**\n * Compute numerical rank of values (1 through n) along axis.\n * Time complexity: O(n log n) per column.\n *\n * @param method - How to rank ties: 'average', 'min', 'max', 'first', 'dense'\n * @param ascending - Rank in ascending order\n * @returns New DataFrame with ranks\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [3, 1, 2, 1] });\n * df.rank(); // [[4], [1.5], [3], [1.5]] (average method)\n * df.rank('min'); // [[4], [1], [3], [1]]\n * ```\n */\n rank(\n method: \"average\" | \"min\" | \"max\" | \"first\" | \"dense\" = \"average\",\n ascending: boolean = true\n ): DataFrame {\n const newData: DataFrameData = {};\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (!colData) continue;\n\n const numericData = toNumericValues(colData);\n if (numericData.length === 0) {\n newData[col] = colData.map(() => null);\n continue;\n }\n\n const indexed = colData.map((v, i) => ({ value: v, index: i }));\n const numericIndexed = indexed.filter((item): item is { value: number; index: number } =>\n isValidNumber(item.value)\n );\n\n numericIndexed.sort((a, b) => {\n if (ascending) {\n return a.value - b.value;\n }\n return b.value - a.value;\n });\n\n const ranks: (number | null)[] = new Array(colData.length).fill(null);\n\n let i = 0;\n let denseRank = 0; // Track dense rank separately\n while (i < numericIndexed.length) {\n const currentItem = numericIndexed[i];\n if (!currentItem) {\n break;\n }\n const currentValue = currentItem.value;\n const tieStart = i;\n\n while (i < numericIndexed.length) {\n const nextItem = numericIndexed[i];\n if (!nextItem || nextItem.value !== currentValue) {\n break;\n }\n i++;\n }\n\n const tieEnd = i;\n denseRank++; // Increment dense rank for each unique value\n\n for (let j = tieStart; j < tieEnd; j++) {\n const item = numericIndexed[j];\n if (!item) continue;\n\n let rank: number;\n if (method === \"average\") {\n rank = (tieStart + tieEnd + 1) / 2;\n } else if (method === \"min\") {\n rank = tieStart + 1;\n } else if (method === \"max\") {\n rank = tieEnd;\n } else if (method === \"first\") {\n rank = j + 1;\n } else {\n // dense method: use denseRank which increments only for unique values\n rank = denseRank;\n }\n\n ranks[item.index] = rank;\n }\n }\n\n newData[col] = ranks;\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index,\n });\n }\n\n /**\n * Calculate the difference between consecutive rows.\n * Time complexity: O(n × m).\n *\n * @param periods - Number of periods to shift (default: 1)\n * @returns New DataFrame with differences\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 3, 6, 10] });\n * df.diff(); // [[null], [2], [3], [4]]\n * df.diff(2); // [[null], [null], [5], [7]]\n * ```\n */\n diff(periods: number = 1): DataFrame {\n if (!Number.isFinite(periods) || !Number.isInteger(periods) || periods < 0) {\n throw new InvalidParameterError(\"periods must be a non-negative integer\", \"periods\", periods);\n }\n const newData: DataFrameData = {};\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (!colData) continue;\n\n const diffData: unknown[] = [];\n\n for (let i = 0; i < colData.length; i++) {\n if (i < periods) {\n diffData.push(null);\n } else {\n const current = colData[i];\n const previous = colData[i - periods];\n\n if (typeof current === \"number\" && typeof previous === \"number\") {\n diffData.push(current - previous);\n } else {\n diffData.push(null);\n }\n }\n }\n\n newData[col] = diffData;\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index,\n });\n }\n\n /**\n * Calculate percentage change between consecutive rows.\n * Time complexity: O(n × m).\n *\n * @param periods - Number of periods to shift (default: 1)\n * @returns New DataFrame with percentage changes\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [100, 110, 121] });\n * df.pct_change(); // [[null], [0.1], [0.1]] (10% increase each time)\n * ```\n */\n pct_change(periods: number = 1): DataFrame {\n if (!Number.isFinite(periods) || !Number.isInteger(periods) || periods < 0) {\n throw new InvalidParameterError(\"periods must be a non-negative integer\", \"periods\", periods);\n }\n const newData: DataFrameData = {};\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (!colData) continue;\n\n const pctData: unknown[] = [];\n\n for (let i = 0; i < colData.length; i++) {\n if (i < periods) {\n pctData.push(null);\n } else {\n const current = colData[i];\n const previous = colData[i - periods];\n\n if (typeof current === \"number\" && typeof previous === \"number\" && previous !== 0) {\n pctData.push((current - previous) / previous);\n } else {\n pctData.push(null);\n }\n }\n }\n\n newData[col] = pctData;\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index,\n });\n }\n\n /**\n * Return cumulative sum over DataFrame axis.\n * Time complexity: O(n × m).\n *\n * @returns New DataFrame with cumulative sums\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2, 3], b: [4, 5, 6] });\n * df.cumsum(); // [[1, 4], [3, 9], [6, 15]]\n * ```\n */\n cumsum(): DataFrame {\n const newData: DataFrameData = {};\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (!colData) continue;\n\n const cumData: unknown[] = [];\n let cumSum = 0;\n\n for (const value of colData) {\n if (typeof value === \"number\") {\n cumSum += value;\n cumData.push(cumSum);\n } else {\n cumData.push(null);\n }\n }\n\n newData[col] = cumData;\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index,\n });\n }\n\n /**\n * Return cumulative product over DataFrame axis.\n * Time complexity: O(n × m).\n *\n * @returns New DataFrame with cumulative products\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [2, 3, 4] });\n * df.cumprod(); // [[2], [6], [24]]\n * ```\n */\n cumprod(): DataFrame {\n const newData: DataFrameData = {};\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (!colData) continue;\n\n const cumData: unknown[] = [];\n let cumProd = 1;\n\n for (const value of colData) {\n if (typeof value === \"number\") {\n cumProd *= value;\n cumData.push(cumProd);\n } else {\n cumData.push(null);\n }\n }\n\n newData[col] = cumData;\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index,\n });\n }\n\n /**\n * Return cumulative maximum over DataFrame axis.\n * Time complexity: O(n × m).\n *\n * @returns New DataFrame with cumulative maximums\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [3, 1, 5, 2] });\n * df.cummax(); // [[3], [3], [5], [5]]\n * ```\n */\n cummax(): DataFrame {\n const newData: DataFrameData = {};\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (!colData) continue;\n\n const cumData: unknown[] = [];\n let cumMax = -Infinity;\n\n for (const value of colData) {\n if (typeof value === \"number\") {\n cumMax = Math.max(cumMax, value);\n cumData.push(cumMax);\n } else {\n cumData.push(null);\n }\n }\n\n newData[col] = cumData;\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index,\n });\n }\n\n /**\n * Return cumulative minimum over DataFrame axis.\n * Time complexity: O(n × m).\n *\n * @returns New DataFrame with cumulative minimums\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [3, 1, 5, 2] });\n * df.cummin(); // [[3], [1], [1], [1]]\n * ```\n */\n cummin(): DataFrame {\n const newData: DataFrameData = {};\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (!colData) continue;\n\n const cumData: unknown[] = [];\n let cumMin = Infinity;\n\n for (const value of colData) {\n if (typeof value === \"number\") {\n cumMin = Math.min(cumMin, value);\n cumData.push(cumMin);\n } else {\n cumData.push(null);\n }\n }\n\n newData[col] = cumData;\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index,\n });\n }\n\n /**\n * Shift index by desired number of periods.\n * Time complexity: O(n × m).\n *\n * @param periods - Number of periods to shift (positive = down, negative = up)\n * @param fill_value - Value to use for newly introduced missing values\n * @returns New DataFrame with shifted data\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2, 3, 4] });\n * df.shift(1); // [[null], [1], [2], [3]]\n * df.shift(-1); // [[2], [3], [4], [null]]\n * df.shift(1, 0); // [[0], [1], [2], [3]]\n * ```\n */\n shift(periods: number = 1, fill_value: unknown = null): DataFrame {\n if (!Number.isFinite(periods) || !Number.isInteger(periods)) {\n throw new InvalidParameterError(\"periods must be a finite integer\", \"periods\", periods);\n }\n\n const newData: DataFrameData = {};\n\n for (const col of this._columns) {\n const colData = this._data.get(col);\n if (!colData) continue;\n\n const shiftedData: unknown[] = [];\n const rowCount = colData.length;\n\n if (periods > 0) {\n const shift = Math.min(periods, rowCount);\n for (let i = 0; i < shift; i++) {\n shiftedData.push(fill_value);\n }\n for (let i = 0; i < rowCount - shift; i++) {\n shiftedData.push(colData[i]);\n }\n } else if (periods < 0) {\n const absPeriods = Math.min(Math.abs(periods), rowCount);\n for (let i = absPeriods; i < rowCount; i++) {\n shiftedData.push(colData[i]);\n }\n for (let i = 0; i < absPeriods; i++) {\n shiftedData.push(fill_value);\n }\n } else {\n shiftedData.push(...colData);\n }\n\n newData[col] = shiftedData;\n }\n\n return new DataFrame(newData, {\n columns: this._columns,\n index: this._index,\n });\n }\n\n /**\n * Pivot DataFrame.\n * Time complexity: O(n × m).\n *\n * @param index - Column to use as index\n * @param columns - Column to use as column headers\n * @param values - Column to use as values\n * @returns New DataFrame with pivoted data\n *\n * @example\n * ```ts\n * const df = new DataFrame({\n * country: ['USA', 'USA', 'Canada', 'Canada'],\n * year: [2010, 2011, 2010, 2011],\n * value: [100, 200, 300, 400]\n * });\n * df.pivot('country', 'year', 'value');\n * // country | 2010 | 2011\n * // USA | 100 | 200\n * // Canada | 300 | 400\n * ```\n */\n pivot(index: string, columns: string, values: string): DataFrame {\n if (!this._columns.includes(index)) {\n throw new DataValidationError(`Column '${index}' not found in DataFrame`);\n }\n\n if (!this._columns.includes(columns)) {\n throw new DataValidationError(`Column '${columns}' not found in DataFrame`);\n }\n\n if (!this._columns.includes(values)) {\n throw new DataValidationError(`Column '${values}' not found in DataFrame`);\n }\n\n const indexData = this._data.get(index);\n const columnData = this._data.get(columns);\n const valueData = this._data.get(values);\n\n if (!indexData || !columnData || !valueData) {\n throw new DataValidationError(\"Pivot columns have no data\");\n }\n\n const pivotData: DataFrameData = {};\n const pivotIndex: (string | number)[] = [];\n const uniqueIndices = new Set<string | number>();\n const uniqueColumns: string[] = [];\n const seenColumns = new Set<string>();\n\n for (const idx of indexData) {\n if (idx === null || idx === undefined) {\n continue;\n }\n const key = typeof idx === \"string\" || typeof idx === \"number\" ? idx : String(idx);\n if (!uniqueIndices.has(key)) {\n uniqueIndices.add(key);\n pivotIndex.push(key);\n }\n }\n\n for (const col of columnData) {\n if (col === null || col === undefined) {\n continue;\n }\n const colKey = String(col);\n if (!seenColumns.has(colKey)) {\n seenColumns.add(colKey);\n uniqueColumns.push(colKey);\n }\n }\n\n const rowPositionByIndex = new Map<string | number, number>();\n for (let i = 0; i < pivotIndex.length; i++) {\n const key = pivotIndex[i];\n if (key !== undefined) {\n rowPositionByIndex.set(key, i);\n }\n }\n\n for (const colKey of uniqueColumns) {\n pivotData[colKey] = new Array<unknown>(pivotIndex.length).fill(null);\n }\n\n // Track visited cells to detect duplicates even when values are null\n const visited = new Set<string>();\n\n for (let i = 0; i < indexData.length; i++) {\n const idx = indexData[i];\n const col = columnData[i];\n const value = valueData[i];\n\n if (idx !== null && idx !== undefined && col !== null && col !== undefined) {\n const indexKey = typeof idx === \"string\" || typeof idx === \"number\" ? idx : String(idx);\n const colKey = String(col);\n const rowPos = rowPositionByIndex.get(indexKey);\n\n if (rowPos === undefined) {\n continue;\n }\n\n const cellKey = `${rowPos}:${colKey}`;\n if (visited.has(cellKey)) {\n throw new DataValidationError(\n `Duplicate pivot entry for index '${String(indexKey)}' and column '${colKey}'`\n );\n }\n visited.add(cellKey);\n\n const targetColumn = pivotData[colKey];\n if (targetColumn) {\n targetColumn[rowPos] = value;\n }\n }\n }\n\n return new DataFrame(pivotData, {\n columns: uniqueColumns,\n index: pivotIndex,\n });\n }\n\n /**\n * Melt DataFrame.\n * Time complexity: O(n × m).\n *\n * @param id_vars - Columns to keep as is\n * @param value_vars - Columns to melt\n * @param var_name - Name for new column with melted variable names\n * @param value_name - Name for new column with melted values.\n * Must not conflict with existing columns or var_name.\n * @returns New DataFrame with melted data\n *\n * @example\n * ```ts\n * const df = new DataFrame({\n * id: ['a', 'b'],\n * x: [1, 2],\n * y: [3, 4]\n * });\n * df.melt(['id'], ['x', 'y'], 'variable', 'value');\n * // id | variable | value\n * // a | x | 1\n * // a | y | 3\n * // b | x | 2\n * // b | y | 4\n * ```\n */\n melt(\n id_vars: string[],\n value_vars: string[],\n var_name: string = \"variable\",\n value_name: string = \"value\"\n ): DataFrame {\n const idVars = [...id_vars];\n const valueVars = [...value_vars];\n\n ensureUniqueLabels(idVars, \"id_var\");\n ensureUniqueLabels(valueVars, \"value_var\");\n\n for (const idVar of idVars) {\n if (!this._columns.includes(idVar)) {\n throw new DataValidationError(`Column '${idVar}' not found in DataFrame`);\n }\n }\n\n for (const valueVar of valueVars) {\n if (!this._columns.includes(valueVar)) {\n throw new DataValidationError(`Column '${valueVar}' not found in DataFrame`);\n }\n }\n\n if (var_name === value_name) {\n throw new DataValidationError(\"var_name and value_name must be different\");\n }\n\n const reservedNames = new Set([...idVars, ...valueVars]);\n if (reservedNames.has(var_name) || reservedNames.has(value_name)) {\n throw new DataValidationError(\n \"var_name and value_name must not conflict with existing columns\"\n );\n }\n\n const newData: DataFrameData = {};\n for (const idVar of idVars) {\n newData[idVar] = [];\n }\n\n newData[var_name] = [];\n newData[value_name] = [];\n\n for (let i = 0; i < this._index.length; i++) {\n for (const valueVar of valueVars) {\n for (const idVar of idVars) {\n newData[idVar]?.push(this._data.get(idVar)?.[i]);\n }\n\n newData[var_name]?.push(valueVar);\n newData[value_name]?.push(this._data.get(valueVar)?.[i]);\n }\n }\n\n return new DataFrame(newData, {\n columns: [...idVars, var_name, value_name],\n });\n }\n\n /**\n * Rolling window mean calculation.\n *\n * @param window - Size of the rolling window\n * @param on - Column to apply rolling calculation to (if omitted, applies to all columns)\n * @returns New DataFrame with rolling mean values\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2, 3, 4, 5] });\n * df.rolling(3); // [[null], [null], [2], [3], [4]]\n * ```\n */\n rolling(window: number, on?: string): DataFrame {\n const newData: DataFrameData = {};\n\n if (!Number.isFinite(window) || !Number.isInteger(window) || window <= 0) {\n throw new InvalidParameterError(\"window must be a positive integer\", \"window\", window);\n }\n\n if (on && !this._columns.includes(on)) {\n throw new DataValidationError(`Column '${on}' not found in DataFrame`);\n }\n\n for (const col of this._columns) {\n if (col === on || !on) {\n const colData = this._data.get(col);\n if (!colData) continue;\n\n const rollingData: unknown[] = [];\n\n // Sliding window: maintain running sum and count for O(n) performance\n let windowSum = 0;\n let windowCount = 0;\n\n for (let i = 0; i < colData.length; i++) {\n // Add incoming element\n const incoming = colData[i];\n if (isValidNumber(incoming)) {\n windowSum += incoming;\n windowCount++;\n }\n\n // Remove outgoing element (element leaving the window)\n if (i >= window) {\n const outgoing = colData[i - window];\n if (isValidNumber(outgoing)) {\n windowSum -= outgoing;\n windowCount--;\n }\n }\n\n if (i < window - 1) {\n rollingData.push(null);\n } else if (windowCount === 0) {\n rollingData.push(null);\n } else {\n rollingData.push(windowSum / windowCount);\n }\n }\n\n newData[col] = rollingData;\n }\n }\n\n const outColumns = on ? [on] : this._columns;\n return new DataFrame(newData, {\n columns: outColumns,\n index: this._index,\n });\n }\n\n /**\n * Return a human-readable tabular string representation.\n *\n * Columns are right-aligned and padded so that rows line up.\n * Large DataFrames are truncated with an ellipsis row.\n *\n * @param maxRows - Maximum rows to display before summarizing (default: 20).\n * @returns Formatted table string\n *\n * @example\n * ```ts\n * const df = new DataFrame({ a: [1, 2], b: [3, 4] });\n * df.toString();\n * // \" a b\\n0 1 3\\n1 2 4\"\n * ```\n */\n toString(maxRows = 20): string {\n const nRows = this.shape[0] ?? 0;\n const cols = this._columns;\n\n // Determine which rows to show\n const half = Math.floor(maxRows / 2);\n const showAll = nRows <= maxRows;\n const topCount = showAll ? nRows : half;\n const bottomCount = showAll ? 0 : half;\n\n // Build header + data rows\n const allRows: string[][] = [];\n\n // Header row\n allRows.push([\"\", ...cols]);\n\n for (let i = 0; i < topCount; i++) {\n const idx = this._index[i];\n const row: string[] = [String(idx ?? i)];\n for (const col of cols) {\n const colData = this._data.get(col);\n const val = colData ? colData[i] : undefined;\n row.push(val === null || val === undefined ? \"null\" : String(val));\n }\n allRows.push(row);\n }\n\n if (!showAll) {\n allRows.push([\"...\", ...cols.map(() => \"...\")]);\n for (let i = nRows - bottomCount; i < nRows; i++) {\n const idx = this._index[i];\n const row: string[] = [String(idx ?? i)];\n for (const col of cols) {\n const colData = this._data.get(col);\n const val = colData ? colData[i] : undefined;\n row.push(val === null || val === undefined ? \"null\" : String(val));\n }\n allRows.push(row);\n }\n }\n\n // Calculate column widths\n const numCols = cols.length + 1;\n const widths = new Array<number>(numCols).fill(0);\n for (const row of allRows) {\n for (let c = 0; c < numCols; c++) {\n const cell = row[c] ?? \"\";\n if (cell.length > (widths[c] ?? 0)) {\n widths[c] = cell.length;\n }\n }\n }\n\n // Format each row\n const lines: string[] = [];\n for (const row of allRows) {\n const cells: string[] = [];\n for (let c = 0; c < numCols; c++) {\n const cell = row[c] ?? \"\";\n const w = widths[c] ?? 0;\n cells.push(cell.padStart(w));\n }\n lines.push(cells.join(\" \"));\n }\n\n return lines.join(\"\\n\");\n }\n}\n\n/**\n * GroupBy object for aggregation operations.\n *\n * Created by DataFrame.groupBy(). Used to perform aggregations on grouped data.\n *\n * @example\n * ```ts\n * const df = new DataFrame({\n * category: ['A', 'B', 'A', 'B'],\n * value: [10, 20, 30, 40]\n * });\n * const grouped = df.groupBy('category');\n * grouped.sum(); // Sum by category\n * grouped.mean(); // Mean by category\n * ```\n */\nexport class DataFrameGroupBy {\n // Store the group mapping (computed once)\n private groupMap: Map<string, number[]>;\n // Store the original key values for each group key (to avoid parsing)\n private keyValuesMap: Map<string, unknown[]>;\n private df: DataFrame;\n private by: string | string[];\n\n constructor(df: DataFrame, by: string | string[]) {\n this.df = df;\n this.by = by;\n // Build group map once during construction\n const buildResult = this.buildGroupMap();\n this.groupMap = buildResult.groupMap;\n this.keyValuesMap = buildResult.keyValuesMap;\n }\n\n /**\n * Build the grouping map: group key -> array of row indices.\n *\n * @private\n */\n private buildGroupMap(): {\n groupMap: Map<string, number[]>;\n keyValuesMap: Map<string, unknown[]>;\n } {\n const groupByCols = Array.isArray(this.by) ? this.by : [this.by];\n const groupMap = new Map<string, number[]>();\n const keyValuesMap = new Map<string, unknown[]>();\n\n const numRows = this.df.shape[0];\n\n // Fast path: single column groupBy — avoid array allocation and composite key\n if (groupByCols.length === 1) {\n const colData = this.df.get(groupByCols[0] as string).data;\n for (let i = 0; i < numRows; i++) {\n const val = colData[i];\n const key = createKey(val);\n\n let bucket = groupMap.get(key);\n if (bucket === undefined) {\n bucket = [];\n groupMap.set(key, bucket);\n keyValuesMap.set(key, [val]);\n }\n bucket.push(i);\n }\n } else {\n // Multi-column: pre-fetch all column data arrays\n const colDataArrays: (readonly unknown[])[] = [];\n for (let c = 0; c < groupByCols.length; c++) {\n colDataArrays.push(this.df.get(groupByCols[c] as string).data);\n }\n\n for (let i = 0; i < numRows; i++) {\n const keyParts: unknown[] = new Array(groupByCols.length);\n for (let c = 0; c < groupByCols.length; c++) {\n const colArr = colDataArrays[c];\n keyParts[c] = colArr !== undefined ? colArr[i] : undefined;\n }\n\n const key = createKey(keyParts);\n\n let bucket = groupMap.get(key);\n if (bucket === undefined) {\n bucket = [];\n groupMap.set(key, bucket);\n keyValuesMap.set(key, keyParts);\n }\n bucket.push(i);\n }\n }\n\n return { groupMap, keyValuesMap };\n }\n\n /**\n * Aggregate grouped data.\n *\n * @param operations - Dictionary of column name to aggregation function\n * @returns New DataFrame with aggregated data\n *\n * @example\n * ```ts\n * const grouped = df.groupBy('category');\n * const result = grouped.agg({ value: 'sum', count: 'count' });\n * ```\n */\n agg(operations: Record<string, AggregateFunction | AggregateFunction[]>): DataFrame {\n const groupByCols = Array.isArray(this.by) ? this.by : [this.by];\n const resultData: DataFrameData = {};\n\n const outputColumns: string[] = [];\n\n // Initialize result columns (groupby columns + aggregated columns)\n for (const col of groupByCols) {\n resultData[col] = [];\n outputColumns.push(col);\n }\n\n for (const [col, aggFunc] of Object.entries(operations)) {\n if (Array.isArray(aggFunc)) {\n for (const fn of aggFunc) {\n const outCol = `${col}_${fn}`;\n resultData[outCol] = [];\n outputColumns.push(outCol);\n }\n } else {\n resultData[col] = [];\n outputColumns.push(col);\n }\n }\n\n // Process each group\n for (const [keyStr, indices] of this.groupMap.entries()) {\n // Add group key values\n const keyParts = this.keyValuesMap.get(keyStr);\n if (!keyParts) {\n throw new DataValidationError(`Missing key values for group: ${keyStr}`);\n }\n\n for (let i = 0; i < groupByCols.length; i++) {\n const groupCol = groupByCols[i];\n if (groupCol) resultData[groupCol]?.push(keyParts[i]);\n }\n\n // Apply aggregation functions\n for (const [col, aggFunc] of Object.entries(operations)) {\n // Use raw data array to avoid allocation\n const seriesData = this.df.get(col).data;\n const funcs = Array.isArray(aggFunc) ? aggFunc : [aggFunc];\n\n for (const func of funcs) {\n let result: unknown;\n\n switch (func) {\n case \"count\": {\n let count = 0;\n for (const idx of indices) {\n const val = seriesData[idx];\n if (val !== null && val !== undefined) count++;\n }\n result = count;\n break;\n }\n case \"first\": {\n const firstIdx = indices[0];\n result = firstIdx !== undefined ? seriesData[firstIdx] : undefined;\n break;\n }\n case \"last\": {\n const lastIdx = indices[indices.length - 1];\n result = lastIdx !== undefined ? seriesData[lastIdx] : undefined;\n break;\n }\n case \"sum\": {\n let sum = 0;\n let hasNumeric = false;\n for (const idx of indices) {\n const val = seriesData[idx];\n if (val === null || val === undefined) continue;\n if (typeof val !== \"number\") {\n throw new DataValidationError(\"sum() only works on numbers\");\n }\n if (isValidNumber(val)) {\n sum += val;\n hasNumeric = true;\n }\n }\n // Match Series behavior: throw if empty?\n // But for groupby, usually we return result per group.\n // If we throw here, one empty group crashes the whole groupby.\n // But the test expects a throw for invalid types.\n // For empty groups, we probably want to return 0 or NaN without crashing.\n // But if type is wrong, we crash.\n result = hasNumeric ? sum : 0;\n break;\n }\n case \"mean\": {\n let sum = 0;\n let count = 0;\n for (const idx of indices) {\n const val = seriesData[idx];\n if (val === null || val === undefined) continue;\n if (typeof val !== \"number\") {\n throw new DataValidationError(\"mean() only works on numbers\");\n }\n if (isValidNumber(val)) {\n sum += val;\n count++;\n }\n }\n result = count > 0 ? sum / count : NaN;\n break;\n }\n case \"median\": {\n const nums: number[] = [];\n for (const idx of indices) {\n const val = seriesData[idx];\n if (val === null || val === undefined) continue;\n if (typeof val !== \"number\") {\n throw new DataValidationError(\"median() only works on numbers\");\n }\n if (isValidNumber(val)) nums.push(val);\n }\n if (nums.length === 0) {\n result = NaN;\n } else {\n nums.sort((a, b) => a - b);\n const mid = Math.floor(nums.length / 2);\n if (nums.length % 2 === 0) {\n const v1 = nums[mid - 1];\n const v2 = nums[mid];\n result = v1 !== undefined && v2 !== undefined ? (v1 + v2) / 2 : NaN;\n } else {\n result = nums[mid] ?? NaN;\n }\n }\n break;\n }\n case \"min\": {\n let min = Infinity;\n let hasNumeric = false;\n for (const idx of indices) {\n const val = seriesData[idx];\n if (val === null || val === undefined) continue;\n if (typeof val !== \"number\") {\n throw new DataValidationError(\"min() only works on numbers\");\n }\n if (isValidNumber(val)) {\n if (val < min) min = val;\n hasNumeric = true;\n }\n }\n result = hasNumeric ? min : NaN;\n break;\n }\n case \"max\": {\n let max = -Infinity;\n let hasNumeric = false;\n for (const idx of indices) {\n const val = seriesData[idx];\n if (val === null || val === undefined) continue;\n if (typeof val !== \"number\") {\n throw new DataValidationError(\"max() only works on numbers\");\n }\n if (isValidNumber(val)) {\n if (val > max) max = val;\n hasNumeric = true;\n }\n }\n result = hasNumeric ? max : NaN;\n break;\n }\n case \"std\": {\n let sum = 0;\n let count = 0;\n const nums: number[] = [];\n // First pass: sum and collect numbers\n for (const idx of indices) {\n const val = seriesData[idx];\n if (val === null || val === undefined) continue;\n if (typeof val !== \"number\") {\n throw new DataValidationError(\"std() only works on numbers\");\n }\n if (isValidNumber(val)) {\n sum += val;\n count++;\n nums.push(val);\n }\n }\n if (count < 2) {\n result = NaN;\n } else {\n const mean = sum / count;\n let sumSq = 0;\n for (const val of nums) {\n sumSq += (val - mean) ** 2;\n }\n result = Math.sqrt(sumSq / (count - 1));\n }\n break;\n }\n case \"var\": {\n let sum = 0;\n let count = 0;\n const nums: number[] = [];\n // First pass: sum and collect numbers\n for (const idx of indices) {\n const val = seriesData[idx];\n if (val === null || val === undefined) continue;\n if (typeof val !== \"number\") {\n throw new DataValidationError(\"var() only works on numbers\");\n }\n if (isValidNumber(val)) {\n sum += val;\n count++;\n nums.push(val);\n }\n }\n if (count < 2) {\n result = NaN;\n } else {\n const mean = sum / count;\n let sumSq = 0;\n for (const val of nums) {\n sumSq += (val - mean) ** 2;\n }\n result = sumSq / (count - 1);\n }\n break;\n }\n default:\n throw new DataValidationError(`Unsupported aggregation function: ${func}`);\n }\n\n const outCol = Array.isArray(aggFunc) ? `${col}_${func}` : col;\n resultData[outCol]?.push(result);\n }\n }\n }\n\n return new DataFrame(resultData, { columns: outputColumns });\n }\n\n /**\n * Helper to identify numeric columns (excluding grouping columns).\n * @private\n */\n private getNumericColumns(): string[] {\n const groupByCols = Array.isArray(this.by) ? this.by : [this.by];\n const otherCols = this.df.columns.filter((c) => !groupByCols.includes(c));\n return otherCols.filter((col) => {\n const colData = this.df.get(col);\n // efficient check: look for at least one valid number\n return colData.data.some(isValidNumber);\n });\n }\n\n /**\n * Helper method to perform same aggregation on all numeric non-grouping columns.\n * @private\n */\n private aggNumeric(operation: AggregateFunction): DataFrame {\n const numericCols = this.getNumericColumns();\n const operations: Record<string, AggregateFunction> = {};\n for (const col of numericCols) {\n operations[col] = operation;\n }\n return this.agg(operations);\n }\n\n /**\n * Helper method to perform same aggregation on all non-grouping columns.\n *\n * @private\n */\n private aggAll(operation: AggregateFunction): DataFrame {\n const groupByCols = Array.isArray(this.by) ? this.by : [this.by];\n const otherCols = this.df.columns.filter((c) => !groupByCols.includes(c));\n\n const operations: Record<string, AggregateFunction> = {};\n for (const col of otherCols) {\n operations[col] = operation;\n }\n\n return this.agg(operations);\n }\n\n /**\n * Compute sum for each group.\n *\n * @returns DataFrame with summed values by group\n *\n * @example\n * ```ts\n * const df = new DataFrame({\n * category: ['A', 'A', 'B', 'B'],\n * value: [1, 2, 3, 4]\n * });\n * df.groupBy('category').sum();\n * // category | value\n * // A | 3\n * // B | 7\n * ```\n */\n sum(): DataFrame {\n return this.aggNumeric(\"sum\");\n }\n\n /**\n * Compute mean (average) for each group.\n *\n * @returns DataFrame with mean values by group\n */\n mean(): DataFrame {\n return this.aggNumeric(\"mean\");\n }\n\n /**\n * Count non-null values in each non-grouping column for every group.\n *\n * @returns DataFrame with per-column non-null counts by group\n */\n count(): DataFrame {\n return this.aggAll(\"count\");\n }\n\n /**\n * Compute minimum value for each group.\n *\n * @returns DataFrame with minimum values by group\n */\n min(): DataFrame {\n return this.aggNumeric(\"min\");\n }\n\n /**\n * Compute maximum value for each group.\n *\n * @returns DataFrame with maximum values by group\n */\n max(): DataFrame {\n return this.aggNumeric(\"max\");\n }\n\n /**\n * Compute standard deviation for each group.\n *\n * @returns DataFrame with standard deviation values by group\n */\n std(): DataFrame {\n return this.aggNumeric(\"std\");\n }\n\n /**\n * Compute variance for each group.\n *\n * @returns DataFrame with variance values by group\n */\n var(): DataFrame {\n return this.aggNumeric(\"var\");\n }\n\n /**\n * Compute median for each group.\n *\n * @returns DataFrame with median values by group\n */\n median(): DataFrame {\n return this.aggNumeric(\"median\");\n }\n}\n"]}
|