|
1 | 1 | import { concat, Tensor2D } from '@tensorflow/tfjs-core' |
2 | | -import { dfd } from '../shared/globals' |
3 | | -import { Scikit1D, Scikit2D, Transformer } from '../types' |
4 | | - |
| 2 | +import { DataFrameInterface, Scikit1D, Scikit2D, Transformer } from '../types' |
| 3 | +import { isDataFrameInterface, isScikitLike2D } from '../typesUtils' |
| 4 | +import { tf } from '../shared/globals' |
5 | 5 | /* |
6 | 6 | Next steps: |
7 | 7 | 1. Support 'passthrough' and 'drop' and estimator for remainder (also in transformer list) |
@@ -80,56 +80,74 @@ export class ColumnTransformer { |
80 | 80 | this.remainder = remainder |
81 | 81 | } |
82 | 82 |
|
83 | | - public fit(X: Scikit2D, y?: Scikit1D) { |
84 | | - const newDf = X instanceof dfd.DataFrame ? X : new dfd.DataFrame(X) |
85 | | - |
| 83 | + public fit(X: Tensor2D | DataFrameInterface, y?: Scikit1D) { |
86 | 84 | for (let i = 0; i < this.transformers.length; i++) { |
87 | 85 | let [, curTransform, selection] = this.transformers[i] |
88 | 86 |
|
89 | | - let subsetX = this.getColumns(newDf, selection) |
| 87 | + let subsetX = this.getColumns(X, selection) |
90 | 88 | curTransform.fit(subsetX, y) |
91 | 89 | } |
92 | 90 | return this |
93 | 91 | } |
94 | 92 |
|
95 | | - public transform(X: Scikit2D, y?: Scikit1D) { |
96 | | - const newDf = X instanceof dfd.DataFrame ? X : new dfd.DataFrame(X) |
97 | | - |
| 93 | + public transform(X: Tensor2D | DataFrameInterface, y?: Scikit1D) { |
98 | 94 | let output = [] |
99 | 95 | for (let i = 0; i < this.transformers.length; i++) { |
100 | 96 | let [, curTransform, selection] = this.transformers[i] |
101 | 97 |
|
102 | | - let subsetX = this.getColumns(newDf, selection) |
| 98 | + let subsetX = this.getColumns(X, selection) |
103 | 99 |
|
104 | 100 | output.push(curTransform.transform(subsetX, y)) |
105 | 101 | } |
106 | 102 | return concat(output, 1) |
107 | 103 | } |
108 | 104 |
|
109 | | - public fitTransform(X: Scikit2D, y?: Scikit1D) { |
110 | | - const newDf = X instanceof dfd.DataFrame ? X : new dfd.DataFrame(X) |
111 | | - |
| 105 | + public fitTransform(X: Tensor2D | DataFrameInterface, y?: Scikit1D) { |
112 | 106 | let output = [] |
113 | 107 | for (let i = 0; i < this.transformers.length; i++) { |
114 | 108 | let [, curTransform, selection] = this.transformers[i] |
115 | 109 |
|
116 | | - let subsetX = this.getColumns(newDf, selection) |
| 110 | + let subsetX = this.getColumns(X, selection) |
117 | 111 |
|
118 | 112 | output.push(curTransform.fitTransform(subsetX, y)) |
119 | 113 | } |
120 | 114 | return concat(output, 1) |
121 | 115 | } |
122 | 116 |
|
123 | | - getColumns(X: dfd.DataFrame, selectedColumns: Selection): Tensor2D { |
124 | | - if (isStringArray(selectedColumns)) { |
125 | | - return X.loc({ columns: selectedColumns }).tensor as unknown as Tensor2D |
126 | | - } |
127 | | - if (Array.isArray(selectedColumns)) { |
128 | | - return X.iloc({ columns: selectedColumns }).tensor as unknown as Tensor2D |
129 | | - } |
130 | | - if (typeof selectedColumns === 'string') { |
131 | | - return X[selectedColumns].tensor |
| 117 | + getColumns( |
| 118 | + X: DataFrameInterface | Tensor2D, |
| 119 | + selectedColumns: Selection |
| 120 | + ): Tensor2D { |
| 121 | + if (isDataFrameInterface(X)) { |
| 122 | + if (isStringArray(selectedColumns)) { |
| 123 | + return X.loc({ columns: selectedColumns }) |
| 124 | + .tensor as unknown as Tensor2D |
| 125 | + } |
| 126 | + if (Array.isArray(selectedColumns)) { |
| 127 | + return X.iloc({ columns: selectedColumns }) |
| 128 | + .tensor as unknown as Tensor2D |
| 129 | + } |
| 130 | + if (typeof selectedColumns === 'string') { |
| 131 | + return X[selectedColumns].tensor |
| 132 | + } |
| 133 | + return X.iloc({ columns: [selectedColumns] }) |
| 134 | + .tensor as unknown as Tensor2D |
| 135 | + } else { |
| 136 | + if ( |
| 137 | + isStringArray(selectedColumns) || |
| 138 | + typeof selectedColumns === 'string' |
| 139 | + ) { |
| 140 | + throw new Error( |
| 141 | + "Can't pass string selected columns when not a DataFrame" |
| 142 | + ) |
| 143 | + } |
| 144 | + if (typeof selectedColumns === 'number') { |
| 145 | + let columns = tf.tensor1d([selectedColumns]) |
| 146 | + return X.gather(columns, 1) |
| 147 | + } else { |
| 148 | + let columns = tf.tensor1d(selectedColumns) |
| 149 | + return X.gather(columns, 1) |
| 150 | + } |
132 | 151 | } |
133 | | - return X.iloc({ columns: [selectedColumns] }).tensor as unknown as Tensor2D |
134 | 152 | } |
135 | 153 | } |
0 commit comments