test_copy.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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):
  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. ser2[::2] = np.NaN
  25. if deep is not False or using_copy_on_write:
  26. # Did not modify original Series
  27. assert np.isnan(ser2[0])
  28. assert not np.isnan(ser[0])
  29. else:
  30. # we DID modify the original Series
  31. assert np.isnan(ser2[0])
  32. assert np.isnan(ser[0])
  33. @pytest.mark.parametrize("deep", ["default", None, False, True])
  34. def test_copy_tzaware(self, deep, using_copy_on_write):
  35. # GH#11794
  36. # copy of tz-aware
  37. expected = Series([Timestamp("2012/01/01", tz="UTC")])
  38. expected2 = Series([Timestamp("1999/01/01", tz="UTC")])
  39. ser = Series([Timestamp("2012/01/01", tz="UTC")])
  40. if deep == "default":
  41. ser2 = ser.copy()
  42. else:
  43. ser2 = ser.copy(deep=deep)
  44. if using_copy_on_write:
  45. # INFO(CoW) a shallow copy doesn't yet copy the data
  46. # but parent will not be modified (CoW)
  47. if deep is None or deep is False:
  48. assert np.may_share_memory(ser.values, ser2.values)
  49. else:
  50. assert not np.may_share_memory(ser.values, ser2.values)
  51. ser2[0] = Timestamp("1999/01/01", tz="UTC")
  52. # default deep is True
  53. if deep is not False or using_copy_on_write:
  54. # Did not modify original Series
  55. tm.assert_series_equal(ser2, expected2)
  56. tm.assert_series_equal(ser, expected)
  57. else:
  58. # we DID modify the original Series
  59. tm.assert_series_equal(ser2, expected2)
  60. tm.assert_series_equal(ser, expected2)
  61. def test_copy_name(self, datetime_series):
  62. result = datetime_series.copy()
  63. assert result.name == datetime_series.name
  64. def test_copy_index_name_checking(self, datetime_series):
  65. # don't want to be able to modify the index stored elsewhere after
  66. # making a copy
  67. datetime_series.index.name = None
  68. assert datetime_series.index.name is None
  69. assert datetime_series is datetime_series
  70. cp = datetime_series.copy()
  71. cp.index.name = "foo"
  72. assert datetime_series.index.name is None