test_function.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import numpy as np
  2. import pytest
  3. import pandas as pd
  4. import pandas._testing as tm
  5. @pytest.mark.parametrize(
  6. "ufunc", [np.add, np.logical_or, np.logical_and, np.logical_xor]
  7. )
  8. def test_ufuncs_binary(ufunc):
  9. # two BooleanArrays
  10. a = pd.array([True, False, None], dtype="boolean")
  11. result = ufunc(a, a)
  12. expected = pd.array(ufunc(a._data, a._data), dtype="boolean")
  13. expected[a._mask] = np.nan
  14. tm.assert_extension_array_equal(result, expected)
  15. s = pd.Series(a)
  16. result = ufunc(s, a)
  17. expected = pd.Series(ufunc(a._data, a._data), dtype="boolean")
  18. expected[a._mask] = np.nan
  19. tm.assert_series_equal(result, expected)
  20. # Boolean with numpy array
  21. arr = np.array([True, True, False])
  22. result = ufunc(a, arr)
  23. expected = pd.array(ufunc(a._data, arr), dtype="boolean")
  24. expected[a._mask] = np.nan
  25. tm.assert_extension_array_equal(result, expected)
  26. result = ufunc(arr, a)
  27. expected = pd.array(ufunc(arr, a._data), dtype="boolean")
  28. expected[a._mask] = np.nan
  29. tm.assert_extension_array_equal(result, expected)
  30. # BooleanArray with scalar
  31. result = ufunc(a, True)
  32. expected = pd.array(ufunc(a._data, True), dtype="boolean")
  33. expected[a._mask] = np.nan
  34. tm.assert_extension_array_equal(result, expected)
  35. result = ufunc(True, a)
  36. expected = pd.array(ufunc(True, a._data), dtype="boolean")
  37. expected[a._mask] = np.nan
  38. tm.assert_extension_array_equal(result, expected)
  39. # not handled types
  40. msg = r"operand type\(s\) all returned NotImplemented from __array_ufunc__"
  41. with pytest.raises(TypeError, match=msg):
  42. ufunc(a, "test")
  43. @pytest.mark.parametrize("ufunc", [np.logical_not])
  44. def test_ufuncs_unary(ufunc):
  45. a = pd.array([True, False, None], dtype="boolean")
  46. result = ufunc(a)
  47. expected = pd.array(ufunc(a._data), dtype="boolean")
  48. expected[a._mask] = np.nan
  49. tm.assert_extension_array_equal(result, expected)
  50. ser = pd.Series(a)
  51. result = ufunc(ser)
  52. expected = pd.Series(ufunc(a._data), dtype="boolean")
  53. expected[a._mask] = np.nan
  54. tm.assert_series_equal(result, expected)
  55. def test_ufunc_numeric():
  56. # np.sqrt on np.bool_ returns float16, which we upcast to Float32
  57. # bc we do not have Float16
  58. arr = pd.array([True, False, None], dtype="boolean")
  59. res = np.sqrt(arr)
  60. expected = pd.array([1, 0, None], dtype="Float32")
  61. tm.assert_extension_array_equal(res, expected)
  62. @pytest.mark.parametrize("values", [[True, False], [True, None]])
  63. def test_ufunc_reduce_raises(values):
  64. arr = pd.array(values, dtype="boolean")
  65. res = np.add.reduce(arr)
  66. if arr[-1] is pd.NA:
  67. expected = pd.NA
  68. else:
  69. expected = arr._data.sum()
  70. tm.assert_almost_equal(res, expected)
  71. def test_value_counts_na():
  72. arr = pd.array([True, False, pd.NA], dtype="boolean")
  73. result = arr.value_counts(dropna=False)
  74. expected = pd.Series([1, 1, 1], index=arr, dtype="Int64", name="count")
  75. assert expected.index.dtype == arr.dtype
  76. tm.assert_series_equal(result, expected)
  77. result = arr.value_counts(dropna=True)
  78. expected = pd.Series([1, 1], index=arr[:-1], dtype="Int64", name="count")
  79. assert expected.index.dtype == arr.dtype
  80. tm.assert_series_equal(result, expected)
  81. def test_value_counts_with_normalize():
  82. ser = pd.Series([True, False, pd.NA], dtype="boolean")
  83. result = ser.value_counts(normalize=True)
  84. expected = pd.Series([1, 1], index=ser[:-1], dtype="Float64", name="proportion") / 2
  85. assert expected.index.dtype == "boolean"
  86. tm.assert_series_equal(result, expected)
  87. def test_diff():
  88. a = pd.array(
  89. [True, True, False, False, True, None, True, None, False], dtype="boolean"
  90. )
  91. result = pd.core.algorithms.diff(a, 1)
  92. expected = pd.array(
  93. [None, False, True, False, True, None, None, None, None], dtype="boolean"
  94. )
  95. tm.assert_extension_array_equal(result, expected)
  96. ser = pd.Series(a)
  97. result = ser.diff()
  98. expected = pd.Series(expected)
  99. tm.assert_series_equal(result, expected)