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)

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])
```
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),

pip install -e .
parse_log_pytest
pytest
pytest
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///croot/attrs_1668696182826/work
certifi @ file:///croot/certifi_1671487769961/work/certifi
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648562407465/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
joblib==1.3.2
numpy==1.21.6
packaging @ file:///croot/packaging_1671697413597/work
pandas==1.3.5
patsy==1.0.1
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pytest==7.1.2
python-dateutil==2.9.0.post0
pytz==2025.2
scikit-learn==1.0.2
scipy==1.7.3
six==1.17.0
statsmodels==0.13.5
-e git+https://github.com/MaxGhenis/synthimpute.git@182cae42c16eb76c2aefd5c964345e404e8e2b7e#egg=synthimpute
threadpoolctl==3.1.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
typing_extensions @ file:///croot/typing_extensions_1669924550328/work
zipp @ file:///croot/zipp_1672387121353/work

name: synthimpute
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib-metadata=4.11.3=py37h06a4308_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - typing_extensions=4.4.0=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - joblib==1.3.2
      - numpy==1.21.6
      - pandas==1.3.5
      - patsy==1.0.1
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - scikit-learn==1.0.2
      - scipy==1.7.3
      - six==1.17.0
      - statsmodels==0.13.5
      - threadpoolctl==3.1.0
prefix: /opt/conda/envs/synthimpute

synthimpute/tests/test_rf_impute.py::test_rf_impute
requirements.txt synthimpute/rf_impute.py .github/workflows/python-package.yml
requirements.txt synthimpute/rf_impute.py .github/workflows/python-package.yml