test_compat.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import numpy as np
  2. import pytest
  3. import pandas as pd
  4. from pandas import MultiIndex
  5. import pandas._testing as tm
  6. def test_numeric_compat(idx):
  7. with pytest.raises(TypeError, match="cannot perform __mul__"):
  8. idx * 1
  9. with pytest.raises(TypeError, match="cannot perform __rmul__"):
  10. 1 * idx
  11. div_err = "cannot perform __truediv__"
  12. with pytest.raises(TypeError, match=div_err):
  13. idx / 1
  14. div_err = div_err.replace(" __", " __r")
  15. with pytest.raises(TypeError, match=div_err):
  16. 1 / idx
  17. with pytest.raises(TypeError, match="cannot perform __floordiv__"):
  18. idx // 1
  19. with pytest.raises(TypeError, match="cannot perform __rfloordiv__"):
  20. 1 // idx
  21. @pytest.mark.parametrize("method", ["all", "any", "__invert__"])
  22. def test_logical_compat(idx, method):
  23. msg = f"cannot perform {method}"
  24. with pytest.raises(TypeError, match=msg):
  25. getattr(idx, method)()
  26. def test_inplace_mutation_resets_values():
  27. levels = [["a", "b", "c"], [4]]
  28. levels2 = [[1, 2, 3], ["a"]]
  29. codes = [[0, 1, 0, 2, 2, 0], [0, 0, 0, 0, 0, 0]]
  30. mi1 = MultiIndex(levels=levels, codes=codes)
  31. mi2 = MultiIndex(levels=levels2, codes=codes)
  32. # instantiating MultiIndex should not access/cache _.values
  33. assert "_values" not in mi1._cache
  34. assert "_values" not in mi2._cache
  35. vals = mi1.values.copy()
  36. vals2 = mi2.values.copy()
  37. # accessing .values should cache ._values
  38. assert mi1._values is mi1._cache["_values"]
  39. assert mi1.values is mi1._cache["_values"]
  40. assert isinstance(mi1._cache["_values"], np.ndarray)
  41. # Make sure level setting works
  42. new_vals = mi1.set_levels(levels2).values
  43. tm.assert_almost_equal(vals2, new_vals)
  44. # Doesn't drop _values from _cache [implementation detail]
  45. tm.assert_almost_equal(mi1._cache["_values"], vals)
  46. # ...and values is still same too
  47. tm.assert_almost_equal(mi1.values, vals)
  48. # Make sure label setting works too
  49. codes2 = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
  50. exp_values = np.empty((6,), dtype=object)
  51. exp_values[:] = [(1, "a")] * 6
  52. # Must be 1d array of tuples
  53. assert exp_values.shape == (6,)
  54. new_mi = mi2.set_codes(codes2)
  55. assert "_values" not in new_mi._cache
  56. new_values = new_mi.values
  57. assert "_values" in new_mi._cache
  58. # Shouldn't change cache
  59. tm.assert_almost_equal(mi2._cache["_values"], vals2)
  60. # Should have correct values
  61. tm.assert_almost_equal(exp_values, new_values)
  62. def test_boxable_categorical_values():
  63. cat = pd.Categorical(pd.date_range("2012-01-01", periods=3, freq="h"))
  64. result = MultiIndex.from_product([["a", "b", "c"], cat]).values
  65. expected = pd.Series(
  66. [
  67. ("a", pd.Timestamp("2012-01-01 00:00:00")),
  68. ("a", pd.Timestamp("2012-01-01 01:00:00")),
  69. ("a", pd.Timestamp("2012-01-01 02:00:00")),
  70. ("b", pd.Timestamp("2012-01-01 00:00:00")),
  71. ("b", pd.Timestamp("2012-01-01 01:00:00")),
  72. ("b", pd.Timestamp("2012-01-01 02:00:00")),
  73. ("c", pd.Timestamp("2012-01-01 00:00:00")),
  74. ("c", pd.Timestamp("2012-01-01 01:00:00")),
  75. ("c", pd.Timestamp("2012-01-01 02:00:00")),
  76. ]
  77. ).values
  78. tm.assert_numpy_array_equal(result, expected)
  79. result = pd.DataFrame({"a": ["a", "b", "c"], "b": cat, "c": np.array(cat)}).values
  80. expected = pd.DataFrame(
  81. {
  82. "a": ["a", "b", "c"],
  83. "b": [
  84. pd.Timestamp("2012-01-01 00:00:00"),
  85. pd.Timestamp("2012-01-01 01:00:00"),
  86. pd.Timestamp("2012-01-01 02:00:00"),
  87. ],
  88. "c": [
  89. pd.Timestamp("2012-01-01 00:00:00"),
  90. pd.Timestamp("2012-01-01 01:00:00"),
  91. pd.Timestamp("2012-01-01 02:00:00"),
  92. ],
  93. }
  94. ).values
  95. tm.assert_numpy_array_equal(result, expected)