Repository: MaxGhenis/synthimpute

Issue:
rf_impute fails when train and test have different number of rows
Testing on taxdata CPS ages produces:
>ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 0, the array at index 0 has size 319525 and the array at index 1 has size 136940

Happens with and without `sample_weight_train`:
```
age_head_imp = si.rf_impute(train[XCOLS], train.age_head, test[XCOLS],
                            sample_weight_train=train[W])
```

Discussion:

Patch:
diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml
deleted file mode 100644
index f1abc2f..0000000
--- a/.github/workflows/python-package.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
-# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
-
-name: Python package
-
-on:
-  push:
-    branches: [ master ]
-  pull_request:
-    branches: [ master ]
-
-jobs:
-  build:
-
-    runs-on: ubuntu-latest
-    strategy:
-      matrix:
-        python-version: [3.5, 3.6, 3.7, 3.8]
-
-    steps:
-    - uses: actions/checkout@v2
-    - name: Set up Python ${{ matrix.python-version }}
-      uses: actions/setup-python@v2
-      with:
-        python-version: ${{ matrix.python-version }}
-    - name: Install dependencies
-      run: |
-        python -m pip install --upgrade pip
-        pip install flake8 pytest
-        if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
-    - name: Lint with flake8
-      run: |
-        # stop the build if there are Python syntax errors or undefined names
-        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
-        # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
-        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
-    - name: Test with pytest
-      run: |
-        pytest
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..e8bad08
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,4 @@
+numpy
+pandas
+scikit-learn
+statsmodels
\ No newline at end of file
diff --git a/synthimpute/rf_impute.py b/synthimpute/rf_impute.py
index 06b22a4..1847747 100644
--- a/synthimpute/rf_impute.py
+++ b/synthimpute/rf_impute.py
@@ -73,5 +73,5 @@ def rf_impute(x_train, y_train, x_new, x_cols=None, random_state=None,
         rf.fit(x_train, y_train, sample_weight=sample_weight_train)
     if random_state is not None:
         np.random.seed(random_state)
-    quantiles = np.random.rand(y_train.size)  # Uniform distribution.
+    quantiles = np.random.rand(x_new.shape[0])  # Uniform distribution.
     return rf_quantile(rf, x_new, quantiles)


Test patch:
diff --git a/synthimpute/tests/test_rf_impute.py b/synthimpute/tests/test_rf_impute.py
index ce99542..6e2ad6c 100644
--- a/synthimpute/tests/test_rf_impute.py
+++ b/synthimpute/tests/test_rf_impute.py
@@ -5,7 +5,7 @@ from sklearn import ensemble
 
 
 def test_rf_impute():
-    N_TRAIN = 1000
+    N_TRAIN = 2000
     N_NEW = 1000
     n = N_TRAIN + N_NEW
     x = pd.DataFrame({'x1': np.random.randn(n),