763e06c127
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
61 lines
1.6 KiB
Python
61 lines
1.6 KiB
Python
"""Tests para cramers_v."""
|
|
|
|
import os
|
|
import random
|
|
import sys
|
|
|
|
sys.path.insert(0, os.path.dirname(__file__))
|
|
|
|
from cramers_v import cramers_v
|
|
|
|
|
|
def test_perfect_association_is_near_one():
|
|
a = ["x", "y", "z", "x", "y", "z", "x", "y", "z", "x", "y", "z"]
|
|
b = list(a) # b == a -> asociacion perfecta
|
|
v = cramers_v(a, b)
|
|
assert v > 0.95
|
|
assert v <= 1.0
|
|
|
|
|
|
def test_independent_columns_low_value():
|
|
rng = random.Random(42)
|
|
cats = ["a", "b", "c", "d"]
|
|
a = [rng.choice(cats) for _ in range(2000)]
|
|
b = [rng.choice(cats) for _ in range(2000)]
|
|
v = cramers_v(a, b)
|
|
assert 0.0 <= v < 0.5
|
|
|
|
|
|
def test_single_category_returns_zero():
|
|
a = ["only"] * 10 # <2 categorias en a
|
|
b = ["x", "y", "x", "y", "x", "y", "x", "y", "x", "y"]
|
|
assert cramers_v(a, b) == 0.0
|
|
|
|
|
|
def test_fewer_than_two_pairs_returns_zero():
|
|
assert cramers_v([], []) == 0.0
|
|
assert cramers_v(["a"], ["b"]) == 0.0
|
|
|
|
|
|
def test_none_pairs_are_discarded():
|
|
a = ["x", None, "y", "x", None, "y", "x", "y"]
|
|
b = ["x", "z", "y", "x", "z", "y", None, "y"]
|
|
v = cramers_v(a, b)
|
|
assert isinstance(v, float)
|
|
assert 0.0 <= v <= 1.0
|
|
|
|
|
|
def test_always_returns_float_never_none():
|
|
assert isinstance(cramers_v(["a", "b"], ["a", "b"]), float)
|
|
assert isinstance(cramers_v([None], [None]), float)
|
|
|
|
|
|
def test_derived_column_high_association():
|
|
rng = random.Random(7)
|
|
a = [rng.choice(["red", "green", "blue"]) for _ in range(600)]
|
|
# b derivada de a (mapeo deterministico) -> alta asociacion.
|
|
mapping = {"red": "hot", "green": "cool", "blue": "cool"}
|
|
b = [mapping[x] for x in a]
|
|
v = cramers_v(a, b)
|
|
assert v > 0.5
|