test_external_block.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # -*- coding: utf-8 -*-
  2. # pylint: disable=W0102
  3. import numpy as np
  4. import pytest
  5. import pandas as pd
  6. from pandas.core.internals import BlockManager, SingleBlockManager
  7. from pandas.core.internals.blocks import Block, NonConsolidatableMixIn
  8. class CustomBlock(NonConsolidatableMixIn, Block):
  9. _holder = np.ndarray
  10. def formatting_values(self):
  11. return np.array(["Val: {}".format(i) for i in self.values])
  12. def concat_same_type(self, to_concat, placement=None):
  13. """
  14. Always concatenate disregarding self.ndim as the values are
  15. always 1D in this custom Block
  16. """
  17. values = np.concatenate([blk.values for blk in to_concat])
  18. return self.make_block_same_class(
  19. values, placement=placement or slice(0, len(values), 1))
  20. @pytest.fixture
  21. def df():
  22. df1 = pd.DataFrame({'a': [1, 2, 3]})
  23. blocks = df1._data.blocks
  24. values = np.arange(3, dtype='int64')
  25. custom_block = CustomBlock(values, placement=slice(1, 2))
  26. blocks = blocks + (custom_block,)
  27. block_manager = BlockManager(blocks, [pd.Index(['a', 'b']), df1.index])
  28. return pd.DataFrame(block_manager)
  29. def test_custom_repr():
  30. values = np.arange(3, dtype='int64')
  31. # series
  32. block = CustomBlock(values, placement=slice(0, 3))
  33. s = pd.Series(SingleBlockManager(block, pd.RangeIndex(3)))
  34. assert repr(s) == '0 Val: 0\n1 Val: 1\n2 Val: 2\ndtype: int64'
  35. # dataframe
  36. block = CustomBlock(values, placement=slice(0, 1))
  37. blk_mgr = BlockManager([block], [['col'], range(3)])
  38. df = pd.DataFrame(blk_mgr)
  39. assert repr(df) == ' col\n0 Val: 0\n1 Val: 1\n2 Val: 2'
  40. def test_concat_series():
  41. # GH17728
  42. values = np.arange(3, dtype='int64')
  43. block = CustomBlock(values, placement=slice(0, 3))
  44. s = pd.Series(block, pd.RangeIndex(3), fastpath=True)
  45. res = pd.concat([s, s])
  46. assert isinstance(res._data.blocks[0], CustomBlock)
  47. def test_concat_dataframe(df):
  48. # GH17728
  49. res = pd.concat([df, df])
  50. assert isinstance(res._data.blocks[1], CustomBlock)
  51. def test_concat_axis1(df):
  52. # GH17954
  53. df2 = pd.DataFrame({'c': [.1, .2, .3]})
  54. res = pd.concat([df, df2], axis=1)
  55. assert isinstance(res._data.blocks[1], CustomBlock)