test_series.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. # -*- coding: utf-8 -*-
  2. # pylint: disable-msg=E1101,W0612
  3. from distutils.version import LooseVersion
  4. from operator import methodcaller
  5. import numpy as np
  6. import pytest
  7. from pandas.compat import range
  8. import pandas.util._test_decorators as td
  9. import pandas as pd
  10. from pandas import MultiIndex, Series, date_range
  11. import pandas.util.testing as tm
  12. from pandas.util.testing import assert_almost_equal, assert_series_equal
  13. from .test_generic import Generic
  14. try:
  15. import xarray
  16. _XARRAY_INSTALLED = True
  17. except ImportError:
  18. _XARRAY_INSTALLED = False
  19. class TestSeries(Generic):
  20. _typ = Series
  21. _comparator = lambda self, x, y: assert_series_equal(x, y)
  22. def setup_method(self):
  23. self.ts = tm.makeTimeSeries() # Was at top level in test_series
  24. self.ts.name = 'ts'
  25. self.series = tm.makeStringSeries()
  26. self.series.name = 'series'
  27. def test_rename_mi(self):
  28. s = Series([11, 21, 31],
  29. index=MultiIndex.from_tuples(
  30. [("A", x) for x in ["a", "B", "c"]]))
  31. s.rename(str.lower)
  32. def test_set_axis_name(self):
  33. s = Series([1, 2, 3], index=['a', 'b', 'c'])
  34. funcs = ['rename_axis', '_set_axis_name']
  35. name = 'foo'
  36. for func in funcs:
  37. result = methodcaller(func, name)(s)
  38. assert s.index.name is None
  39. assert result.index.name == name
  40. def test_set_axis_name_mi(self):
  41. s = Series([11, 21, 31], index=MultiIndex.from_tuples(
  42. [("A", x) for x in ["a", "B", "c"]],
  43. names=['l1', 'l2'])
  44. )
  45. funcs = ['rename_axis', '_set_axis_name']
  46. for func in funcs:
  47. result = methodcaller(func, ['L1', 'L2'])(s)
  48. assert s.index.name is None
  49. assert s.index.names == ['l1', 'l2']
  50. assert result.index.name is None
  51. assert result.index.names, ['L1', 'L2']
  52. def test_set_axis_name_raises(self):
  53. s = pd.Series([1])
  54. with pytest.raises(ValueError):
  55. s._set_axis_name(name='a', axis=1)
  56. def test_get_numeric_data_preserve_dtype(self):
  57. # get the numeric data
  58. o = Series([1, 2, 3])
  59. result = o._get_numeric_data()
  60. self._compare(result, o)
  61. o = Series([1, '2', 3.])
  62. result = o._get_numeric_data()
  63. expected = Series([], dtype=object, index=pd.Index([], dtype=object))
  64. self._compare(result, expected)
  65. o = Series([True, False, True])
  66. result = o._get_numeric_data()
  67. self._compare(result, o)
  68. o = Series([True, False, True])
  69. result = o._get_bool_data()
  70. self._compare(result, o)
  71. o = Series(date_range('20130101', periods=3))
  72. result = o._get_numeric_data()
  73. expected = Series([], dtype='M8[ns]', index=pd.Index([], dtype=object))
  74. self._compare(result, expected)
  75. def test_nonzero_single_element(self):
  76. # allow single item via bool method
  77. s = Series([True])
  78. assert s.bool()
  79. s = Series([False])
  80. assert not s.bool()
  81. # single item nan to raise
  82. for s in [Series([np.nan]), Series([pd.NaT]), Series([True]),
  83. Series([False])]:
  84. pytest.raises(ValueError, lambda: bool(s))
  85. for s in [Series([np.nan]), Series([pd.NaT])]:
  86. pytest.raises(ValueError, lambda: s.bool())
  87. # multiple bool are still an error
  88. for s in [Series([True, True]), Series([False, False])]:
  89. pytest.raises(ValueError, lambda: bool(s))
  90. pytest.raises(ValueError, lambda: s.bool())
  91. # single non-bool are an error
  92. for s in [Series([1]), Series([0]), Series(['a']), Series([0.0])]:
  93. pytest.raises(ValueError, lambda: bool(s))
  94. pytest.raises(ValueError, lambda: s.bool())
  95. def test_metadata_propagation_indiv(self):
  96. # check that the metadata matches up on the resulting ops
  97. o = Series(range(3), range(3))
  98. o.name = 'foo'
  99. o2 = Series(range(3), range(3))
  100. o2.name = 'bar'
  101. result = o.T
  102. self.check_metadata(o, result)
  103. # resample
  104. ts = Series(np.random.rand(1000),
  105. index=date_range('20130101', periods=1000, freq='s'),
  106. name='foo')
  107. result = ts.resample('1T').mean()
  108. self.check_metadata(ts, result)
  109. result = ts.resample('1T').min()
  110. self.check_metadata(ts, result)
  111. result = ts.resample('1T').apply(lambda x: x.sum())
  112. self.check_metadata(ts, result)
  113. _metadata = Series._metadata
  114. _finalize = Series.__finalize__
  115. Series._metadata = ['name', 'filename']
  116. o.filename = 'foo'
  117. o2.filename = 'bar'
  118. def finalize(self, other, method=None, **kwargs):
  119. for name in self._metadata:
  120. if method == 'concat' and name == 'filename':
  121. value = '+'.join([getattr(
  122. o, name) for o in other.objs if getattr(o, name, None)
  123. ])
  124. object.__setattr__(self, name, value)
  125. else:
  126. object.__setattr__(self, name, getattr(other, name, None))
  127. return self
  128. Series.__finalize__ = finalize
  129. result = pd.concat([o, o2])
  130. assert result.filename == 'foo+bar'
  131. assert result.name is None
  132. # reset
  133. Series._metadata = _metadata
  134. Series.__finalize__ = _finalize
  135. @pytest.mark.skipif(not _XARRAY_INSTALLED or _XARRAY_INSTALLED and
  136. LooseVersion(xarray.__version__) <
  137. LooseVersion('0.10.0'),
  138. reason='xarray >= 0.10.0 required')
  139. @pytest.mark.parametrize(
  140. "index",
  141. ['FloatIndex', 'IntIndex',
  142. 'StringIndex', 'UnicodeIndex',
  143. 'DateIndex', 'PeriodIndex',
  144. 'TimedeltaIndex', 'CategoricalIndex'])
  145. def test_to_xarray_index_types(self, index):
  146. from xarray import DataArray
  147. index = getattr(tm, 'make{}'.format(index))
  148. s = Series(range(6), index=index(6))
  149. s.index.name = 'foo'
  150. result = s.to_xarray()
  151. repr(result)
  152. assert len(result) == 6
  153. assert len(result.coords) == 1
  154. assert_almost_equal(list(result.coords.keys()), ['foo'])
  155. assert isinstance(result, DataArray)
  156. # idempotency
  157. assert_series_equal(result.to_series(), s,
  158. check_index_type=False,
  159. check_categorical=True)
  160. @td.skip_if_no('xarray', min_version='0.7.0')
  161. def test_to_xarray(self):
  162. from xarray import DataArray
  163. s = Series([])
  164. s.index.name = 'foo'
  165. result = s.to_xarray()
  166. assert len(result) == 0
  167. assert len(result.coords) == 1
  168. assert_almost_equal(list(result.coords.keys()), ['foo'])
  169. assert isinstance(result, DataArray)
  170. s = Series(range(6))
  171. s.index.name = 'foo'
  172. s.index = pd.MultiIndex.from_product([['a', 'b'], range(3)],
  173. names=['one', 'two'])
  174. result = s.to_xarray()
  175. assert len(result) == 2
  176. assert_almost_equal(list(result.coords.keys()), ['one', 'two'])
  177. assert isinstance(result, DataArray)
  178. assert_series_equal(result.to_series(), s)
  179. def test_valid_deprecated(self):
  180. # GH18800
  181. with tm.assert_produces_warning(FutureWarning):
  182. pd.Series([]).valid()
  183. @pytest.mark.parametrize("s", [
  184. Series([np.arange(5)]),
  185. pd.date_range('1/1/2011', periods=24, freq='H'),
  186. pd.Series(range(5), index=pd.date_range("2017", periods=5))
  187. ])
  188. @pytest.mark.parametrize("shift_size", [0, 1, 2])
  189. def test_shift_always_copy(self, s, shift_size):
  190. # GH22397
  191. assert s.shift(shift_size) is not s
  192. @pytest.mark.parametrize("move_by_freq", [
  193. pd.Timedelta('1D'),
  194. pd.Timedelta('1M'),
  195. ])
  196. def test_datetime_shift_always_copy(self, move_by_freq):
  197. # GH22397
  198. s = pd.Series(range(5), index=pd.date_range("2017", periods=5))
  199. assert s.shift(freq=move_by_freq) is not s