def test_decision_function_neg():
    ypred_proba = np.arange(6) / 5.0
    y_true = pd.Series(np.array([0] * 3 + [1] * 3), dtype=bool)
    obj = F1()
    pd.testing.assert_series_equal(obj.decision_function(ypred_proba), y_true)
    pd.testing.assert_series_equal(
        obj.decision_function(pd.Series(ypred_proba, dtype=float)), y_true)
def test_optimize_threshold():
    ypred_proba = np.array([0.2, 0.4])
    y_true = np.array([0, 1])
    obj = F1()
    np.random.seed(
        42
    )  # unfortunately scipy.optimize.minimize_scalar has no ability to accept seed as input
    threshold = obj.optimize_threshold(ypred_proba, y_true)
    assert 0.2 < threshold and threshold < 0.4
def test_decision_function():
    ypred_proba = np.arange(6) / 5.0
    obj = F1()
    pd.testing.assert_series_equal(
        obj.decision_function(ypred_proba),
        pd.Series(np.array([0] * 3 + [1] * 3), dtype=bool))
    pd.testing.assert_series_equal(
        obj.decision_function(ypred_proba, threshold=0.5),
        pd.Series(np.array([0] * 3 + [1] * 3), dtype=bool))
    pd.testing.assert_series_equal(
        obj.decision_function(ypred_proba, threshold=0.0),
        pd.Series(np.array([0] + [1] * 5, dtype=int), dtype=bool))
    pd.testing.assert_series_equal(
        obj.decision_function(ypred_proba, threshold=1.0),
        pd.Series(np.array([0] * 6, dtype=int), dtype=bool))
def test_can_optimize_threshold():
    assert F1().can_optimize_threshold
    assert not AUC().can_optimize_threshold