constructors.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import numpy as np
  2. import pytest
  3. import pandas as pd
  4. from pandas.core.internals import ExtensionBlock
  5. from .base import BaseExtensionTests
  6. class BaseConstructorsTests(BaseExtensionTests):
  7. def test_from_sequence_from_cls(self, data):
  8. result = type(data)._from_sequence(data, dtype=data.dtype)
  9. self.assert_extension_array_equal(result, data)
  10. data = data[:0]
  11. result = type(data)._from_sequence(data, dtype=data.dtype)
  12. self.assert_extension_array_equal(result, data)
  13. def test_array_from_scalars(self, data):
  14. scalars = [data[0], data[1], data[2]]
  15. result = data._from_sequence(scalars)
  16. assert isinstance(result, type(data))
  17. def test_series_constructor(self, data):
  18. result = pd.Series(data)
  19. assert result.dtype == data.dtype
  20. assert len(result) == len(data)
  21. assert isinstance(result._data.blocks[0], ExtensionBlock)
  22. assert result._data.blocks[0].values is data
  23. # Series[EA] is unboxed / boxed correctly
  24. result2 = pd.Series(result)
  25. assert result2.dtype == data.dtype
  26. assert isinstance(result2._data.blocks[0], ExtensionBlock)
  27. @pytest.mark.parametrize("from_series", [True, False])
  28. def test_dataframe_constructor_from_dict(self, data, from_series):
  29. if from_series:
  30. data = pd.Series(data)
  31. result = pd.DataFrame({"A": data})
  32. assert result.dtypes['A'] == data.dtype
  33. assert result.shape == (len(data), 1)
  34. assert isinstance(result._data.blocks[0], ExtensionBlock)
  35. def test_dataframe_from_series(self, data):
  36. result = pd.DataFrame(pd.Series(data))
  37. assert result.dtypes[0] == data.dtype
  38. assert result.shape == (len(data), 1)
  39. assert isinstance(result._data.blocks[0], ExtensionBlock)
  40. def test_series_given_mismatched_index_raises(self, data):
  41. msg = 'Length of passed values is 3, index implies 5'
  42. with pytest.raises(ValueError, match=msg):
  43. pd.Series(data[:3], index=[0, 1, 2, 3, 4])
  44. def test_from_dtype(self, data):
  45. # construct from our dtype & string dtype
  46. dtype = data.dtype
  47. expected = pd.Series(data)
  48. result = pd.Series(list(data), dtype=dtype)
  49. self.assert_series_equal(result, expected)
  50. result = pd.Series(list(data), dtype=str(dtype))
  51. self.assert_series_equal(result, expected)
  52. def test_pandas_array(self, data):
  53. # pd.array(extension_array) should be idempotent...
  54. result = pd.array(data)
  55. self.assert_extension_array_equal(result, data)
  56. def test_pandas_array_dtype(self, data):
  57. # ... but specifying dtype will override idempotency
  58. result = pd.array(data, dtype=np.dtype(object))
  59. expected = pd.arrays.PandasArray(np.asarray(data, dtype=object))
  60. self.assert_equal(result, expected)