test_copy.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import numpy as np
  2. import pytest
  3. from pandas import (
  4. Series,
  5. Timestamp,
  6. )
  7. import pandas._testing as tm
  8. class TestCopy:
  9. @pytest.mark.parametrize("deep", ["default", None, False, True])
  10. def test_copy(self, deep, using_copy_on_write, warn_copy_on_write):
  11. ser = Series(np.arange(10), dtype="float64")
  12. # default deep is True
  13. if deep == "default":
  14. ser2 = ser.copy()
  15. else:
  16. ser2 = ser.copy(deep=deep)
  17. if using_copy_on_write:
  18. # INFO(CoW) a shallow copy doesn't yet copy the data
  19. # but parent will not be modified (CoW)
  20. if deep is None or deep is False:
  21. assert np.may_share_memory(ser.values, ser2.values)
  22. else:
  23. assert not np.may_share_memory(ser.values, ser2.values)
  24. with tm.assert_cow_warning(warn_copy_on_write and deep is False):
  25. ser2[::2] = np.nan
  26. if deep is not False or using_copy_on_write:
  27. # Did not modify original Series
  28. assert np.isnan(ser2[0])
  29. assert not np.isnan(ser[0])
  30. else:
  31. # we DID modify the original Series
  32. assert np.isnan(ser2[0])
  33. assert np.isnan(ser[0])
  34. @pytest.mark.filterwarnings("ignore:Setting a value on a view:FutureWarning")
  35. @pytest.mark.parametrize("deep", ["default", None, False, True])
  36. def test_copy_tzaware(self, deep, using_copy_on_write):
  37. # GH#11794
  38. # copy of tz-aware
  39. expected = Series([Timestamp("2012/01/01", tz="UTC")])
  40. expected2 = Series([Timestamp("1999/01/01", tz="UTC")])
  41. ser = Series([Timestamp("2012/01/01", tz="UTC")])
  42. if deep == "default":
  43. ser2 = ser.copy()
  44. else:
  45. ser2 = ser.copy(deep=deep)
  46. if using_copy_on_write:
  47. # INFO(CoW) a shallow copy doesn't yet copy the data
  48. # but parent will not be modified (CoW)
  49. if deep is None or deep is False:
  50. assert np.may_share_memory(ser.values, ser2.values)
  51. else:
  52. assert not np.may_share_memory(ser.values, ser2.values)
  53. ser2[0] = Timestamp("1999/01/01", tz="UTC")
  54. # default deep is True
  55. if deep is not False or using_copy_on_write:
  56. # Did not modify original Series
  57. tm.assert_series_equal(ser2, expected2)
  58. tm.assert_series_equal(ser, expected)
  59. else:
  60. # we DID modify the original Series
  61. tm.assert_series_equal(ser2, expected2)
  62. tm.assert_series_equal(ser, expected2)
  63. def test_copy_name(self, datetime_series):
  64. result = datetime_series.copy()
  65. assert result.name == datetime_series.name
  66. def test_copy_index_name_checking(self, datetime_series):
  67. # don't want to be able to modify the index stored elsewhere after
  68. # making a copy
  69. datetime_series.index.name = None
  70. assert datetime_series.index.name is None
  71. assert datetime_series is datetime_series
  72. cp = datetime_series.copy()
  73. cp.index.name = "foo"
  74. assert datetime_series.index.name is None