From 37151a9b5cabdf473a6bbc4f86645bc55ee7a239 Mon Sep 17 00:00:00 2001 From: Alix Damman Date: Tue, 20 Feb 2018 14:24:45 +0100 Subject: [PATCH 1/2] updated read/write unittests --> use ndtest to generate data: - updated CSV test files + test.xlsx - updated unittests test_read_csv, test_read_excel_pandas, test_read_excel_xlwings and test_to_csv --- larray/tests/data/test.xlsx | Bin 14243 -> 13436 bytes larray/tests/data/test1d.csv | 2 +- larray/tests/data/test2d.csv | 7 +- larray/tests/data/test2d_classic.csv | 10 +- larray/tests/data/test3d.csv | 16 +- larray/tests/data/test5d.csv | 41 ----- larray/tests/data/testint_labels.csv | 10 ++ larray/tests/data/testmissing_values.csv | 5 + larray/tests/test_array.py | 200 +++++++++-------------- 9 files changed, 106 insertions(+), 185 deletions(-) delete mode 100644 larray/tests/data/test5d.csv create mode 100644 larray/tests/data/testint_labels.csv create mode 100644 larray/tests/data/testmissing_values.csv diff --git a/larray/tests/data/test.xlsx b/larray/tests/data/test.xlsx index 940c0700d2c54e8e54eae209f096fd24bb2d6b23..8a957d23cfacf8efc385f1e11db74f0af824f542 100644 GIT binary patch delta 8447 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 EAMD4WX#fBK delta 9335 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 diff --git a/larray/tests/data/test1d.csv b/larray/tests/data/test1d.csv index b7f741243..16be91619 100644 --- a/larray/tests/data/test1d.csv +++ b/larray/tests/data/test1d.csv @@ -1,2 +1,2 @@ -time,2007,2010,2013 +a,a0,a1,a2 ,0,1,2 diff --git a/larray/tests/data/test2d.csv b/larray/tests/data/test2d.csv index 99fb4a754..cd6ae8d37 100644 --- a/larray/tests/data/test2d.csv +++ b/larray/tests/data/test2d.csv @@ -1,3 +1,4 @@ -a\b,0,1,2 -0,0,1,2 -1,3,4,5 +a\b,b0,b1 +1,0,1 +2,2,3 +3,4,5 diff --git a/larray/tests/data/test2d_classic.csv b/larray/tests/data/test2d_classic.csv index a007c19a8..a5b63f948 100644 --- a/larray/tests/data/test2d_classic.csv +++ b/larray/tests/data/test2d_classic.csv @@ -1,6 +1,4 @@ -age,2007,2010,2013 -0,3722,3395,3347 -1,338,316,323 -2,2878,2791,2822 -3,1121,1037,976 -4,4073,4161,4429 \ No newline at end of file +a,b0,b1,b2 +a0,0,1,2 +a1,3,4,5 +a2,6,7,8 \ No newline at end of file diff --git a/larray/tests/data/test3d.csv b/larray/tests/data/test3d.csv index 993846f6d..7816f5a64 100644 --- a/larray/tests/data/test3d.csv +++ b/larray/tests/data/test3d.csv @@ -1,9 +1,7 @@ -age,sex\time,2015,2016,2017 -0,F,0.5,1.5,2.5 -0,M,3.5,4.5,5.5 -1,F,6.5,7.5,8.5 -1,M,9.5,10.5,11.5 -2,F,12.5,13.5,14.5 -2,M,15.5,16.5,17.5 -3,F,18.5,19.5,20.5 -3,M,21.5,22.5,23.5 +a,b\c,c0,c1,c2 +1,b0,0,1,2 +1,b1,3,4,5 +2,b0,6,7,8 +2,b1,9,10,11 +3,b0,12,13,14 +3,b1,15,16,17 diff --git a/larray/tests/data/test5d.csv b/larray/tests/data/test5d.csv deleted file mode 100644 index 98777ae04..000000000 --- a/larray/tests/data/test5d.csv +++ /dev/null @@ -1,41 +0,0 @@ -arr,age,sex,nat\time,2007,2010,2013 -1,0,F,1,3722,3395,3347 -1,0,F,2,338,316,323 -1,0,H,1,2878,2791,2822 -1,0,H,2,1121,1037,976 -1,1,F,1,4073,4161,4429 -1,1,F,2,1561,1463,1467 -1,1,H,1,3507,3741,3366 -1,1,H,2,2052,2052,2118 -1,2,F,1,4807,4868,4852 -1,2,F,2,3785,3508,3172 -1,2,H,1,4464,4692,4839 -1,2,H,2,95,100,103 -1,3,F,1,1135,1023,928 -1,3,F,2,3121,3180,2900 -1,3,H,1,3850,4118,3716 -1,3,H,2,4174,4131,4290 -1,4,F,1,4072,3775,3781 -1,4,F,2,4392,4305,4215 -1,4,H,1,1657,1492,1360 -1,4,H,2,916,973,895 -2,0,F,1,141,135,141 -2,0,F,2,3713,3952,3895 -2,0,H,1,1616,1499,1556 -2,0,H,2,1895,2029,1946 -2,1,F,1,3272,3501,3584 -2,1,F,2,793,725,679 -2,1,H,1,4766,5007,5242 -2,1,H,2,2943,2670,2525 -2,2,F,1,3594,3922,4019 -2,2,F,2,4150,3813,3576 -2,2,H,1,1264,1244,1333 -2,2,H,2,1922,1970,1972 -2,3,F,1,380,400,387 -2,3,F,2,3860,3787,3431 -2,3,H,1,2962,3112,2962 -2,3,H,2,2679,2599,2490 -2,4,F,1,4159,4210,4461 -2,4,F,2,28,27,28 -2,4,H,1,2887,2972,2837 -2,4,H,2,2712,2827,2806 diff --git a/larray/tests/data/testint_labels.csv b/larray/tests/data/testint_labels.csv new file mode 100644 index 000000000..56d877e39 --- /dev/null +++ b/larray/tests/data/testint_labels.csv @@ -0,0 +1,10 @@ +a,b\c,0,1,2 +0,0,0,1,2 +0,1,3,4,5 +0,2,6,7,8 +1,0,9,10,11 +1,1,12,13,14 +1,2,15,16,17 +2,0,18,19,20 +2,1,21,22,23 +2,2,24,25,26 diff --git a/larray/tests/data/testmissing_values.csv b/larray/tests/data/testmissing_values.csv new file mode 100644 index 000000000..f05c14ea9 --- /dev/null +++ b/larray/tests/data/testmissing_values.csv @@ -0,0 +1,5 @@ +a,b\c,c0,c1,c2 +1,b0,0,1,2 +1,b1,3,4,5 +2,b1,9,10,11 +3,b0,12,13,14 diff --git a/larray/tests/test_array.py b/larray/tests/test_array.py index c0199d9b8..92112aa3f 100644 --- a/larray/tests/test_array.py +++ b/larray/tests/test_array.py @@ -88,6 +88,15 @@ def setUp(self): self.small_data = np.arange(30).reshape(2, 15) self.small = LArray(self.small_data, axes=(self.sex, self.lipro), title=self.small_title) + self.io_1d = ndtest(3) + self.io_2d = ndtest("a=1..3; b=b0,b1") + self.io_3d = ndtest("a=1..3; b=b0,b1; c=c0..c2") + self.io_int_labels = ndtest("a=0..2; b=0..2; c=0..2") + self.io_unsorted = ndtest("a=3..1; b=b1,b0; c=c2..c0") + self.io_missing_values = ndtest("a=1..3; b=b0,b1; c=c0..c2", dtype=float) + self.io_missing_values[2, 'b0'] = np.nan + self.io_missing_values[3, 'b1'] = np.nan + @pytest.fixture(autouse=True) def setup(self, tmpdir): self.tmpdir = tmpdir.strpath @@ -2590,27 +2599,19 @@ def test_from_string(self): def test_read_csv(self): res = read_csv(inputpath('test1d.csv')) - assert_array_equal(res, ndtest('time=2007,2010,2013')) + assert_array_equal(res, self.io_1d) res = read_csv(inputpath('test2d.csv')) - assert_array_equal(res, ndtest('a=0,1;b=0,1,2')) + assert_array_equal(res, self.io_2d) res = read_csv(inputpath('test3d.csv')) - expected = ndtest('age=0..3;sex=F,M;time=2015..2017') + 0.5 - assert_array_equal(res, expected) + assert_array_equal(res, self.io_3d) - la = read_csv(inputpath('test5d.csv')) - self.assertEqual(la.ndim, 5) - self.assertEqual(la.shape, (2, 5, 2, 2, 3)) - self.assertEqual(la.axes.names, ['arr', 'age', 'sex', 'nat', 'time']) - assert_array_equal(la[X.arr[1], 0, 'F', X.nat[1], :], - [3722, 3395, 3347]) + res = read_csv(inputpath('testint_labels.csv')) + assert_array_equal(res, self.io_int_labels) - la = read_csv(inputpath('test2d_classic.csv')) - self.assertEqual(la.ndim, 2) - self.assertEqual(la.shape, (5, 3)) - self.assertEqual(la.axes.names, ['age', None]) - assert_array_equal(la[0, :], [3722, 3395, 3347]) + res = read_csv(inputpath('test2d_classic.csv')) + assert_array_equal(res, ndtest("a=a0..a2; b0..b2")) la = read_csv(inputpath('test1d_liam2.csv'), dialect='liam2') self.assertEqual(la.ndim, 1) @@ -2622,8 +2623,11 @@ def test_read_csv(self): self.assertEqual(la.ndim, 5) self.assertEqual(la.shape, (2, 5, 2, 2, 3)) self.assertEqual(la.axes.names, ['arr', 'age', 'sex', 'nat', 'time']) - assert_array_equal(la[X.arr[1], 0, 'F', X.nat[1], :], - [3722, 3395, 3347]) + assert_array_equal(la[X.arr[1], 0, 'F', X.nat[1], :], [3722, 3395, 3347]) + + # missing values + res = read_csv(inputpath('testmissing_values.csv')) + assert_array_nan_equal(res, self.io_missing_values) # test StringIO res = read_csv(StringIO('a,1,2\n,0,1\n')) @@ -2644,53 +2648,32 @@ def test_read_eurostat(self): @pytest.mark.skipif(xw is None, reason="xlwings is not available") def test_read_excel_xlwings(self): - la = read_excel(inputpath('test.xlsx'), '1d') - self.assertEqual(la.ndim, 1) - self.assertEqual(la.shape, (3,)) - self.assertEqual(la.axes.names, ['time']) - assert_array_equal(la, [3722, 3395, 3347]) + arr = read_excel(inputpath('test.xlsx'), '1d') + assert_array_equal(arr, self.io_1d) - la = read_excel(inputpath('test.xlsx'), '2d') - self.assertEqual(la.ndim, 2) - self.assertEqual(la.shape, (5, 3)) - self.assertEqual(la.axes.names, ['age', 'time']) - assert_array_equal(la[0, :], [3722, 3395, 3347]) + arr = read_excel(inputpath('test.xlsx'), '2d') + assert_array_equal(arr, self.io_2d) - la = read_excel(inputpath('test.xlsx'), '3d') - self.assertEqual(la.ndim, 3) - self.assertEqual(la.shape, (5, 2, 3)) - self.assertEqual(la.axes.names, ['age', 'sex', 'time']) - assert_array_equal(la[0, 'F', :], [3722, 3395, 3347]) + arr = read_excel(inputpath('test.xlsx'), '3d') + assert_array_equal(arr, self.io_3d) - la = read_excel(inputpath('test.xlsx'), '5d') - self.assertEqual(la.ndim, 5) - self.assertEqual(la.shape, (2, 5, 2, 2, 3)) - self.assertEqual(la.axes.names, ['arr', 'age', 'sex', 'nat', 'time']) - assert_array_equal(la[X.arr[1], 0, 'F', X.nat[1], :], - [3722, 3395, 3347]) + arr = read_excel(inputpath('test.xlsx'), 'int_labels') + assert_array_equal(arr, self.io_int_labels) - la = read_excel(inputpath('test.xlsx'), '2d_classic') - self.assertEqual(la.ndim, 2) - self.assertEqual(la.shape, (5, 3)) - self.assertEqual(la.axes.names, ['age', None]) - assert_array_equal(la[0, :], [3722, 3395, 3347]) + arr = read_excel(inputpath('test.xlsx'), '2d_classic') + assert_array_equal(arr, ndtest("a=a0..a2; b0..b2")) # passing a Group as sheet arg axis = Axis('dim=1d,2d,3d,5d') - la = read_excel(inputpath('test.xlsx'), axis['1d']) - self.assertEqual(la.ndim, 1) - self.assertEqual(la.shape, (3,)) - self.assertEqual(la.axes.names, ['time']) - assert_array_equal(la, [3722, 3395, 3347]) + arr = read_excel(inputpath('test.xlsx'), axis['1d']) + assert_array_equal(arr, ndtest(3)) - # fill_value argument - la = read_excel(inputpath('test.xlsx'), 'missing_values', fill_value=42) - assert la.ndim == 3 - assert la.shape == (5, 2, 3) - assert la.axes.names == ['age', 'sex', 'time'] - assert_array_equal(la[1, 'H', :], [42, 42, 42]) - assert_array_equal(la[4, 'F', :], [42, 42, 42]) + # missing rows + fill_value argument + arr = read_excel(inputpath('test.xlsx'), 'missing_values', fill_value=42) + expected = self.io_missing_values.copy() + expected[isnan(expected)] = 42 + assert_array_equal(arr, expected) # invalid keyword argument with self.assertRaisesRegexp(TypeError, "'dtype' is an invalid keyword argument for this function when using " @@ -2714,64 +2697,38 @@ def test_read_excel_xlwings(self): assert_array_equal(bad4, good2) def test_read_excel_pandas(self): - la = read_excel(inputpath('test.xlsx'), '1d', engine='xlrd') - self.assertEqual(la.ndim, 1) - self.assertEqual(la.shape, (3,)) - self.assertEqual(la.axes.names, ['time']) - assert_array_equal(la, [3722, 3395, 3347]) + arr = read_excel(inputpath('test.xlsx'), '1d', engine='xlrd') + assert_array_equal(arr, self.io_1d) - la = read_excel(inputpath('test.xlsx'), '2d', nb_axes=2, engine='xlrd') - self.assertEqual(la.ndim, 2) - self.assertEqual(la.shape, (5, 3)) - self.assertEqual(la.axes.names, ['age', 'time']) - assert_array_equal(la[0, :], [3722, 3395, 3347]) - - la = read_excel(inputpath('test.xlsx'), '2d', engine='xlrd') - self.assertEqual(la.ndim, 2) - self.assertEqual(la.shape, (5, 3)) - self.assertEqual(la.axes.names, ['age', 'time']) - assert_array_equal(la[0, :], [3722, 3395, 3347]) - - la = read_excel(inputpath('test.xlsx'), '3d', index_col=[0, 1], engine='xlrd') - self.assertEqual(la.ndim, 3) - self.assertEqual(la.shape, (5, 2, 3)) - self.assertEqual(la.axes.names, ['age', 'sex', 'time']) - assert_array_equal(la[0, 'F', :], [3722, 3395, 3347]) + arr = read_excel(inputpath('test.xlsx'), '2d', nb_axes=2, engine='xlrd') + assert_array_equal(arr, self.io_2d) - la = read_excel(inputpath('test.xlsx'), '3d', engine='xlrd') - self.assertEqual(la.ndim, 3) - self.assertEqual(la.shape, (5, 2, 3)) - self.assertEqual(la.axes.names, ['age', 'sex', 'time']) - assert_array_equal(la[0, 'F', :], [3722, 3395, 3347]) + arr = read_excel(inputpath('test.xlsx'), '2d', engine='xlrd') + assert_array_equal(arr, self.io_2d) - la = read_excel(inputpath('test.xlsx'), '5d', nb_axes=5, engine='xlrd') - self.assertEqual(la.ndim, 5) - self.assertEqual(la.shape, (2, 5, 2, 2, 3)) - self.assertEqual(la.axes.names, ['arr', 'age', 'sex', 'nat', 'time']) - assert_array_equal(la[X.arr[1], 0, 'F', X.nat[1], :], - [3722, 3395, 3347]) + arr = read_excel(inputpath('test.xlsx'), '3d', index_col=[0, 1], engine='xlrd') + assert_array_equal(arr, self.io_3d) - la = read_excel(inputpath('test.xlsx'), '5d', engine='xlrd') - self.assertEqual(la.ndim, 5) - self.assertEqual(la.shape, (2, 5, 2, 2, 3)) - self.assertEqual(la.axes.names, ['arr', 'age', 'sex', 'nat', 'time']) - assert_array_equal(la[X.arr[1], 0, 'F', X.nat[1], :], - [3722, 3395, 3347]) + arr = read_excel(inputpath('test.xlsx'), '3d', engine='xlrd') + assert_array_equal(arr, self.io_3d) + + arr = read_excel(inputpath('test.xlsx'), 'int_labels', engine='xlrd') + assert_array_equal(arr, self.io_int_labels) - la = read_excel(inputpath('test.xlsx'), '2d_classic', engine='xlrd') - self.assertEqual(la.ndim, 2) - self.assertEqual(la.shape, (5, 3)) - self.assertEqual(la.axes.names, ['age', None]) - assert_array_equal(la[0, :], [3722, 3395, 3347]) + arr = read_excel(inputpath('test.xlsx'), '2d_classic', engine='xlrd') + assert_array_equal(arr, ndtest("a=a0..a2; b0..b2")) # passing a Group as sheet arg axis = Axis('dim=1d,2d,3d,5d') - la = read_excel(inputpath('test.xlsx'), axis['1d'], engine='xlrd') - self.assertEqual(la.ndim, 1) - self.assertEqual(la.shape, (3,)) - self.assertEqual(la.axes.names, ['time']) - assert_array_equal(la, [3722, 3395, 3347]) + arr = read_excel(inputpath('test.xlsx'), axis['1d'], engine='xlrd') + assert_array_equal(arr, ndtest(3)) + + # missing rows + fill_value argument + arr = read_excel(inputpath('test.xlsx'), 'missing_values', fill_value=42, engine='xlrd') + expected = self.io_missing_values.copy() + expected[isnan(expected)] = 42 + assert_array_equal(arr, expected) # Excel sheet with blank cells on right/bottom border of the array to read fpath = inputpath('test_blank_cells.xlsx') @@ -3172,31 +3129,26 @@ def test_from_frame(self): assert_array_equal(la[0, 'F', :], [3722, 3395, 3347]) def test_to_csv(self): - la = read_csv(inputpath('test5d.csv')) - self.assertEqual(la.ndim, 5) - self.assertEqual(la.shape, (2, 5, 2, 2, 3)) - self.assertEqual(la.axes.names, ['arr', 'age', 'sex', 'nat', 'time']) - assert_array_equal(la[X.arr[1], 0, 'F', X.nat[1], :], - [3722, 3395, 3347]) + arr = self.io_3d.copy() - la.to_csv(self.tmp_path('out.csv')) - result = ['arr,age,sex,nat\\time,2007,2010,2013\n', - '1,0,F,1,3722,3395,3347\n', - '1,0,F,2,338,316,323\n'] + arr.to_csv(self.tmp_path('out.csv')) + result = ['a,b\\c,c0,c1,c2\n', + '1,b0,0,1,2\n', + '1,b1,3,4,5\n'] with open(self.tmp_path('out.csv')) as f: self.assertEqual(f.readlines()[:3], result) # stacked data (one column containing all the values and another column listing the context of the value) - la.to_csv(self.tmp_path('out.csv'), wide=False) - result = ['arr,age,sex,nat,time,value\n', - '1,0,F,1,2007,3722\n', - '1,0,F,1,2010,3395\n'] + arr.to_csv(self.tmp_path('out.csv'), wide=False) + result = ['a,b,c,value\n', + '1,b0,c0,0\n', + '1,b0,c1,1\n'] with open(self.tmp_path('out.csv')) as f: self.assertEqual(f.readlines()[:3], result) - la = ndtest([Axis('time=2015..2017')]) - la.to_csv(self.tmp_path('test_out1d.csv')) - result = ['time,2015,2016,2017\n', + arr = self.io_1d.copy() + arr.to_csv(self.tmp_path('test_out1d.csv')) + result = ['a,a0,a1,a2\n', ',0,1,2\n'] with open(self.tmp_path('test_out1d.csv')) as f: self.assertEqual(f.readlines(), result) @@ -3521,11 +3473,9 @@ def test_open_excel(self): assert_array_equal(res.axes[2].labels, a3.axes[2].labels) with open_excel(inputpath('test.xlsx')) as wb: + expected = ndtest("a=a0..a2; b0..b2") res = wb['2d_classic'].load() - assert res.ndim == 2 - assert res.shape == (5, 3) - assert res.axes.names == ['age', None] - assert_array_equal(res[0, :], [3722, 3395, 3347]) + assert_array_equal(res, expected) # 3) without headers # ================== From 7964815a0d86a0adcf328b45b20cbeab7c4f7858 Mon Sep 17 00:00:00 2001 From: Alix Damman Date: Fri, 16 Feb 2018 15:37:29 +0100 Subject: [PATCH 2/2] fix #574 : added argument 'wide' to read_csv, read_excel, from_lists and from_strings functions + and updated df_aslarray so as to be able to load arrays stored in narrow format --- doc/source/changes/version_0_28.rst.inc | 11 + larray/inout/array.py | 200 +++++++++++++----- larray/inout/excel.py | 8 +- larray/tests/data/test1d_narrow.csv | 4 + larray/tests/data/test2d_narrow.csv | 7 + larray/tests/data/test3d_narrow.csv | 19 ++ larray/tests/data/test_narrow.xlsx | Bin 0 -> 12427 bytes .../tests/data/testmissing_values_narrow.csv | 12 ++ larray/tests/data/testunsorted_narrow.csv | 19 ++ larray/tests/test_array.py | 84 +++++++- 10 files changed, 305 insertions(+), 59 deletions(-) create mode 100644 larray/tests/data/test1d_narrow.csv create mode 100644 larray/tests/data/test2d_narrow.csv create mode 100644 larray/tests/data/test3d_narrow.csv create mode 100644 larray/tests/data/test_narrow.xlsx create mode 100644 larray/tests/data/testmissing_values_narrow.csv create mode 100644 larray/tests/data/testunsorted_narrow.csv diff --git a/doc/source/changes/version_0_28.rst.inc b/doc/source/changes/version_0_28.rst.inc index bfa76bbf2..fa7907f49 100644 --- a/doc/source/changes/version_0_28.rst.inc +++ b/doc/source/changes/version_0_28.rst.inc @@ -289,6 +289,17 @@ Miscellaneous improvements Argument `transpose` has a different purpose than `wide` and is mainly useful to allow multiple axes as header when exporting arrays with more than 2 dimensions. Closes :issue:`575` and :issue:`371`. +* added argument `wide` to `read_csv` and `read_excel` functions. If False, the array to be loaded is assumed to + be stored in "narrow" format: + + >>> # assuming the array was saved using command: arr.to_excel('my_file.xlsx', wide=False) + >>> read_excel('my_file.xlsx', wide=False) + a\b b0 b1 b2 + a0 0 1 2 + a1 3 4 5 + + Closes :issue:`574`. + * added argument `name` to `to_series` method allowing to set a name to the Pandas Series returned by the method. * added argument `value_name` to `to_csv` and `to_excel` allowing to change the default name ('value') to diff --git a/larray/inout/array.py b/larray/inout/array.py index 052370732..a609fecdb 100644 --- a/larray/inout/array.py +++ b/larray/inout/array.py @@ -186,7 +186,7 @@ def from_frame(df, sort_rows=False, sort_columns=False, parse_header=False, unfo return LArray(data, axes) -def df_aslarray(df, sort_rows=False, sort_columns=False, raw=False, parse_header=True, **kwargs): +def df_aslarray(df, sort_rows=False, sort_columns=False, raw=False, parse_header=True, wide=True, **kwargs): """ Prepare Pandas DataFrame and then convert it into LArray. @@ -205,6 +205,10 @@ def df_aslarray(df, sort_rows=False, sort_columns=False, raw=False, parse_header parse_header : bool, optional Whether or not to parse columns labels. Pandas treats column labels as strings. If True, column labels are converted into int, float or boolean when possible. Defaults to True. + wide : bool, optional + Whether or not to assume the array is stored in "wide" format. + If False, the array is assumed to be stored in "narrow" format: one column per axis plus one value column. + Defaults to True. Returns ------- @@ -218,19 +222,37 @@ def df_aslarray(df, sort_rows=False, sort_columns=False, raw=False, parse_header # irrespective of the actual data dimensionality if raw: columns = df.columns.values.tolist() - try: - # take the first column which contains '\' - pos_last = next(i for i, v in enumerate(columns) if isinstance(v, basestring) and '\\' in v) - except StopIteration: - # we assume first column will not contain data - pos_last = 0 - - # This is required to handle int column names (otherwise we can simply use column positions in set_index). - # This is NOT the same as df.columns[list(range(...))] ! - index_columns = [df.columns[i] for i in range(pos_last + 1)] - # TODO: we should pass a flag to df_aslarray so that we can use inplace=True here - # df.set_index(index_columns, inplace=True) - df = df.set_index(index_columns) + if wide: + try: + # take the first column which contains '\' + pos_last = next(i for i, v in enumerate(columns) if isinstance(v, basestring) and '\\' in v) + except StopIteration: + # we assume first column will not contain data + pos_last = 0 + + # This is required to handle int column names (otherwise we can simply use column positions in set_index). + # This is NOT the same as df.columns[list(range(...))] ! + index_columns = [df.columns[i] for i in range(pos_last + 1)] + df.set_index(index_columns, inplace=True) + else: + index_columns = [df.columns[i] for i in range(len(df.columns) - 1)] + df.set_index(index_columns, inplace=True) + series = df[df.columns[-1]] + if isinstance(series.index, pd.core.index.MultiIndex): + fill_value = kwargs.get('fill_value', np.nan) + # TODO: use argument sort=False when it will be available + # (see https://github.com/pandas-dev/pandas/issues/15105) + df = series.unstack(level=-1, fill_value=fill_value) + # pandas (un)stack and pivot(_table) methods return a Dataframe/Series with sorted index and columns + labels = df_labels(series, sort=False) + index = pd.MultiIndex.from_tuples(list(product(*labels[:-1])), names=series.index.names[:-1]) + columns = labels[-1] + df = df.reindex(index=index, columns=columns, fill_value=fill_value) + else: + series.name = series.index.name + if sort_rows: + raise ValueError('sort_rows=True is not valid for 1D arrays. Please use sort_columns instead.') + return from_series(series, sort_rows=sort_columns) # handle 1D if len(df) == 1 and (pd.isnull(df.index.values[0]) or @@ -249,9 +271,24 @@ def df_aslarray(df, sort_rows=False, sort_columns=False, raw=False, parse_header unfold_last_axis_name=unfold_last_axis_name, **kwargs) +def _get_index_col(nb_axes=None, index_col=None, wide=True): + if not wide: + if nb_axes is not None or index_col is not None: + raise ValueError("`nb_axes` or `index_col` argument cannot be used when `wide` argument is False") + + if nb_axes is not None and index_col is not None: + raise ValueError("cannot specify both `nb_axes` and `index_col`") + elif nb_axes is not None: + index_col = list(range(nb_axes - 1)) + elif isinstance(index_col, int): + index_col = [index_col] + + return index_col + + @deprecate_kwarg('nb_index', 'nb_axes', arg_converter=lambda x: x + 1) def read_csv(filepath_or_buffer, nb_axes=None, index_col=None, sep=',', headersep=None, fill_value=np.nan, - na=np.nan, sort_rows=False, sort_columns=False, dialect='larray', **kwargs): + na=np.nan, sort_rows=False, sort_columns=False, wide=True, dialect='larray', **kwargs): """ Reads csv file and returns an array with the contents. @@ -288,6 +325,10 @@ def read_csv(filepath_or_buffer, nb_axes=None, index_col=None, sep=',', headerse sort_columns : bool, optional Whether or not to sort the columns alphabetically (sorting is more efficient than not sorting). Defaults to False. + wide : bool, optional + Whether or not to assume the array is stored in "wide" format. + If False, the array is assumed to be stored in "narrow" format: one column per axis plus one value column. + Defaults to True. dialect : 'classic' | 'larray' | 'liam2', optional Name of dialect. Defaults to 'larray'. **kwargs @@ -298,22 +339,54 @@ def read_csv(filepath_or_buffer, nb_axes=None, index_col=None, sep=',', headerse Examples -------- - >>> from larray import ndrange >>> tmpdir = getfixture('tmpdir') >>> fname = os.path.join(tmpdir.strpath, 'test.csv') >>> a = ndtest('nat=BE,FO;sex=M,F') - + >>> a + nat\\sex M F + BE 0 1 + FO 2 3 >>> a.to_csv(fname) + >>> with open(fname) as f: + ... print(f.read().strip()) + nat\\sex,M,F + BE,0,1 + FO,2,3 >>> read_csv(fname) nat\\sex M F BE 0 1 FO 2 3 + + Sort columns + >>> read_csv(fname, sort_columns=True) nat\\sex F M BE 1 0 FO 3 2 - >>> fname = 'no_axis_name.csv' + + Read array saved in "narrow" format (wide=False) + + >>> a.to_csv(fname, wide=False) + >>> with open(fname) as f: + ... print(f.read().strip()) + nat,sex,value + BE,M,0 + BE,F,1 + FO,M,2 + FO,F,3 + >>> read_csv(fname, wide=False) + nat\\sex M F + BE 0 1 + FO 2 3 + + Specify the number of axes of the output array (useful when the name of the last axis is implicit) + >>> a.to_csv(fname, dialect='classic') + >>> with open(fname) as f: + ... print(f.read().strip()) + nat,M,F + BE,0,1 + FO,2,3 >>> read_csv(fname, nb_axes=2) nat\\{1} M F BE 0 1 @@ -341,12 +414,7 @@ def read_csv(filepath_or_buffer, nb_axes=None, index_col=None, sep=',', headerse kwargs['header'] = 1 kwargs['comment'] = '#' - if nb_axes is not None and index_col is not None: - raise ValueError("cannot specify both nb_axes and index_col") - elif nb_axes is not None: - index_col = list(range(nb_axes - 1)) - elif isinstance(index_col, int): - index_col = [index_col] + index_col = _get_index_col(nb_axes, index_col, wide) if headersep is not None: if index_col is None: @@ -369,7 +437,7 @@ def read_csv(filepath_or_buffer, nb_axes=None, index_col=None, sep=',', headerse df.index.names = combined_axes_names.split(headersep) raw = False - return df_aslarray(df, sort_rows=sort_rows, sort_columns=sort_columns, fill_value=fill_value, raw=raw) + return df_aslarray(df, sort_rows=sort_rows, sort_columns=sort_columns, fill_value=fill_value, raw=raw, wide=wide) def read_tsv(filepath_or_buffer, **kwargs): @@ -430,7 +498,7 @@ def read_hdf(filepath_or_buffer, key, fill_value=np.nan, na=np.nan, sort_rows=Fa @deprecate_kwarg('nb_index', 'nb_axes', arg_converter=lambda x: x + 1) @deprecate_kwarg('sheetname', 'sheet') def read_excel(filepath, sheet=0, nb_axes=None, index_col=None, fill_value=np.nan, na=np.nan, - sort_rows=False, sort_columns=False, engine=None, **kwargs): + sort_rows=False, sort_columns=False, wide=True, engine=None, **kwargs): """ Reads excel file from sheet name and returns an LArray with the contents @@ -456,6 +524,10 @@ def read_excel(filepath, sheet=0, nb_axes=None, index_col=None, fill_value=np.na sort_columns : bool, optional Whether or not to sort the columns alphabetically (sorting is more efficient than not sorting). Defaults to False. + wide : bool, optional + Whether or not to assume the array is stored in "wide" format. + If False, the array is assumed to be stored in "narrow" format: one column per axis plus one value column. + Defaults to True. engine : {'xlrd', 'xlwings'}, optional Engine to use to read the Excel file. If None (default), it will use 'xlwings' by default if the module is installed and relies on Pandas default reader otherwise. @@ -471,12 +543,7 @@ def read_excel(filepath, sheet=0, nb_axes=None, index_col=None, fill_value=np.na if engine is None: engine = 'xlwings' if xw is not None else None - if nb_axes is not None and index_col is not None: - raise ValueError("cannot specify both nb_axes and index_col") - elif nb_axes is not None: - index_col = list(range(nb_axes - 1)) - elif isinstance(index_col, int): - index_col = [index_col] + index_col = _get_index_col(nb_axes, index_col, wide) if engine == 'xlwings': if kwargs: @@ -485,11 +552,11 @@ def read_excel(filepath, sheet=0, nb_axes=None, index_col=None, fill_value=np.na from larray.inout.excel import open_excel with open_excel(filepath) as wb: return wb[sheet].load(index_col=index_col, fill_value=fill_value, sort_rows=sort_rows, - sort_columns=sort_columns) + sort_columns=sort_columns, wide=wide) else: df = pd.read_excel(filepath, sheet, index_col=index_col, engine=engine, **kwargs) return df_aslarray(df, sort_rows=sort_rows, sort_columns=sort_columns, raw=index_col is None, - fill_value=fill_value) + fill_value=fill_value, wide=wide) @deprecate_kwarg('nb_index', 'nb_axes', arg_converter=lambda x: x + 1) @@ -518,7 +585,7 @@ def read_sas(filepath, nb_axes=None, index_col=None, fill_value=np.nan, na=np.na @deprecate_kwarg('nb_index', 'nb_axes', arg_converter=lambda x: x + 1) -def from_lists(data, nb_axes=None, index_col=None, fill_value=np.nan, sort_rows=False, sort_columns=False): +def from_lists(data, nb_axes=None, index_col=None, fill_value=np.nan, sort_rows=False, sort_columns=False, wide=True): """ initialize array from a list of lists (lines) @@ -541,6 +608,10 @@ def from_lists(data, nb_axes=None, index_col=None, fill_value=np.nan, sort_rows= sort_columns : bool, optional Whether or not to sort the columns alphabetically (sorting is more efficient than not sorting). Defaults to False. + wide : bool, optional + Whether or not to assume the array is stored in "wide" format. + If False, the array is assumed to be stored in "narrow" format: one column per axis plus one value column. + Defaults to True. Returns ------- @@ -558,6 +629,9 @@ def from_lists(data, nb_axes=None, index_col=None, fill_value=np.nan, sort_rows= sex\\year 1991 1992 1993 M 0 1 2 F 3 4 5 + + Read array with missing values + `fill_value` argument + >>> from_lists([['sex', 'nat\\\\year', 1991, 1992, 1993], ... [ 'M', 'BE', 1, 0, 0], ... [ 'M', 'FO', 2, 0, 0], @@ -567,6 +641,19 @@ def from_lists(data, nb_axes=None, index_col=None, fill_value=np.nan, sort_rows= M FO 2.0 0.0 0.0 F BE 0.0 0.0 1.0 F FO nan nan nan + + >>> from_lists([['sex', 'nat\\\\year', 1991, 1992, 1993], + ... [ 'M', 'BE', 1, 0, 0], + ... [ 'M', 'FO', 2, 0, 0], + ... [ 'F', 'BE', 0, 0, 1]], fill_value=42) + sex nat\\year 1991 1992 1993 + M BE 1 0 0 + M FO 2 0 0 + F BE 0 0 1 + F FO 42 42 42 + + Specify the number of axes of the array to be read + >>> from_lists([['sex', 'nat', 1991, 1992, 1993], ... [ 'M', 'BE', 1, 0, 0], ... [ 'M', 'FO', 2, 0, 0], @@ -576,33 +663,37 @@ def from_lists(data, nb_axes=None, index_col=None, fill_value=np.nan, sort_rows= M FO 2.0 0.0 0.0 F BE 0.0 0.0 1.0 F FO nan nan nan - >>> from_lists([['sex', 'nat\\\\year', 1991, 1992, 1993], - ... [ 'M', 'BE', 1, 0, 0], - ... [ 'M', 'FO', 2, 0, 0], - ... [ 'F', 'BE', 0, 0, 1]], fill_value=42) + + Read array saved in "narrow" format (wide=False) + + >>> from_lists([['sex', 'nat', 'year', 'value'], + ... [ 'M', 'BE', 1991, 1 ], + ... [ 'M', 'BE', 1992, 0 ], + ... [ 'M', 'BE', 1993, 0 ], + ... [ 'M', 'FO', 1991, 2 ], + ... [ 'M', 'FO', 1992, 0 ], + ... [ 'M', 'FO', 1993, 0 ], + ... [ 'F', 'BE', 1991, 0 ], + ... [ 'F', 'BE', 1992, 0 ], + ... [ 'F', 'BE', 1993, 1 ]], wide=False) sex nat\\year 1991 1992 1993 - M BE 1 0 0 - M FO 2 0 0 - F BE 0 0 1 - F FO 42 42 42 + M BE 1.0 0.0 0.0 + M FO 2.0 0.0 0.0 + F BE 0.0 0.0 1.0 + F FO nan nan nan """ - if nb_axes is not None and index_col is not None: - raise ValueError("cannot specify both nb_axes and index_col") - elif nb_axes is not None: - index_col = list(range(nb_axes - 1)) - elif isinstance(index_col, int): - index_col = [index_col] + index_col = _get_index_col(nb_axes, index_col, wide) df = pd.DataFrame(data[1:], columns=data[0]) if index_col is not None: df.set_index([df.columns[c] for c in index_col], inplace=True) return df_aslarray(df, raw=index_col is None, parse_header=False, sort_rows=sort_rows, sort_columns=sort_columns, - fill_value=fill_value) + fill_value=fill_value, wide=wide) @deprecate_kwarg('nb_index', 'nb_axes', arg_converter=lambda x: x + 1) -def from_string(s, nb_axes=None, index_col=None, sep=' ', **kwargs): +def from_string(s, nb_axes=None, index_col=None, sep=' ', wide=True, **kwargs): """Create an array from a multi-line string. Parameters @@ -618,6 +709,10 @@ def from_string(s, nb_axes=None, index_col=None, sep=' ', **kwargs): Positions of columns for the n-1 first axes (ex. [0, 1, 2, 3]). Defaults to None (see nb_axes above). sep : str delimiter used to split each line into cells. + wide : bool, optional + Whether or not to assume the array is stored in "wide" format. + If False, the array is assumed to be stored in "narrow" format: one column per axis plus one value column. + Defaults to True. \**kwargs See arguments of Pandas read_csv function. @@ -671,4 +766,5 @@ def from_string(s, nb_axes=None, index_col=None, sep=' ', **kwargs): BE 0 1 FO 2 3 """ - return read_csv(StringIO(s), nb_axes=nb_axes, index_col=index_col, sep=sep, skipinitialspace=True, **kwargs) + return read_csv(StringIO(s), nb_axes=nb_axes, index_col=index_col, sep=sep, skipinitialspace=True, + wide=wide, **kwargs) diff --git a/larray/inout/excel.py b/larray/inout/excel.py index 63418b8f6..7c69f4205 100644 --- a/larray/inout/excel.py +++ b/larray/inout/excel.py @@ -418,9 +418,9 @@ def __setattr__(self, key, value): setattr(self.xw_sheet, key, value) def load(self, header=True, convert_float=True, nb_index=None, index_col=None, fill_value=np.nan, - sort_rows=False, sort_columns=False): + sort_rows=False, sort_columns=False, wide=True): return self[:].load(header=header, convert_float=convert_float, nb_index=nb_index, index_col=index_col, - sort_rows=sort_rows, sort_columns=sort_columns, fill_value=fill_value) + fill_value=fill_value, sort_rows=sort_rows, sort_columns=sort_columns, wide=wide) # TODO: generalize to more than 2 dimensions or scrap it def array(self, data, row_labels=None, column_labels=None, names=None): @@ -547,7 +547,7 @@ def __str__(self): __repr__ = __str__ def load(self, header=True, convert_float=True, nb_index=None, index_col=None, fill_value=np.nan, - sort_rows=False, sort_columns=False): + sort_rows=False, sort_columns=False, wide=True): if not self.ndim: return LArray([]) @@ -555,7 +555,7 @@ def load(self, header=True, convert_float=True, nb_index=None, index_col=None, f if header: return from_lists(list_data, nb_index=nb_index, index_col=index_col, fill_value=fill_value, - sort_rows=sort_rows, sort_columns=sort_columns) + sort_rows=sort_rows, sort_columns=sort_columns, wide=wide) else: return LArray(list_data) diff --git a/larray/tests/data/test1d_narrow.csv b/larray/tests/data/test1d_narrow.csv new file mode 100644 index 000000000..eff558a1e --- /dev/null +++ b/larray/tests/data/test1d_narrow.csv @@ -0,0 +1,4 @@ +a,value +a0,0 +a1,1 +a2,2 diff --git a/larray/tests/data/test2d_narrow.csv b/larray/tests/data/test2d_narrow.csv new file mode 100644 index 000000000..2f726083e --- /dev/null +++ b/larray/tests/data/test2d_narrow.csv @@ -0,0 +1,7 @@ +a,b,value +1,b0,0 +1,b1,1 +2,b0,2 +2,b1,3 +3,b0,4 +3,b1,5 diff --git a/larray/tests/data/test3d_narrow.csv b/larray/tests/data/test3d_narrow.csv new file mode 100644 index 000000000..9e3c75014 --- /dev/null +++ b/larray/tests/data/test3d_narrow.csv @@ -0,0 +1,19 @@ +a,b,c,value +1,b0,c0,0 +1,b0,c1,1 +1,b0,c2,2 +1,b1,c0,3 +1,b1,c1,4 +1,b1,c2,5 +2,b0,c0,6 +2,b0,c1,7 +2,b0,c2,8 +2,b1,c0,9 +2,b1,c1,10 +2,b1,c2,11 +3,b0,c0,12 +3,b0,c1,13 +3,b0,c2,14 +3,b1,c0,15 +3,b1,c1,16 +3,b1,c2,17 diff --git a/larray/tests/data/test_narrow.xlsx b/larray/tests/data/test_narrow.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..010c47986912ff2450dd875db9019d992cc0719c GIT binary patch literal 12427 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 AMgRZ+ literal 0 HcmV?d00001 diff --git a/larray/tests/data/testmissing_values_narrow.csv b/larray/tests/data/testmissing_values_narrow.csv new file mode 100644 index 000000000..1663c2a6a --- /dev/null +++ b/larray/tests/data/testmissing_values_narrow.csv @@ -0,0 +1,12 @@ +a,b,c,value +1,b0,c0,0 +1,b0,c1,1 +1,b0,c2,2 +1,b1,c0,3 +1,b1,c1,4 +1,b1,c2,5 +2,b1,c0,9 +2,b1,c2,11 +3,b0,c0,12 +3,b0,c1,13 +3,b0,c2,14 diff --git a/larray/tests/data/testunsorted_narrow.csv b/larray/tests/data/testunsorted_narrow.csv new file mode 100644 index 000000000..295e82af8 --- /dev/null +++ b/larray/tests/data/testunsorted_narrow.csv @@ -0,0 +1,19 @@ +a,b,c,value +3,b1,c2,0 +3,b1,c1,1 +3,b1,c0,2 +3,b0,c2,3 +3,b0,c1,4 +3,b0,c0,5 +2,b1,c2,6 +2,b1,c1,7 +2,b1,c0,8 +2,b0,c2,9 +2,b0,c1,10 +2,b0,c0,11 +1,b1,c2,12 +1,b1,c1,13 +1,b1,c0,14 +1,b0,c2,15 +1,b0,c1,16 +1,b0,c0,17 diff --git a/larray/tests/test_array.py b/larray/tests/test_array.py index 92112aa3f..985b9ffa3 100644 --- a/larray/tests/test_array.py +++ b/larray/tests/test_array.py @@ -96,6 +96,8 @@ def setUp(self): self.io_missing_values = ndtest("a=1..3; b=b0,b1; c=c0..c2", dtype=float) self.io_missing_values[2, 'b0'] = np.nan self.io_missing_values[3, 'b1'] = np.nan + self.io_narrow_missing_values = self.io_missing_values.copy() + self.io_narrow_missing_values[2, 'b1', 'c1'] = np.nan @pytest.fixture(autouse=True) def setup(self, tmpdir): @@ -2637,6 +2639,26 @@ def test_read_csv(self): res = read_csv(StringIO('a,a2,a0,a1\n,2,0,1\n'), sort_columns=True) assert_array_equal(res, ndtest(3)) + ################# + # narrow format # + ################# + res = read_csv(inputpath('test1d_narrow.csv'), wide=False) + assert_array_equal(res, self.io_1d) + + res = read_csv(inputpath('test2d_narrow.csv'), wide=False) + assert_array_equal(res, self.io_2d) + + res = read_csv(inputpath('test3d_narrow.csv'), wide=False) + assert_array_equal(res, self.io_3d) + + # missing values + res = read_csv(inputpath('testmissing_values_narrow.csv'), wide=False) + assert_array_nan_equal(res, self.io_narrow_missing_values) + + # unsorted values + res = read_csv(inputpath('testunsorted_narrow.csv'), wide=False) + assert_array_equal(res, self.io_unsorted) + def test_read_eurostat(self): la = read_eurostat(inputpath('test5d_eurostat.csv')) self.assertEqual(la.ndim, 5) @@ -2667,7 +2689,7 @@ def test_read_excel_xlwings(self): axis = Axis('dim=1d,2d,3d,5d') arr = read_excel(inputpath('test.xlsx'), axis['1d']) - assert_array_equal(arr, ndtest(3)) + assert_array_equal(arr, self.io_1d) # missing rows + fill_value argument arr = read_excel(inputpath('test.xlsx'), 'missing_values', fill_value=42) @@ -2675,11 +2697,40 @@ def test_read_excel_xlwings(self): expected[isnan(expected)] = 42 assert_array_equal(arr, expected) - # invalid keyword argument + ################# + # narrow format # + ################# + arr = read_excel(inputpath('test_narrow.xlsx'), '1d', wide=False) + assert_array_equal(arr, self.io_1d) + + arr = read_excel(inputpath('test_narrow.xlsx'), '2d', wide=False) + assert_array_equal(arr, self.io_2d) + + arr = read_excel(inputpath('test_narrow.xlsx'), '3d', wide=False) + assert_array_equal(arr, self.io_3d) + + # missing rows + fill_value argument + arr = read_excel(inputpath('test_narrow.xlsx'), 'missing_values', fill_value=42, wide=False) + expected = self.io_narrow_missing_values.copy() + expected[isnan(expected)] = 42 + assert_array_equal(arr, expected) + + # unsorted values + arr = read_excel(inputpath('test_narrow.xlsx'), 'unsorted', wide=False) + assert_array_equal(arr, self.io_unsorted) + + ############################## + # invalid keyword argument # + ############################## + with self.assertRaisesRegexp(TypeError, "'dtype' is an invalid keyword argument for this function when using " "the xlwings backend"): read_excel(inputpath('test.xlsx'), engine='xlwings', dtype=float) + ################# + # blank cells # + ################# + # Excel sheet with blank cells on right/bottom border of the array to read fpath = inputpath('test_blank_cells.xlsx') good = read_excel(fpath, 'good') @@ -2722,7 +2773,7 @@ def test_read_excel_pandas(self): axis = Axis('dim=1d,2d,3d,5d') arr = read_excel(inputpath('test.xlsx'), axis['1d'], engine='xlrd') - assert_array_equal(arr, ndtest(3)) + assert_array_equal(arr, self.io_1d) # missing rows + fill_value argument arr = read_excel(inputpath('test.xlsx'), 'missing_values', fill_value=42, engine='xlrd') @@ -2730,6 +2781,33 @@ def test_read_excel_pandas(self): expected[isnan(expected)] = 42 assert_array_equal(arr, expected) + ################# + # narrow format # + ################# + arr = read_excel(inputpath('test_narrow.xlsx'), '1d', wide=False, engine='xlrd') + assert_array_equal(arr, self.io_1d) + + arr = read_excel(inputpath('test_narrow.xlsx'), '2d', wide=False, engine='xlrd') + assert_array_equal(arr, self.io_2d) + + arr = read_excel(inputpath('test_narrow.xlsx'), '3d', wide=False, engine='xlrd') + assert_array_equal(arr, self.io_3d) + + # missing rows + fill_value argument + arr = read_excel(inputpath('test_narrow.xlsx'), 'missing_values', + fill_value=42, wide=False, engine='xlrd') + expected = self.io_narrow_missing_values + expected[isnan(expected)] = 42 + assert_array_equal(arr, expected) + + # unsorted values + arr = read_excel(inputpath('test_narrow.xlsx'), 'unsorted', wide=False, engine='xlrd') + assert_array_equal(arr, self.io_unsorted) + + ################# + # blank cells # + ################# + # Excel sheet with blank cells on right/bottom border of the array to read fpath = inputpath('test_blank_cells.xlsx') good1 = read_excel(fpath, 'good', engine='xlrd')