# Path: impyute/imputation/cs/central_tendency.py
# @wrapper.wrappers
# @wrapper.checks
# def mean(data):
#     """ Substitute missing values with the mean of that column.
# 
#     Parameters
#     ----------
#     data: numpy.ndarray
#         Data to impute.
# 
#     Returns
#     -------
#     numpy.ndarray
#         Imputed data.
# 
#     """
#     nan_xy = matrix.nan_indices(data)
#     for x_i, y_i in nan_xy:
#         row_wo_nan = data[:, [y_i]][~np.isnan(data[:, [y_i]])]
#         new_value = np.mean(row_wo_nan)
#         data[x_i][y_i] = new_value
#     return data
# 
# Path: impyute/ops/error.py
# class BadInputError(Exception):
# class BadOutputError(Exception):
# 
# Path: impyute/ops/wrapper.py
# @wraps(fn)
# def wrapper(*args, **kwargs):
#     postprocess_fn = None
#     ## convert tuple to list so args can be modified
#     args = list(args)
#     ## Either make a copy or use a pointer to the original
#     if kwargs.get('inplace'):
#         args[0] = args[0]
#     else:
#         args[0] = args[0].copy()
# 
#     ## If input data is a dataframe then cast the input to an np.array
#     ## and set an indicator flag before continuing
#     pd_DataFrame = get_pandas_df()
#     if pd_DataFrame and isinstance(args[0], pd_DataFrame):
#         postprocess_fn = pd_DataFrame
#         args[0] = args[0].values
# 
#     ## function invokation
#     results = u.execute_fn_with_args_and_or_kwargs(fn, args, kwargs)
# 
#     ## cast the output back to a DataFrame.
#     if postprocess_fn is not None:
#         results = postprocess_fn(results)
# 
#     return results


import pytest
import numpy as np
    import pandas as pd
from impyute.imputation.cs import mean
from impyute.ops import error
from impyute.ops import wrapper
    """Input may be changed if inplace set to true and operation is inplace"""
    A = np.ones((5, 5))
    A_copy = A.copy()
    wrappers_mul(A, inplace=True)
    assert A[0, 0] != A_copy[0, 0]

def test_wrappers_pandas_input():
    """ Input: DataFrame, Output: DataFrame """
    # Skip this test if you don't have pandas
    pytest.importorskip('pandas')
    # Create a DataFrame with a NaN
    A = np.arange(25).reshape((5, 5)).astype(np.float)
    A[0, 0] = np.nan
    A = pd.DataFrame(A)
    # Assert that the output is a DataFrame
    assert isinstance(mean(A), pd.DataFrame)

@wrapper.checks
def some_fn(data):
    """Dummy fn that has form of np.array -> np.array"""
    return data

def test_correct_input():
    """ Test that an array that should satisfy all checks, no BadInputError should be raised"""
    # Integer np.ndarray (check: `_is_ndarray`, `_shape_2d`, `_nan_exists`)
    arr = np.array([[np.nan, 2], [3, 4]])
    # Cast integer array to float (check: `_dtype_float`)
    arr.dtype = np.float
    try:
        some_fn(arr)

# Path: impyute/imputation/cs/central_tendency.py
# @wrapper.wrappers
# @wrapper.checks
# def mean(data):
#     """ Substitute missing values with the mean of that column.
# 
#     Parameters
#     ----------
#     data: numpy.ndarray
#         Data to impute.
# 
#     Returns
#     -------
#     numpy.ndarray
#         Imputed data.
# 
#     """
#     nan_xy = matrix.nan_indices(data)
#     for x_i, y_i in nan_xy:
#         row_wo_nan = data[:, [y_i]][~np.isnan(data[:, [y_i]])]
#         new_value = np.mean(row_wo_nan)
#         data[x_i][y_i] = new_value
#     return data
# 
# Path: impyute/ops/error.py
# class BadInputError(Exception):
# class BadOutputError(Exception):
# 
# Path: impyute/ops/wrapper.py
# @wraps(fn)
# def wrapper(*args, **kwargs):
#     postprocess_fn = None
#     ## convert tuple to list so args can be modified
#     args = list(args)
#     ## Either make a copy or use a pointer to the original
#     if kwargs.get('inplace'):
#         args[0] = args[0]
#     else:
#         args[0] = args[0].copy()
# 
#     ## If input data is a dataframe then cast the input to an np.array
#     ## and set an indicator flag before continuing
#     pd_DataFrame = get_pandas_df()
#     if pd_DataFrame and isinstance(args[0], pd_DataFrame):
#         postprocess_fn = pd_DataFrame
#         args[0] = args[0].values
# 
#     ## function invokation
#     results = u.execute_fn_with_args_and_or_kwargs(fn, args, kwargs)
# 
#     ## cast the output back to a DataFrame.
#     if postprocess_fn is not None:
#         results = postprocess_fn(results)
# 
#     return results


# Path: test/ops/test_wrapper.py
import pytest
import numpy as np
    import pandas as pd
from impyute.imputation.cs import mean
from impyute.ops import error
from impyute.ops import wrapper

    """Input may be changed if inplace set to true and operation is inplace"""
    A = np.ones((5, 5))
    A_copy = A.copy()
    wrappers_mul(A, inplace=True)
    assert A[0, 0] != A_copy[0, 0]

def test_wrappers_pandas_input():
    """ Input: DataFrame, Output: DataFrame """
    # Skip this test if you don't have pandas
    pytest.importorskip('pandas')
    # Create a DataFrame with a NaN
    A = np.arange(25).reshape((5, 5)).astype(np.float)
    A[0, 0] = np.nan
    A = pd.DataFrame(A)
    # Assert that the output is a DataFrame
    assert isinstance(mean(A), pd.DataFrame)

@wrapper.checks
def some_fn(data):
    """Dummy fn that has form of np.array -> np.array"""
    return data

def test_correct_input():
    """ Test that an array that should satisfy all checks, no BadInputError should be raised"""
    # Integer np.ndarray (check: `_is_ndarray`, `_shape_2d`, `_nan_exists`)
    arr = np.array([[np.nan, 2], [3, 4]])
    # Cast integer array to float (check: `_dtype_float`)
    arr.dtype = np.float
    try:
        some_fn(arr)

    except error.BadInputError: