test_arithmetic.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. # -*- coding: utf-8 -*-
  2. import numpy as np
  3. import pytest
  4. import pandas as pd
  5. from pandas import PeriodIndex, period_range
  6. import pandas.util.testing as tm
  7. class TestPeriodIndexArithmetic(object):
  8. # ---------------------------------------------------------------
  9. # PeriodIndex.shift is used by __add__ and __sub__
  10. def test_pi_shift_ndarray(self):
  11. idx = PeriodIndex(['2011-01', '2011-02', 'NaT', '2011-04'],
  12. freq='M', name='idx')
  13. result = idx.shift(np.array([1, 2, 3, 4]))
  14. expected = PeriodIndex(['2011-02', '2011-04', 'NaT', '2011-08'],
  15. freq='M', name='idx')
  16. tm.assert_index_equal(result, expected)
  17. result = idx.shift(np.array([1, -2, 3, -4]))
  18. expected = PeriodIndex(['2011-02', '2010-12', 'NaT', '2010-12'],
  19. freq='M', name='idx')
  20. tm.assert_index_equal(result, expected)
  21. def test_shift(self):
  22. pi1 = period_range(freq='A', start='1/1/2001', end='12/1/2009')
  23. pi2 = period_range(freq='A', start='1/1/2002', end='12/1/2010')
  24. tm.assert_index_equal(pi1.shift(0), pi1)
  25. assert len(pi1) == len(pi2)
  26. tm.assert_index_equal(pi1.shift(1), pi2)
  27. pi1 = period_range(freq='A', start='1/1/2001', end='12/1/2009')
  28. pi2 = period_range(freq='A', start='1/1/2000', end='12/1/2008')
  29. assert len(pi1) == len(pi2)
  30. tm.assert_index_equal(pi1.shift(-1), pi2)
  31. pi1 = period_range(freq='M', start='1/1/2001', end='12/1/2009')
  32. pi2 = period_range(freq='M', start='2/1/2001', end='1/1/2010')
  33. assert len(pi1) == len(pi2)
  34. tm.assert_index_equal(pi1.shift(1), pi2)
  35. pi1 = period_range(freq='M', start='1/1/2001', end='12/1/2009')
  36. pi2 = period_range(freq='M', start='12/1/2000', end='11/1/2009')
  37. assert len(pi1) == len(pi2)
  38. tm.assert_index_equal(pi1.shift(-1), pi2)
  39. pi1 = period_range(freq='D', start='1/1/2001', end='12/1/2009')
  40. pi2 = period_range(freq='D', start='1/2/2001', end='12/2/2009')
  41. assert len(pi1) == len(pi2)
  42. tm.assert_index_equal(pi1.shift(1), pi2)
  43. pi1 = period_range(freq='D', start='1/1/2001', end='12/1/2009')
  44. pi2 = period_range(freq='D', start='12/31/2000', end='11/30/2009')
  45. assert len(pi1) == len(pi2)
  46. tm.assert_index_equal(pi1.shift(-1), pi2)
  47. def test_shift_corner_cases(self):
  48. # GH#9903
  49. idx = pd.PeriodIndex([], name='xxx', freq='H')
  50. with pytest.raises(TypeError):
  51. # period shift doesn't accept freq
  52. idx.shift(1, freq='H')
  53. tm.assert_index_equal(idx.shift(0), idx)
  54. tm.assert_index_equal(idx.shift(3), idx)
  55. idx = pd.PeriodIndex(['2011-01-01 10:00', '2011-01-01 11:00'
  56. '2011-01-01 12:00'], name='xxx', freq='H')
  57. tm.assert_index_equal(idx.shift(0), idx)
  58. exp = pd.PeriodIndex(['2011-01-01 13:00', '2011-01-01 14:00'
  59. '2011-01-01 15:00'], name='xxx', freq='H')
  60. tm.assert_index_equal(idx.shift(3), exp)
  61. exp = pd.PeriodIndex(['2011-01-01 07:00', '2011-01-01 08:00'
  62. '2011-01-01 09:00'], name='xxx', freq='H')
  63. tm.assert_index_equal(idx.shift(-3), exp)
  64. def test_shift_nat(self):
  65. idx = PeriodIndex(['2011-01', '2011-02', 'NaT', '2011-04'],
  66. freq='M', name='idx')
  67. result = idx.shift(1)
  68. expected = PeriodIndex(['2011-02', '2011-03', 'NaT', '2011-05'],
  69. freq='M', name='idx')
  70. tm.assert_index_equal(result, expected)
  71. assert result.name == expected.name
  72. def test_shift_gh8083(self):
  73. # test shift for PeriodIndex
  74. # GH#8083
  75. drange = pd.period_range('20130101', periods=5, freq='D')
  76. result = drange.shift(1)
  77. expected = PeriodIndex(['2013-01-02', '2013-01-03', '2013-01-04',
  78. '2013-01-05', '2013-01-06'], freq='D')
  79. tm.assert_index_equal(result, expected)
  80. def test_shift_periods(self):
  81. # GH #22458 : argument 'n' was deprecated in favor of 'periods'
  82. idx = period_range(freq='A', start='1/1/2001', end='12/1/2009')
  83. tm.assert_index_equal(idx.shift(periods=0), idx)
  84. tm.assert_index_equal(idx.shift(0), idx)
  85. with tm.assert_produces_warning(FutureWarning,
  86. check_stacklevel=True):
  87. tm.assert_index_equal(idx.shift(n=0), idx)