daru 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.build.sh +6 -6
- data/.gitignore +2 -0
- data/CONTRIBUTING.md +7 -3
- data/History.md +36 -0
- data/README.md +21 -13
- data/Rakefile +16 -1
- data/benchmarks/TradeoffData.csv +65 -0
- data/benchmarks/dataframe_creation.rb +39 -0
- data/benchmarks/group_by.rb +32 -0
- data/benchmarks/row_access.rb +41 -0
- data/benchmarks/row_assign.rb +36 -0
- data/benchmarks/sorting.rb +44 -0
- data/benchmarks/vector_access.rb +31 -0
- data/benchmarks/vector_assign.rb +42 -0
- data/benchmarks/where_clause.rb +48 -0
- data/benchmarks/where_vs_filter.rb +28 -0
- data/daru.gemspec +29 -5
- data/lib/daru.rb +30 -1
- data/lib/daru/accessors/array_wrapper.rb +2 -2
- data/lib/daru/accessors/nmatrix_wrapper.rb +6 -6
- data/lib/daru/core/group_by.rb +112 -31
- data/lib/daru/core/merge.rb +170 -0
- data/lib/daru/core/query.rb +95 -0
- data/lib/daru/dataframe.rb +335 -223
- data/lib/daru/date_time/index.rb +550 -0
- data/lib/daru/date_time/offsets.rb +397 -0
- data/lib/daru/index.rb +266 -54
- data/lib/daru/io/io.rb +1 -2
- data/lib/daru/maths/arithmetic/dataframe.rb +2 -2
- data/lib/daru/maths/arithmetic/vector.rb +2 -2
- data/lib/daru/maths/statistics/dataframe.rb +58 -8
- data/lib/daru/maths/statistics/vector.rb +229 -0
- data/lib/daru/vector.rb +230 -80
- data/lib/daru/version.rb +1 -1
- data/spec/core/group_by_spec.rb +16 -16
- data/spec/core/merge_spec.rb +52 -0
- data/spec/core/query_spec.rb +171 -0
- data/spec/dataframe_spec.rb +278 -280
- data/spec/date_time/data_spec.rb +199 -0
- data/spec/date_time/index_spec.rb +433 -0
- data/spec/date_time/offsets_spec.rb +371 -0
- data/spec/fixtures/stock_data.csv +500 -0
- data/spec/index_spec.rb +317 -11
- data/spec/io/io_spec.rb +18 -17
- data/spec/math/arithmetic/dataframe_spec.rb +3 -3
- data/spec/math/statistics/dataframe_spec.rb +39 -1
- data/spec/math/statistics/vector_spec.rb +163 -1
- data/spec/monkeys_spec.rb +4 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/vector_spec.rb +125 -60
- metadata +71 -14
- data/lib/daru/accessors/dataframe_by_vector.rb +0 -17
- data/lib/daru/multi_index.rb +0 -216
- data/spec/multi_index_spec.rb +0 -216
    
        data/lib/daru/version.rb
    CHANGED
    
    
    
        data/spec/core/group_by_spec.rb
    CHANGED
    
    | @@ -13,23 +13,23 @@ describe Daru::Core::GroupBy do | |
| 13 13 | 
             
                @dl_group = @df.group_by([:a, :b])
         | 
| 14 14 | 
             
                @tl_group = @df.group_by([:a,:b,:c])
         | 
| 15 15 |  | 
| 16 | 
            -
                @sl_index = Daru::Index.new([ | 
| 17 | 
            -
                @dl_multi_index = Daru::MultiIndex. | 
| 18 | 
            -
                  [ | 
| 19 | 
            -
                  [ | 
| 20 | 
            -
                  [ | 
| 21 | 
            -
                  [ | 
| 22 | 
            -
                  [ | 
| 23 | 
            -
                  [ | 
| 16 | 
            +
                @sl_index = Daru::Index.new(['bar', 'foo'])
         | 
| 17 | 
            +
                @dl_multi_index = Daru::MultiIndex.from_tuples([
         | 
| 18 | 
            +
                  ['bar', 'one'],
         | 
| 19 | 
            +
                  ['bar', 'three'],
         | 
| 20 | 
            +
                  ['bar', 'two'],
         | 
| 21 | 
            +
                  ['foo', 'one'],
         | 
| 22 | 
            +
                  ['foo', 'three'],
         | 
| 23 | 
            +
                  ['foo', 'two']
         | 
| 24 24 | 
             
                ])
         | 
| 25 | 
            -
                @tl_multi_index = Daru::MultiIndex. | 
| 26 | 
            -
                  [ | 
| 27 | 
            -
                  [ | 
| 28 | 
            -
                  [ | 
| 29 | 
            -
                  [ | 
| 30 | 
            -
                  [ | 
| 31 | 
            -
                  [ | 
| 32 | 
            -
                  [ | 
| 25 | 
            +
                @tl_multi_index = Daru::MultiIndex.from_tuples([
         | 
| 26 | 
            +
                  ['bar', 'one'  , 2],
         | 
| 27 | 
            +
                  ['bar', 'three', 1],
         | 
| 28 | 
            +
                  ['bar', 'two'  , 6],
         | 
| 29 | 
            +
                  ['foo', 'one'  , 1],
         | 
| 30 | 
            +
                  ['foo', 'one'  , 3],
         | 
| 31 | 
            +
                  ['foo', 'three', 8],
         | 
| 32 | 
            +
                  ['foo', 'two'  , 3]
         | 
| 33 33 | 
             
                ])
         | 
| 34 34 | 
             
              end
         | 
| 35 35 |  | 
| @@ -0,0 +1,52 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Daru::DataFrame do
         | 
| 4 | 
            +
              context "#join" do
         | 
| 5 | 
            +
                before do
         | 
| 6 | 
            +
                  @left = Daru::DataFrame.new({
         | 
| 7 | 
            +
                    :id   => [1,2,3,4],
         | 
| 8 | 
            +
                    :name => ['Pirate', 'Monkey', 'Ninja', 'Spaghetti']
         | 
| 9 | 
            +
                  })
         | 
| 10 | 
            +
                  @right = Daru::DataFrame.new({
         | 
| 11 | 
            +
                    :id => [1,2,3,4],
         | 
| 12 | 
            +
                    :name => ['Rutabaga', 'Pirate', 'Darth Vader', 'Ninja']
         | 
| 13 | 
            +
                  })
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                it "performs an inner join of two dataframes" do
         | 
| 17 | 
            +
                  answer = Daru::DataFrame.new({
         | 
| 18 | 
            +
                    :id_1   => [1,3],
         | 
| 19 | 
            +
                    :name => ['Pirate', 'Ninja'],
         | 
| 20 | 
            +
                    :id_2   => [2,4]
         | 
| 21 | 
            +
                  }, order: [:id_1, :name, :id_2])
         | 
| 22 | 
            +
                  expect(@left.join(@right, how: :inner, on: [:name])).to eq(answer)
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                it "performs a full outer join" do
         | 
| 26 | 
            +
                  answer = Daru::DataFrame.new({
         | 
| 27 | 
            +
                    :id_1 => [1,2,3,4,nil,nil],
         | 
| 28 | 
            +
                    :name => ['Pirate', 'Monkey', 'Ninja', 'Spaghetti','Rutabaga', 'Darth Vader'],
         | 
| 29 | 
            +
                    :id_2 => [2,nil,4,nil,1,3]
         | 
| 30 | 
            +
                  }, order: [:id_1, :name, :id_2])
         | 
| 31 | 
            +
                  expect(@left.join(@right, how: :outer, on: [:name])).to eq(answer)
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                it "performs a left outer join", focus: true do
         | 
| 35 | 
            +
                  answer = Daru::DataFrame.new({
         | 
| 36 | 
            +
                    :id_1 => [1,2,3,4],
         | 
| 37 | 
            +
                    :name => ['Pirate', 'Monkey', 'Ninja', 'Spaghetti'],
         | 
| 38 | 
            +
                    :id_2 => [2,nil,4,nil]
         | 
| 39 | 
            +
                  }, order: [:id_1, :name, :id_2])
         | 
| 40 | 
            +
                  expect(@left.join(@right, how: :left, on: [:name])).to eq(answer)
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                it "performs a right outer join" do
         | 
| 44 | 
            +
                  answer = Daru::DataFrame.new({
         | 
| 45 | 
            +
                    :id_1 => [nil,1,nil,3],
         | 
| 46 | 
            +
                    :name => ['Rutabaga','Pirate', 'Darth Vader', 'Ninja'],
         | 
| 47 | 
            +
                    :id_2 => [1,2,3,4]
         | 
| 48 | 
            +
                  }, order: [:id_1, :name, :id_2])
         | 
| 49 | 
            +
                  expect(@left.join(@right, how: :right, on: [:name])).to eq(answer)
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
            end
         | 
| @@ -0,0 +1,171 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Daru::Core::Query::BoolArray do
         | 
| 4 | 
            +
              before do
         | 
| 5 | 
            +
                @klass = Daru::Core::Query::BoolArray 
         | 
| 6 | 
            +
                @left = @klass.new([true, true, true, false, false, true])
         | 
| 7 | 
            +
                @right = @klass.new([false, false, false, false, true, false])
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              context "#&" do
         | 
| 11 | 
            +
                it "computes and logic of each element in the array" do
         | 
| 12 | 
            +
                  expect(@left & @right).to eq(
         | 
| 13 | 
            +
                    @klass.new([false, false, false, false, false, false]))
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              context "#|" do
         | 
| 18 | 
            +
                it "computes or logic of each element in arrays" do
         | 
| 19 | 
            +
                  expect(@left | @right).to eq(
         | 
| 20 | 
            +
                    @klass.new([true, true, true, false, true, true]))
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              context "#!" do
         | 
| 25 | 
            +
                it "computes not logic of each element" do
         | 
| 26 | 
            +
                  expect(!@left).to eq(
         | 
| 27 | 
            +
                    @klass.new([false, false, false, true, true, false])
         | 
| 28 | 
            +
                    )
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            describe "Arel-like syntax" do
         | 
| 34 | 
            +
              describe "comparison operators" do
         | 
| 35 | 
            +
                describe Daru::Vector do
         | 
| 36 | 
            +
                  before do
         | 
| 37 | 
            +
                    @vector = Daru::Vector.new([23,51,1214,352,32,11])
         | 
| 38 | 
            +
                    @comparator = Daru::Vector.new([45,22,1214,55,32,9])
         | 
| 39 | 
            +
                    @klass = Daru::Core::Query::BoolArray
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  context "#eq" do
         | 
| 43 | 
            +
                    it "accepts scalar value" do
         | 
| 44 | 
            +
                      expect(@vector.eq(352)).to eq(
         | 
| 45 | 
            +
                        @klass.new([false,false,false,true,false,false]))
         | 
| 46 | 
            +
                    end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                    it "accepts vector and compares corrensponding elements" do
         | 
| 49 | 
            +
                      expect(@vector.eq(@comparator)).to eq(
         | 
| 50 | 
            +
                        @klass.new([false,false,true,false,true,false]))
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  context "#not_eq" do
         | 
| 55 | 
            +
                    it "accepts scalar value" do
         | 
| 56 | 
            +
                      expect(@vector.not_eq(51)).to eq(
         | 
| 57 | 
            +
                        @klass.new([true, false, true, true, true, true]))
         | 
| 58 | 
            +
                    end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                    it "accepts vector and compares corrensponding elements" do
         | 
| 61 | 
            +
                      expect(@vector.not_eq(@comparator)).to eq(
         | 
| 62 | 
            +
                        @klass.new([true, true, false, true, false, true]))
         | 
| 63 | 
            +
                    end
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  context "#lt" do
         | 
| 67 | 
            +
                    it "accepts scalar value" do
         | 
| 68 | 
            +
                      expect(@vector.lt(51)).to eq(
         | 
| 69 | 
            +
                        @klass.new([true, false, false, false, true, true]))
         | 
| 70 | 
            +
                    end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                    it "accepts vector and compares corrensponding elements" do
         | 
| 73 | 
            +
                      expect(@vector.lt(@comparator)).to eq(
         | 
| 74 | 
            +
                        @klass.new([true,false,false,false,false,false]))
         | 
| 75 | 
            +
                    end
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                  context "#lteq" do
         | 
| 79 | 
            +
                    it "accepts scalar value" do
         | 
| 80 | 
            +
                      expect(@vector.lteq(51)).to eq(
         | 
| 81 | 
            +
                        @klass.new([true, true, false, false, true, true]))
         | 
| 82 | 
            +
                    end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                    it "accepts vector and compares corrensponding elements" do
         | 
| 85 | 
            +
                      expect(@vector.lteq(@comparator)).to eq(
         | 
| 86 | 
            +
                        @klass.new([true,false,true,false,true,false]))
         | 
| 87 | 
            +
                    end
         | 
| 88 | 
            +
                  end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                  context "#mt" do
         | 
| 91 | 
            +
                    it "accepts scalar value" do
         | 
| 92 | 
            +
                      expect(@vector.mt(51)).to eq(
         | 
| 93 | 
            +
                        @klass.new([false, false, true, true, false, false]))
         | 
| 94 | 
            +
                    end
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                    it "accepts vector and compares corrensponding elements" do
         | 
| 97 | 
            +
                      expect(@vector.mt(@comparator)).to eq(
         | 
| 98 | 
            +
                        @klass.new([false,true,false,true,false,true]))
         | 
| 99 | 
            +
                    end
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                  context "#mteq" do
         | 
| 103 | 
            +
                    it "accepts scalar value" do
         | 
| 104 | 
            +
                      expect(@vector.mteq(51)).to eq(
         | 
| 105 | 
            +
                        @klass.new([false, true, true, true, false, false]))
         | 
| 106 | 
            +
                    end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                    it "accepts vector and compares corrensponding elements" do
         | 
| 109 | 
            +
                      expect(@vector.mteq(@comparator)).to eq(
         | 
| 110 | 
            +
                        @klass.new([false,true,true,true,true,true]))
         | 
| 111 | 
            +
                    end
         | 
| 112 | 
            +
                  end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                  context "#in" do
         | 
| 115 | 
            +
                    it "checks if any of elements in the arg are present in the vector" do
         | 
| 116 | 
            +
                      expect(@vector.in([23,55,1,33,32])).to eq(
         | 
| 117 | 
            +
                        @klass.new([true, false, false, false, true, false]))
         | 
| 118 | 
            +
                    end
         | 
| 119 | 
            +
                  end
         | 
| 120 | 
            +
                end
         | 
| 121 | 
            +
              end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
              describe "where clause" do
         | 
| 124 | 
            +
                context Daru::DataFrame do
         | 
| 125 | 
            +
                  before do
         | 
| 126 | 
            +
                    @df = Daru::DataFrame.new({
         | 
| 127 | 
            +
                      number: [1,2,3,4,5,6],
         | 
| 128 | 
            +
                      sym: [:one, :two, :three, :four, :five, :six],
         | 
| 129 | 
            +
                      names: ['sameer', 'john', 'james', 'omisha', 'priyanka', 'shravan']
         | 
| 130 | 
            +
                    })
         | 
| 131 | 
            +
                  end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                  it "accepts simple single eq statement" do
         | 
| 134 | 
            +
                    answer = Daru::DataFrame.new({
         | 
| 135 | 
            +
                      number: [4],
         | 
| 136 | 
            +
                      sym: [:four],
         | 
| 137 | 
            +
                      names: ['omisha']
         | 
| 138 | 
            +
                      }, index: Daru::Index.new([3])
         | 
| 139 | 
            +
                    )
         | 
| 140 | 
            +
                    expect(@df.where(@df[:number].eq(4))).to eq(answer)
         | 
| 141 | 
            +
                  end
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                  it "accepts somewhat complex comparison operator chaining" do
         | 
| 144 | 
            +
                    answer = Daru::DataFrame.new({
         | 
| 145 | 
            +
                      number: [3,4],
         | 
| 146 | 
            +
                      sym: [:three, :four],
         | 
| 147 | 
            +
                      names: ['james', 'omisha']
         | 
| 148 | 
            +
                    }, index: Daru::Index.new([2,3]))
         | 
| 149 | 
            +
                    expect(
         | 
| 150 | 
            +
                      @df.where (@df[:names].eq('james') | @df[:sym].eq(:four))
         | 
| 151 | 
            +
                      ).to eq(answer)
         | 
| 152 | 
            +
                  end
         | 
| 153 | 
            +
                end
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                context Daru::Vector do
         | 
| 156 | 
            +
                  before do
         | 
| 157 | 
            +
                    @vector = Daru::Vector.new([2,5,1,22,51,4])
         | 
| 158 | 
            +
                  end
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                  it "accepts a simple single statement" do
         | 
| 161 | 
            +
                    expect(@vector.where(@vector.lt(10))).to eq(
         | 
| 162 | 
            +
                      Daru::Vector.new([2,5,1,4], index: Daru::Index.new([0,1,2,5])))
         | 
| 163 | 
            +
                  end
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                  it "accepts somewhat complex operator chaining" do
         | 
| 166 | 
            +
                    expect(@vector.where((@vector.lt(6) | @vector.eq(51)))).to eq(
         | 
| 167 | 
            +
                      Daru::Vector.new([2,5,1,51,4], index: Daru::Index.new([0,1,2,4,5])))
         | 
| 168 | 
            +
                  end
         | 
| 169 | 
            +
                end
         | 
| 170 | 
            +
              end
         | 
| 171 | 
            +
            end
         | 
    
        data/spec/dataframe_spec.rb
    CHANGED
    
    | @@ -20,12 +20,12 @@ describe Daru::DataFrame do | |
| 20 20 | 
             
                  [:c,:two,:foo],
         | 
| 21 21 | 
             
                  [:c,:two,:bar]
         | 
| 22 22 | 
             
                ]
         | 
| 23 | 
            -
                @multi_index = Daru::MultiIndex. | 
| 23 | 
            +
                @multi_index = Daru::MultiIndex.from_tuples(tuples)
         | 
| 24 24 |  | 
| 25 25 | 
             
                @vector_arry1 = [11,12,13,14,11,12,13,14,11,12,13,14]
         | 
| 26 26 | 
             
                @vector_arry2 = [1,2,3,4,1,2,3,4,1,2,3,4]
         | 
| 27 27 |  | 
| 28 | 
            -
                @order_mi = Daru::MultiIndex. | 
| 28 | 
            +
                @order_mi = Daru::MultiIndex.from_tuples([
         | 
| 29 29 | 
             
                  [:a,:one,:bar],
         | 
| 30 30 | 
             
                  [:a,:two,:baz],
         | 
| 31 31 | 
             
                  [:b,:two,:foo],
         | 
| @@ -54,7 +54,7 @@ describe Daru::DataFrame do | |
| 54 54 |  | 
| 55 55 | 
             
                    expect(df.index)      .to eq(Daru::Index.new [0,1,2,3])
         | 
| 56 56 | 
             
                    expect(df.vectors)    .to eq(Daru::Index.new [:a,:b,:c,:d,:e])
         | 
| 57 | 
            -
                    expect(df | 
| 57 | 
            +
                    expect(df[:a]) .to eq(Daru::Vector.new [1,1,1,1])
         | 
| 58 58 | 
             
                  end
         | 
| 59 59 |  | 
| 60 60 | 
             
                  it "creates a DataFrame from Vector rows" do
         | 
| @@ -64,17 +64,18 @@ describe Daru::DataFrame do | |
| 64 64 |  | 
| 65 65 | 
             
                    expect(df.index)      .to eq(Daru::Index.new [0,1,2,3])
         | 
| 66 66 | 
             
                    expect(df.vectors)    .to eq(Daru::Index.new [:a,:b,:c,:d,:e])
         | 
| 67 | 
            -
                    expect(df | 
| 67 | 
            +
                    expect(df[:a]) .to eq(Daru::Vector.new [1,1,1,1])
         | 
| 68 68 | 
             
                  end
         | 
| 69 69 | 
             
                end
         | 
| 70 70 |  | 
| 71 71 | 
             
                context Daru::MultiIndex do
         | 
| 72 72 | 
             
                  it "creates a DataFrame from rows" do
         | 
| 73 | 
            -
                    df = Daru::DataFrame.rows( | 
| 73 | 
            +
                    df = Daru::DataFrame.rows(
         | 
| 74 | 
            +
                      @rows*3, index: @multi_index, order: [:a,:b,:c,:d,:e])
         | 
| 74 75 |  | 
| 75 76 | 
             
                    expect(df.index)     .to eq(@multi_index)
         | 
| 76 77 | 
             
                    expect(df.vectors)   .to eq(Daru::Index.new([:a,:b,:c,:d,:e]))
         | 
| 77 | 
            -
                    expect(df | 
| 78 | 
            +
                    expect(df[:a]).to eq(Daru::Vector.new([1]*12, index: @multi_index))
         | 
| 78 79 | 
             
                  end
         | 
| 79 80 |  | 
| 80 81 | 
             
                  it "crates a DataFrame from rows (MultiIndex order)" do
         | 
| @@ -84,7 +85,7 @@ describe Daru::DataFrame do | |
| 84 85 | 
             
                      [13, 3, 13, 3], 
         | 
| 85 86 | 
             
                      [14, 4, 14, 4]
         | 
| 86 87 | 
             
                    ]
         | 
| 87 | 
            -
                    index = Daru::MultiIndex. | 
| 88 | 
            +
                    index = Daru::MultiIndex.from_tuples([
         | 
| 88 89 | 
             
                      [:one,:bar],
         | 
| 89 90 | 
             
                      [:one,:baz],
         | 
| 90 91 | 
             
                      [:two,:foo],
         | 
| @@ -94,7 +95,7 @@ describe Daru::DataFrame do | |
| 94 95 | 
             
                    df = Daru::DataFrame.rows(rows, index: index, order: @order_mi)
         | 
| 95 96 | 
             
                    expect(df.index)  .to eq(index)
         | 
| 96 97 | 
             
                    expect(df.vectors).to eq(@order_mi)
         | 
| 97 | 
            -
                    expect(df | 
| 98 | 
            +
                    expect(df[:a, :one, :bar]).to eq(Daru::Vector.new([11,12,13,14],
         | 
| 98 99 | 
             
                      index: index))
         | 
| 99 100 | 
             
                  end
         | 
| 100 101 |  | 
| @@ -106,7 +107,7 @@ describe Daru::DataFrame do | |
| 106 107 |  | 
| 107 108 | 
             
                    expect(df.index).to eq(Daru::Index.new(Array.new(rows.size) { |i| i }))
         | 
| 108 109 | 
             
                    expect(df.vectors).to eq(@multi_index)
         | 
| 109 | 
            -
                    expect(df | 
| 110 | 
            +
                    expect(df[:a,:one,:bar]).to eq(Daru::Vector.new([1]*12))
         | 
| 110 111 | 
             
                  end
         | 
| 111 112 | 
             
                end
         | 
| 112 113 | 
             
              end
         | 
| @@ -275,7 +276,7 @@ describe Daru::DataFrame do | |
| 275 276 | 
             
                    expect(df[:c].object_id).to eq(c.object_id)
         | 
| 276 277 | 
             
                  end
         | 
| 277 278 |  | 
| 278 | 
            -
                  it "allows creation of empty dataframe with only order" | 
| 279 | 
            +
                  it "allows creation of empty dataframe with only order" do
         | 
| 279 280 | 
             
                    df = Daru::DataFrame.new({}, order: [:a, :b, :c])
         | 
| 280 281 | 
             
                    df[:a] = Daru::Vector.new([1,2,3,4,5,6])
         | 
| 281 282 |  | 
| @@ -317,7 +318,7 @@ describe Daru::DataFrame do | |
| 317 318 | 
             
                    df = Daru::DataFrame.new({}, order: @order_mi)
         | 
| 318 319 |  | 
| 319 320 | 
             
                    expect(df.vectors).to eq(@order_mi)
         | 
| 320 | 
            -
                    expect(df | 
| 321 | 
            +
                    expect(df[:a, :one, :bar]).to eq(Daru::Vector.new([]))
         | 
| 321 322 | 
             
                  end
         | 
| 322 323 |  | 
| 323 324 | 
             
                  it "creates from Hash" do
         | 
| @@ -330,7 +331,7 @@ describe Daru::DataFrame do | |
| 330 331 |  | 
| 331 332 | 
             
                    expect(df.index)               .to eq(@multi_index)
         | 
| 332 333 | 
             
                    expect(df.vectors)             .to eq(@order_mi)
         | 
| 333 | 
            -
                    expect(df | 
| 334 | 
            +
                    expect(df[:a,:one,:bar]).to eq(Daru::Vector.new(@vector_arry1, 
         | 
| 334 335 | 
             
                      index: @multi_index))
         | 
| 335 336 | 
             
                  end
         | 
| 336 337 |  | 
| @@ -344,7 +345,7 @@ describe Daru::DataFrame do | |
| 344 345 |  | 
| 345 346 | 
             
                    expect(df.index)  .to eq(@multi_index)
         | 
| 346 347 | 
             
                    expect(df.vectors).to eq(@order_mi)
         | 
| 347 | 
            -
                    expect(df | 
| 348 | 
            +
                    expect(df[:a, :one, :bar]).to eq(Daru::Vector.new(@vector_arry1, 
         | 
| 348 349 | 
             
                      index: @multi_index))
         | 
| 349 350 | 
             
                  end
         | 
| 350 351 |  | 
| @@ -358,19 +359,19 @@ describe Daru::DataFrame do | |
| 358 359 | 
             
                  it "aligns MultiIndexes properly" do
         | 
| 359 360 | 
             
                    pending
         | 
| 360 361 | 
             
                    mi_a = @order_mi
         | 
| 361 | 
            -
                    mi_b = Daru::MultiIndex. | 
| 362 | 
            +
                    mi_b = Daru::MultiIndex.from_tuples([
         | 
| 362 363 | 
             
                      [:b,:one,:foo],
         | 
| 363 364 | 
             
                      [:a,:one,:bar],
         | 
| 364 365 | 
             
                      [:b,:two,:foo],
         | 
| 365 366 | 
             
                      [:a,:one,:baz]
         | 
| 366 367 | 
             
                    ])
         | 
| 367 | 
            -
                    mi_sorted = Daru::MultiIndex. | 
| 368 | 
            +
                    mi_sorted = Daru::MultiIndex.from_tuples([
         | 
| 368 369 | 
             
                      [:a, :one, :bar], 
         | 
| 369 370 | 
             
                      [:a, :one, :baz], 
         | 
| 370 371 | 
             
                      [:b, :one, :foo], 
         | 
| 371 372 | 
             
                      [:b, :two, :foo]
         | 
| 372 373 | 
             
                    ])
         | 
| 373 | 
            -
                    order = Daru::MultiIndex. | 
| 374 | 
            +
                    order = Daru::MultiIndex.from_tuples([
         | 
| 374 375 | 
             
                      [:pee, :que],
         | 
| 375 376 | 
             
                      [:pee, :poo]
         | 
| 376 377 | 
             
                    ])
         | 
| @@ -394,7 +395,7 @@ describe Daru::DataFrame do | |
| 394 395 | 
             
                end
         | 
| 395 396 | 
             
              end
         | 
| 396 397 |  | 
| 397 | 
            -
              context "#[ | 
| 398 | 
            +
              context "#[]" do
         | 
| 398 399 | 
             
                context Daru::Index do
         | 
| 399 400 | 
             
                  before :each do
         | 
| 400 401 | 
             
                    @df = Daru::DataFrame.new({b: [11,12,13,14,15], a: [1,2,3,4,5], 
         | 
| @@ -403,7 +404,7 @@ describe Daru::DataFrame do | |
| 403 404 | 
             
                  end
         | 
| 404 405 |  | 
| 405 406 | 
             
                  it "returns a Vector" do
         | 
| 406 | 
            -
                    expect(@df[:a | 
| 407 | 
            +
                    expect(@df[:a]).to eq([1,2,3,4,5].dv(:a, [:one, :two, :three, :four, :five]))
         | 
| 407 408 | 
             
                  end
         | 
| 408 409 |  | 
| 409 410 | 
             
                  it "returns a Vector by default" do
         | 
| @@ -415,11 +416,11 @@ describe Daru::DataFrame do | |
| 415 416 | 
             
                    temp = Daru::DataFrame.new({b: [11,12,13,14,15], a: [1,2,3,4,5]}, 
         | 
| 416 417 | 
             
                      order: [:a, :b], index: [:one, :two, :three, :four, :five])
         | 
| 417 418 |  | 
| 418 | 
            -
                    expect(@df[:a, :b | 
| 419 | 
            +
                    expect(@df[:a, :b]).to eq(temp)
         | 
| 419 420 | 
             
                  end
         | 
| 420 421 |  | 
| 421 422 | 
             
                  it "accesses vector with Integer index" do
         | 
| 422 | 
            -
                    expect(@df[0 | 
| 423 | 
            +
                    expect(@df[0]).to eq([1,2,3,4,5].dv(:a, [:one, :two, :three, :four, :five]))
         | 
| 423 424 | 
             
                  end
         | 
| 424 425 |  | 
| 425 426 | 
             
                  it "returns a subset of DataFrame when specified range" do
         | 
| @@ -432,41 +433,35 @@ describe Daru::DataFrame do | |
| 432 433 | 
             
                end
         | 
| 433 434 |  | 
| 434 435 | 
             
                context Daru::MultiIndex do
         | 
| 435 | 
            -
                   | 
| 436 | 
            -
             | 
| 437 | 
            -
             | 
| 438 | 
            -
             | 
| 439 | 
            -
              context "#[:row]" do
         | 
| 440 | 
            -
                context Daru::Index do
         | 
| 441 | 
            -
                  before :each do
         | 
| 442 | 
            -
                    @df = Daru::DataFrame.new({b: [11,12,13,14,15], a: [1,2,3,4,5], 
         | 
| 443 | 
            -
                      c: [11,22,33,44,55]}, 
         | 
| 444 | 
            -
                      order: [:a, :b, :c], 
         | 
| 445 | 
            -
                      index: [:one, :two, :three, :four, :five])
         | 
| 436 | 
            +
                  it "accesses vector with an integer index" do
         | 
| 437 | 
            +
                    expect(@df_mi[0]).to eq(
         | 
| 438 | 
            +
                      Daru::Vector.new(@vector_arry1, index: @multi_index))
         | 
| 446 439 | 
             
                  end
         | 
| 447 440 |  | 
| 448 | 
            -
                  it "returns a  | 
| 449 | 
            -
                    expect(@ | 
| 441 | 
            +
                  it "returns a vector when specifying full tuple" do
         | 
| 442 | 
            +
                    expect(@df_mi[:a, :one, :bar]).to eq(
         | 
| 443 | 
            +
                      Daru::Vector.new(@vector_arry1, index: @multi_index))
         | 
| 450 444 | 
             
                  end
         | 
| 451 445 |  | 
| 452 | 
            -
                  it "returns  | 
| 453 | 
            -
                     | 
| 446 | 
            +
                  it "returns DataFrame when specified first layer of MultiIndex" do
         | 
| 447 | 
            +
                    sub_order = Daru::MultiIndex.from_tuples([
         | 
| 448 | 
            +
                      [:one, :bar],
         | 
| 449 | 
            +
                      [:two, :baz]
         | 
| 450 | 
            +
                      ])
         | 
| 451 | 
            +
                    expect(@df_mi[:a]).to eq(Daru::DataFrame.new([
         | 
| 452 | 
            +
                      @vector_arry1,
         | 
| 453 | 
            +
                      @vector_arry2
         | 
| 454 | 
            +
                    ], index: @multi_index, order: sub_order))
         | 
| 454 455 | 
             
                  end
         | 
| 455 456 |  | 
| 456 | 
            -
                  it "returns a  | 
| 457 | 
            -
                     | 
| 458 | 
            -
                       | 
| 459 | 
            -
             | 
| 460 | 
            -
                    expect(df[0, :row]).to eq([1,11,11].dv(nil, [:a, :b, :c]))
         | 
| 457 | 
            +
                  it "returns a Vector if the last level of MultiIndex is tracked" do
         | 
| 458 | 
            +
                    expect(@df_mi[:a, :one]).to eq(
         | 
| 459 | 
            +
                      Daru::Vector.new(@vector_arry1, index: @multi_index))
         | 
| 461 460 | 
             
                  end
         | 
| 462 461 | 
             
                end
         | 
| 463 | 
            -
             | 
| 464 | 
            -
                context Daru::MultiIndex do
         | 
| 465 | 
            -
                  # See #row
         | 
| 466 | 
            -
                end
         | 
| 467 462 | 
             
              end
         | 
| 468 463 |  | 
| 469 | 
            -
              context "#[ | 
| 464 | 
            +
              context "#[]=" do
         | 
| 470 465 | 
             
                context Daru::Index do
         | 
| 471 466 | 
             
                  before :each do
         | 
| 472 467 | 
             
                    @df = Daru::DataFrame.new({b: [11,12,13,14,15], a: [1,2,3,4,5], 
         | 
| @@ -474,46 +469,55 @@ describe Daru::DataFrame do | |
| 474 469 | 
             
                      index: [:one, :two, :three, :four, :five])
         | 
| 475 470 | 
             
                  end
         | 
| 476 471 |  | 
| 472 | 
            +
                  it "assigns directly with the []= operator" do
         | 
| 473 | 
            +
                    @data_frame[:a] = [100,200,300,400,500]
         | 
| 474 | 
            +
                    expect(@data_frame).to eq(Daru::DataFrame.new({
         | 
| 475 | 
            +
                      b: [11,12,13,14,15], 
         | 
| 476 | 
            +
                      a: [100,200,300,400,500], 
         | 
| 477 | 
            +
                      c: [11,22,33,44,55]}, order: [:a, :b, :c], 
         | 
| 478 | 
            +
                      index: [:one, :two, :three, :four, :five]))
         | 
| 479 | 
            +
                  end
         | 
| 480 | 
            +
             | 
| 477 481 | 
             
                  it "appends an Array as a Daru::Vector" do
         | 
| 478 | 
            -
                    @df[:d | 
| 482 | 
            +
                    @df[:d] = [69,99,108,85,49]
         | 
| 479 483 |  | 
| 480 484 | 
             
                    expect(@df.d.class).to eq(Daru::Vector)
         | 
| 481 485 | 
             
                  end
         | 
| 482 486 |  | 
| 483 487 | 
             
                  it "replaces an already present vector" do
         | 
| 484 | 
            -
                    @df[:a | 
| 488 | 
            +
                    @df[:a] = [69,99,108,85,49].dv(nil, [:one, :two, :three, :four, :five])
         | 
| 485 489 |  | 
| 486 490 | 
             
                    expect(@df.a).to eq([69,99,108,85,49].dv(nil, [:one, :two, :three, :four, :five]))
         | 
| 487 491 | 
             
                  end
         | 
| 488 492 |  | 
| 489 493 | 
             
                  it "appends a new vector to the DataFrame" do
         | 
| 490 | 
            -
                    @df[:woo | 
| 494 | 
            +
                    @df[:woo] = [69,99,108,85,49].dv(nil, [:one, :two, :three, :four, :five])
         | 
| 491 495 |  | 
| 492 496 | 
             
                    expect(@df.vectors).to eq([:a, :b, :c, :woo].to_index)
         | 
| 493 497 | 
             
                  end
         | 
| 494 498 |  | 
| 495 499 | 
             
                  it "creates an index for the new vector if not specified" do
         | 
| 496 | 
            -
                    @df[:woo | 
| 500 | 
            +
                    @df[:woo] = [69,99,108,85,49]
         | 
| 497 501 |  | 
| 498 502 | 
             
                    expect(@df.woo.index).to eq([:one, :two, :three, :four, :five].to_index)
         | 
| 499 503 | 
             
                  end   
         | 
| 500 504 |  | 
| 501 505 | 
             
                  it "matches index of vector to be inserted with the DataFrame index" do
         | 
| 502 | 
            -
                    @df[:shankar | 
| 506 | 
            +
                    @df[:shankar] = [69,99,108,85,49].dv(:shankar, [:two, :one, :three, :five, :four])
         | 
| 503 507 |  | 
| 504 508 | 
             
                    expect(@df.shankar).to eq([99,69,108,49,85].dv(:shankar, 
         | 
| 505 509 | 
             
                      [:one, :two, :three, :four, :five]))
         | 
| 506 510 | 
             
                  end
         | 
| 507 511 |  | 
| 508 512 | 
             
                  it "matches index of vector to be inserted, inserting nils where no match found" do
         | 
| 509 | 
            -
                    @df | 
| 513 | 
            +
                    @df[:shankar] = [1,2,3].dv(:shankar, [:one, :james, :hetfield])
         | 
| 510 514 |  | 
| 511 515 | 
             
                    expect(@df.shankar).to eq([1,nil,nil,nil,nil].dv(:shankar, [:one, :two, :three, :four, :five]))
         | 
| 512 516 | 
             
                  end
         | 
| 513 517 |  | 
| 514 518 | 
             
                  it "raises error for Array assignment of wrong length" do
         | 
| 515 519 | 
             
                    expect{
         | 
| 516 | 
            -
                      @df | 
| 520 | 
            +
                      @df[:shiva] = [1,2,3]
         | 
| 517 521 | 
             
                      }.to raise_error
         | 
| 518 522 | 
             
                  end
         | 
| 519 523 |  | 
| @@ -521,23 +525,6 @@ describe Daru::DataFrame do | |
| 521 525 | 
             
                    # TODO
         | 
| 522 526 | 
             
                  end
         | 
| 523 527 | 
             
                end
         | 
| 524 | 
            -
                
         | 
| 525 | 
            -
                context Daru::MultiIndex do
         | 
| 526 | 
            -
                  pending
         | 
| 527 | 
            -
                end
         | 
| 528 | 
            -
              end
         | 
| 529 | 
            -
             | 
| 530 | 
            -
              context "#[]=" do
         | 
| 531 | 
            -
                context Daru::Index do
         | 
| 532 | 
            -
                  it "assigns directly with the []= operator" do
         | 
| 533 | 
            -
                    @data_frame[:a] = [100,200,300,400,500]
         | 
| 534 | 
            -
                    expect(@data_frame).to eq(Daru::DataFrame.new({
         | 
| 535 | 
            -
                      b: [11,12,13,14,15], 
         | 
| 536 | 
            -
                      a: [100,200,300,400,500], 
         | 
| 537 | 
            -
                      c: [11,22,33,44,55]}, order: [:a, :b, :c], 
         | 
| 538 | 
            -
                      index: [:one, :two, :three, :four, :five]))
         | 
| 539 | 
            -
                  end
         | 
| 540 | 
            -
                end
         | 
| 541 528 |  | 
| 542 529 | 
             
                context Daru::MultiIndex do
         | 
| 543 530 | 
             
                  it "raises error when incomplete index specified but index is absent" do
         | 
| @@ -547,7 +534,6 @@ describe Daru::DataFrame do | |
| 547 534 | 
             
                  end
         | 
| 548 535 |  | 
| 549 536 | 
             
                  it "assigns all sub-indexes when a top level index is specified" do
         | 
| 550 | 
            -
                    pending
         | 
| 551 537 | 
             
                    @df_mi[:a] = [100,200,300,400,100,200,300,400,100,200,300,400]
         | 
| 552 538 |  | 
| 553 539 | 
             
                    expect(@df_mi).to eq(Daru::DataFrame.new([
         | 
| @@ -558,8 +544,7 @@ describe Daru::DataFrame do | |
| 558 544 | 
             
                  end
         | 
| 559 545 |  | 
| 560 546 | 
             
                  it "creates a new vector when full index specfied" do
         | 
| 561 | 
            -
                     | 
| 562 | 
            -
                    order = Daru::MultiIndex.new([
         | 
| 547 | 
            +
                    order = Daru::MultiIndex.from_tuples([
         | 
| 563 548 | 
             
                      [:a,:one,:bar],
         | 
| 564 549 | 
             
                      [:a,:two,:baz],
         | 
| 565 550 | 
             
                      [:b,:two,:foo],
         | 
| @@ -579,7 +564,7 @@ describe Daru::DataFrame do | |
| 579 564 | 
             
                end
         | 
| 580 565 | 
             
              end
         | 
| 581 566 |  | 
| 582 | 
            -
              context "#[ | 
| 567 | 
            +
              context "#row[]=" do
         | 
| 583 568 | 
             
                context Daru::Index do
         | 
| 584 569 | 
             
                  before :each do
         | 
| 585 570 | 
             
                    @df = Daru::DataFrame.new({b: [11,12,13,14,15], a: [1,2,3,4,5], 
         | 
| @@ -590,33 +575,39 @@ describe Daru::DataFrame do | |
| 590 575 | 
             
                  it "assigns specified row when Array" do
         | 
| 591 576 | 
             
                    @df.row[:one] = [49, 99, 59]
         | 
| 592 577 |  | 
| 593 | 
            -
                    expect(@df[:one | 
| 594 | 
            -
                    expect(@df[:one | 
| 595 | 
            -
                    expect(@df[:one | 
| 578 | 
            +
                    expect(@df.row[:one])      .to eq([49, 99, 59].dv(:one, [:a, :b, :c]))
         | 
| 579 | 
            +
                    expect(@df.row[:one].index).to eq([:a, :b, :c].to_index)
         | 
| 580 | 
            +
                    expect(@df.row[:one].name) .to eq(:one)
         | 
| 596 581 | 
             
                  end
         | 
| 597 582 |  | 
| 598 583 | 
             
                  it "assigns specified row when DV" do
         | 
| 599 | 
            -
                    @df[:one | 
| 584 | 
            +
                    @df.row[:one] = [49, 99, 59].dv(nil, [:a, :b, :c])
         | 
| 600 585 |  | 
| 601 | 
            -
                    expect(@df[:one | 
| 586 | 
            +
                    expect(@df.row[:one]).to eq([49, 99, 59].dv(:one, [:a, :b, :c]))
         | 
| 587 | 
            +
                  end
         | 
| 588 | 
            +
             | 
| 589 | 
            +
                  it "assigns correct elements when Vector of different index" do
         | 
| 590 | 
            +
                    @df.row[:one] = Daru::Vector.new([44,62,11], index: [:b,:f,:a])
         | 
| 591 | 
            +
             | 
| 592 | 
            +
                    expect(@df.row[:one]).to eq(Daru::Vector.new([11,44,nil], index: [:a,:b,:c]))
         | 
| 602 593 | 
             
                  end
         | 
| 603 594 |  | 
| 604 595 | 
             
                  it "creates a new row from an Array" do
         | 
| 605 596 | 
             
                    @df.row[:patekar] = [9,2,11]
         | 
| 606 597 |  | 
| 607 | 
            -
                    expect(@df[:patekar | 
| 598 | 
            +
                    expect(@df.row[:patekar]).to eq([9,2,11].dv(:patekar, [:a, :b, :c]))
         | 
| 608 599 | 
             
                  end
         | 
| 609 600 |  | 
| 610 601 | 
             
                  it "creates a new row from a DV" do
         | 
| 611 602 | 
             
                    @df.row[:patekar] = [9,2,11].dv(nil, [:a, :b, :c])
         | 
| 612 603 |  | 
| 613 | 
            -
                    expect(@df[:patekar | 
| 604 | 
            +
                    expect(@df.row[:patekar]).to eq([9,2,11].dv(:patekar, [:a, :b, :c]))
         | 
| 614 605 | 
             
                  end
         | 
| 615 606 |  | 
| 616 607 | 
             
                  it "creates a new row from numeric row index and named DV" do
         | 
| 617 608 | 
             
                    @df.row[2] = [9,2,11].dv(nil, [:a, :b, :c])
         | 
| 618 609 |  | 
| 619 | 
            -
                    expect(@df[2 | 
| 610 | 
            +
                    expect(@df.row[2]).to eq([9,2,11].dv(nil, [:a, :b, :c]))
         | 
| 620 611 | 
             
                  end
         | 
| 621 612 |  | 
| 622 613 | 
             
                  it "correctly aligns assigned DV by index" do
         | 
| @@ -685,7 +676,22 @@ describe Daru::DataFrame do | |
| 685 676 | 
             
                        c: [11,22,33]}, order: [:a, :b, :c], 
         | 
| 686 677 | 
             
                        index: [:one, :two, :three])
         | 
| 687 678 | 
             
                      )
         | 
| 688 | 
            -
                  end | 
| 679 | 
            +
                  end
         | 
| 680 | 
            +
             | 
| 681 | 
            +
                  it "returns a row with the given index" do
         | 
| 682 | 
            +
                    expect(@df.row[:one]).to eq([1,11,11].dv(:one, [:a, :b, :c]))
         | 
| 683 | 
            +
                  end
         | 
| 684 | 
            +
             | 
| 685 | 
            +
                  it "returns a row with given Integer index" do
         | 
| 686 | 
            +
                    expect(@df.row[0]).to eq([1,11,11].dv(:one, [:a, :b, :c]))
         | 
| 687 | 
            +
                  end
         | 
| 688 | 
            +
             | 
| 689 | 
            +
                  it "returns a row with given Integer index for default index-less DataFrame" do
         | 
| 690 | 
            +
                    df = Daru::DataFrame.new({b: [11,12,13,14,15], a: [1,2,3,4,5], 
         | 
| 691 | 
            +
                      c: [11,22,33,44,55]}, order: [:a, :b, :c])
         | 
| 692 | 
            +
             | 
| 693 | 
            +
                    expect(df.row[0]).to eq([1,11,11].dv(nil, [:a, :b, :c]))
         | 
| 694 | 
            +
                  end    
         | 
| 689 695 | 
             
                end
         | 
| 690 696 |  | 
| 691 697 | 
             
                context Daru::MultiIndex do
         | 
| @@ -694,22 +700,16 @@ describe Daru::DataFrame do | |
| 694 700 | 
             
                  end
         | 
| 695 701 |  | 
| 696 702 | 
             
                  it "returns a DataFrame when specifying numeric range" do
         | 
| 697 | 
            -
                    sub_index = Daru::MultiIndex. | 
| 703 | 
            +
                    sub_index = Daru::MultiIndex.from_tuples([
         | 
| 698 704 | 
             
                      [:a,:one,:bar],
         | 
| 699 | 
            -
                      [:a,:one,:baz] | 
| 700 | 
            -
                      [:a,:two,:bar],
         | 
| 701 | 
            -
                      [:a,:two,:baz],
         | 
| 702 | 
            -
                      [:b,:one,:bar],
         | 
| 703 | 
            -
                      [:b,:two,:bar],
         | 
| 704 | 
            -
                      [:b,:two,:baz],
         | 
| 705 | 
            -
                      [:b,:one,:foo]
         | 
| 705 | 
            +
                      [:a,:one,:baz]
         | 
| 706 706 | 
             
                    ])
         | 
| 707 707 |  | 
| 708 708 | 
             
                    expect(@df_mi.row[0..1]).to eq(Daru::DataFrame.new([
         | 
| 709 | 
            -
                      [11,12 | 
| 710 | 
            -
                      [1,2 | 
| 711 | 
            -
                      [11,12 | 
| 712 | 
            -
                      [1,2 | 
| 709 | 
            +
                      [11,12],
         | 
| 710 | 
            +
                      [1,2],
         | 
| 711 | 
            +
                      [11,12],
         | 
| 712 | 
            +
                      [1,2]
         | 
| 713 713 | 
             
                    ], order: @order_mi, index: sub_index, name: :numeric_range))
         | 
| 714 714 | 
             
                  end
         | 
| 715 715 |  | 
| @@ -718,7 +718,7 @@ describe Daru::DataFrame do | |
| 718 718 | 
             
                  end
         | 
| 719 719 |  | 
| 720 720 | 
             
                  it "returns DataFrame when specifying first layer of MultiIndex" do
         | 
| 721 | 
            -
                    sub_index = Daru::MultiIndex. | 
| 721 | 
            +
                    sub_index = Daru::MultiIndex.from_tuples([
         | 
| 722 722 | 
             
                      [:one,:bar],
         | 
| 723 723 | 
             
                      [:one,:baz],
         | 
| 724 724 | 
             
                      [:two,:foo],
         | 
| @@ -733,7 +733,7 @@ describe Daru::DataFrame do | |
| 733 733 | 
             
                  end
         | 
| 734 734 |  | 
| 735 735 | 
             
                  it "returns DataFrame when specifying first and second layer of MultiIndex" do
         | 
| 736 | 
            -
                    sub_index = Daru::MultiIndex. | 
| 736 | 
            +
                    sub_index = Daru::MultiIndex.from_tuples([
         | 
| 737 737 | 
             
                      [:bar],
         | 
| 738 738 | 
             
                      [:baz]
         | 
| 739 739 | 
             
                    ])
         | 
| @@ -760,48 +760,6 @@ describe Daru::DataFrame do | |
| 760 760 | 
             
                end
         | 
| 761 761 | 
             
              end
         | 
| 762 762 |  | 
| 763 | 
            -
              context "#vector" do
         | 
| 764 | 
            -
                context Daru::Index do
         | 
| 765 | 
            -
                  it "appends an Array as a Daru::Vector" do
         | 
| 766 | 
            -
                    @data_frame[:d, :vector] = [69,99,108,85,49]
         | 
| 767 | 
            -
             | 
| 768 | 
            -
                    expect(@data_frame.d.class).to eq(Daru::Vector)
         | 
| 769 | 
            -
                  end
         | 
| 770 | 
            -
                end
         | 
| 771 | 
            -
             | 
| 772 | 
            -
                context Daru::MultiIndex do
         | 
| 773 | 
            -
                  it "accesses vector with an integer index" do
         | 
| 774 | 
            -
                    expect(@df_mi.vector[0]).to eq(Daru::Vector.new(@vector_arry1,
         | 
| 775 | 
            -
                      index: @multi_index))
         | 
| 776 | 
            -
                  end
         | 
| 777 | 
            -
             | 
| 778 | 
            -
                  it "returns a vector when specifying full tuple" do
         | 
| 779 | 
            -
                    expect(@df_mi.vector[:a, :one, :bar]).to eq(Daru::Vector.new(@vector_arry1,
         | 
| 780 | 
            -
                      index: @multi_index))
         | 
| 781 | 
            -
                  end
         | 
| 782 | 
            -
             | 
| 783 | 
            -
                  it "returns DataFrame when specified first layer of MultiIndex" do
         | 
| 784 | 
            -
                    sub_order = Daru::MultiIndex.new([
         | 
| 785 | 
            -
                      [:one, :bar],
         | 
| 786 | 
            -
                      [:two, :baz]
         | 
| 787 | 
            -
                      ])
         | 
| 788 | 
            -
                    expect(@df_mi.vector[:a]).to eq(Daru::DataFrame.new([
         | 
| 789 | 
            -
                      @vector_arry1,
         | 
| 790 | 
            -
                      @vector_arry2
         | 
| 791 | 
            -
                    ], index: @multi_index, order: sub_order))
         | 
| 792 | 
            -
                  end
         | 
| 793 | 
            -
             | 
| 794 | 
            -
                  it "returns DataFrame when specified first and second layer of MultiIndex" do
         | 
| 795 | 
            -
                    sub_order = Daru::MultiIndex.new([
         | 
| 796 | 
            -
                      [:bar]
         | 
| 797 | 
            -
                    ])
         | 
| 798 | 
            -
                    expect(@df_mi.vector[:a, :one]).to eq(Daru::DataFrame.new([
         | 
| 799 | 
            -
                      @vector_arry1
         | 
| 800 | 
            -
                    ], index: @multi_index, order: sub_order))
         | 
| 801 | 
            -
                  end
         | 
| 802 | 
            -
                end
         | 
| 803 | 
            -
              end
         | 
| 804 | 
            -
             | 
| 805 763 | 
             
              context "#==" do
         | 
| 806 764 | 
             
                it "compares by vectors, index and values of a DataFrame (ignores name)" do
         | 
| 807 765 | 
             
                  a = Daru::DataFrame.new({b: [11,12,13,14,15], a: [1,2,3,4,5]}, 
         | 
| @@ -824,7 +782,7 @@ describe Daru::DataFrame do | |
| 824 782 | 
             
                    expect(clo.index.object_id)  .not_to eq(@data_frame.object_id)
         | 
| 825 783 |  | 
| 826 784 | 
             
                    @data_frame.each_vector_with_index do |vector, index|
         | 
| 827 | 
            -
                      expect(vector.object_id).not_to eq(clo | 
| 785 | 
            +
                      expect(vector.object_id).not_to eq(clo[index].object_id)
         | 
| 828 786 | 
             
                    end
         | 
| 829 787 | 
             
                  end
         | 
| 830 788 | 
             
                end
         | 
| @@ -1092,18 +1050,14 @@ describe Daru::DataFrame do | |
| 1092 1050 | 
             
                            index: [:one, :two, :three, :four, :five]))    
         | 
| 1093 1051 | 
             
                  end
         | 
| 1094 1052 | 
             
                end
         | 
| 1095 | 
            -
             | 
| 1096 | 
            -
                context Daru::MultiIndex do
         | 
| 1097 | 
            -
                  pending
         | 
| 1098 | 
            -
                end
         | 
| 1099 1053 | 
             
              end
         | 
| 1100 1054 |  | 
| 1101 1055 | 
             
              context "#delete_row" do
         | 
| 1102 1056 | 
             
                it "deletes the specified row" do
         | 
| 1103 | 
            -
                  @data_frame.delete_row : | 
| 1057 | 
            +
                  @data_frame.delete_row :three
         | 
| 1104 1058 |  | 
| 1105 | 
            -
                  expect(@data_frame).to eq(Daru::DataFrame.new({b: [12, | 
| 1106 | 
            -
                  c: [22, | 
| 1059 | 
            +
                  expect(@data_frame).to eq(Daru::DataFrame.new({b: [11,12,14,15], a: [1,2,4,5], 
         | 
| 1060 | 
            +
                  c: [11,22,44,55]}, order: [:a, :b, :c], index: [:one, :two, :four, :five]))
         | 
| 1107 1061 | 
             
                end
         | 
| 1108 1062 | 
             
              end
         | 
| 1109 1063 |  | 
| @@ -1161,10 +1115,6 @@ describe Daru::DataFrame do | |
| 1161 1115 | 
             
                    expect(a).to eq(Daru::DataFrame.new({a: [2], b: [3]}, order: [:a, :b], index: [1]))
         | 
| 1162 1116 | 
             
                  end
         | 
| 1163 1117 | 
             
                end
         | 
| 1164 | 
            -
             | 
| 1165 | 
            -
                context Daru::MultiIndex do
         | 
| 1166 | 
            -
                  pending
         | 
| 1167 | 
            -
                end
         | 
| 1168 1118 | 
             
              end
         | 
| 1169 1119 |  | 
| 1170 1120 | 
             
              context "#filter_vectors" do
         | 
| @@ -1179,10 +1129,6 @@ describe Daru::DataFrame do | |
| 1179 1129 | 
             
                    expect(a).to eq(Daru::DataFrame.new({a: [1,2,3]}))
         | 
| 1180 1130 | 
             
                  end
         | 
| 1181 1131 | 
             
                end
         | 
| 1182 | 
            -
             | 
| 1183 | 
            -
                context Daru::MultiIndex do
         | 
| 1184 | 
            -
                  pending
         | 
| 1185 | 
            -
                end
         | 
| 1186 1132 | 
             
              end
         | 
| 1187 1133 |  | 
| 1188 1134 | 
             
              context "#to_a" do
         | 
| @@ -1321,79 +1267,86 @@ describe Daru::DataFrame do | |
| 1321 1267 | 
             
                    @df_mi.sort([[:a,:one,:bar]])
         | 
| 1322 1268 | 
             
                  end
         | 
| 1323 1269 | 
             
                end
         | 
| 1324 | 
            -
              end | 
| 1270 | 
            +
              end
         | 
| 1325 1271 |  | 
| 1326 | 
            -
              context "# | 
| 1327 | 
            -
                 | 
| 1328 | 
            -
                   | 
| 1272 | 
            +
              context "#index=" do
         | 
| 1273 | 
            +
                before :each do
         | 
| 1274 | 
            +
                  @df = Daru::DataFrame.new({
         | 
| 1275 | 
            +
                    a: [1,2,3,4,5],
         | 
| 1276 | 
            +
                    b: [11,22,33,44,55],
         | 
| 1277 | 
            +
                    c: %w(a b c d e)
         | 
| 1278 | 
            +
                  })
         | 
| 1279 | 
            +
                end
         | 
| 1329 1280 |  | 
| 1330 | 
            -
             | 
| 1331 | 
            -
             | 
| 1332 | 
            -
                  expect( | 
| 1281 | 
            +
                it "simply reassigns the index" do
         | 
| 1282 | 
            +
                  @df.index = Daru::Index.new(['4','foo', :bar, 0, 23])
         | 
| 1283 | 
            +
                  expect(@df.row['foo']).to eq(Daru::Vector.new([2,22,'b'], index: [:a,:b,:c]))
         | 
| 1284 | 
            +
                end
         | 
| 1333 1285 |  | 
| 1334 | 
            -
             | 
| 1335 | 
            -
                  expect | 
| 1336 | 
            -
             | 
| 1286 | 
            +
                it "raises error for improper length index" do
         | 
| 1287 | 
            +
                  expect {
         | 
| 1288 | 
            +
                    @df.index = Daru::Index.new([1,2])
         | 
| 1289 | 
            +
                  }.to raise_error(ArgumentError)
         | 
| 1337 1290 | 
             
                end
         | 
| 1291 | 
            +
              end
         | 
| 1338 1292 |  | 
| 1339 | 
            -
             | 
| 1340 | 
            -
             | 
| 1293 | 
            +
              context "#vectors=" do
         | 
| 1294 | 
            +
                before :each do
         | 
| 1295 | 
            +
                  @df = Daru::DataFrame.new({
         | 
| 1296 | 
            +
                    a: [1,2,3,4,5],
         | 
| 1297 | 
            +
                    b: [11,22,33,44,55],
         | 
| 1298 | 
            +
                    c: %w(a b c d e)
         | 
| 1299 | 
            +
                  })
         | 
| 1300 | 
            +
                end
         | 
| 1341 1301 |  | 
| 1342 | 
            -
             | 
| 1343 | 
            -
             | 
| 1344 | 
            -
                    order: [:a, :b, :c], index: [:a,:b,:c,:d,:e]))
         | 
| 1345 | 
            -
                  expect(a).to_not eq(@data_frame)
         | 
| 1302 | 
            +
                it "simply reassigns vectors" do
         | 
| 1303 | 
            +
                  @df.vectors = Daru::Index.new(['b',0,'m'])
         | 
| 1346 1304 |  | 
| 1347 | 
            -
                  expect( | 
| 1348 | 
            -
                  expect( | 
| 1349 | 
            -
                  expect( | 
| 1305 | 
            +
                  expect(@df.vectors).to eq(Daru::Index.new(['b',0,'m']))
         | 
| 1306 | 
            +
                  expect(@df['b']).to eq(Daru::Vector.new([1,2,3,4,5]))
         | 
| 1307 | 
            +
                  expect(@df[0]).to eq(Daru::Vector.new([11,22,33,44,55]))
         | 
| 1308 | 
            +
                  expect(@df['m']).to eq(Daru::Vector.new(%w(a b c d e)))
         | 
| 1350 1309 | 
             
                end
         | 
| 1351 | 
            -
              end
         | 
| 1352 1310 |  | 
| 1353 | 
            -
             | 
| 1354 | 
            -
             | 
| 1355 | 
            -
             | 
| 1356 | 
            -
             | 
| 1357 | 
            -
                      a: [1,2,3,4,5], c: [11,22,33,44,55]}, order: [:a, :b, :c]))
         | 
| 1358 | 
            -
                    expect(@data_frame.a.index).to eq(Daru::Index.new(5))
         | 
| 1359 | 
            -
                    expect(@data_frame.b.index).to eq(Daru::Index.new(5))
         | 
| 1360 | 
            -
                    expect(@data_frame.c.index).to eq(Daru::Index.new(5))
         | 
| 1361 | 
            -
                  end
         | 
| 1362 | 
            -
             | 
| 1363 | 
            -
                  it "sets a new index for the data frame and its underlying vectors" do
         | 
| 1364 | 
            -
                    expect(@data_frame.reindex!([:a,:b,:c,:d,:e])).to eq(Daru::DataFrame.new(
         | 
| 1365 | 
            -
                      {b: [11,12,13,14,15], a: [1,2,3,4,5], c: [11,22,33,44,55]}, 
         | 
| 1366 | 
            -
                      order: [:a, :b, :c], index: [:a,:b,:c,:d,:e]))
         | 
| 1367 | 
            -
                    expect(@data_frame.a.index).to eq(Daru::Index.new([:a,:b,:c,:d,:e]))
         | 
| 1368 | 
            -
                    expect(@data_frame.b.index).to eq(Daru::Index.new([:a,:b,:c,:d,:e]))
         | 
| 1369 | 
            -
                    expect(@data_frame.c.index).to eq(Daru::Index.new([:a,:b,:c,:d,:e]))
         | 
| 1370 | 
            -
                  end  
         | 
| 1311 | 
            +
                it "raises error for improper length index" do
         | 
| 1312 | 
            +
                  expect {
         | 
| 1313 | 
            +
                    @df.vectors = Daru::Index.new([1,2,'3',4,'5'])
         | 
| 1314 | 
            +
                  }.to raise_error(ArgumentError)
         | 
| 1371 1315 | 
             
                end
         | 
| 1372 | 
            -
             | 
| 1373 | 
            -
                context Daru::MultiIndex do
         | 
| 1374 | 
            -
                  pending "feature manually tested. write tests"
         | 
| 1375 | 
            -
                end  
         | 
| 1376 1316 | 
             
              end
         | 
| 1377 1317 |  | 
| 1378 | 
            -
              context "# | 
| 1379 | 
            -
                 | 
| 1380 | 
            -
                   | 
| 1318 | 
            +
              context "#reindex" do
         | 
| 1319 | 
            +
                it "re indexes and aligns accordingly" do
         | 
| 1320 | 
            +
                  df = Daru::DataFrame.new({
         | 
| 1381 1321 | 
             
                    a: [1,2,3,4,5],
         | 
| 1382 1322 | 
             
                    b: [11,22,33,44,55],
         | 
| 1383 1323 | 
             
                    c: %w(a b c d e)
         | 
| 1384 1324 | 
             
                  })
         | 
| 1325 | 
            +
                  
         | 
| 1326 | 
            +
                  ans = df.reindex(Daru::Index.new([1,3,0,8,2]))
         | 
| 1327 | 
            +
                  expect(ans).to eq(Daru::DataFrame.new({
         | 
| 1328 | 
            +
                    a: [2,4,1,nil,3],
         | 
| 1329 | 
            +
                    b: [22,44,11,nil,33],
         | 
| 1330 | 
            +
                    c: ['b','d','a',nil,'c']
         | 
| 1331 | 
            +
                    }, index: Daru::Index.new([1,3,0,8,2])))
         | 
| 1332 | 
            +
                  expect(ans).to_not eq(df)
         | 
| 1385 1333 | 
             
                end
         | 
| 1334 | 
            +
              end
         | 
| 1386 1335 |  | 
| 1387 | 
            -
             | 
| 1388 | 
            -
             | 
| 1336 | 
            +
              context "#reindex_vectors" do
         | 
| 1337 | 
            +
                it "re indexes vectors and aligns accordingly" do
         | 
| 1338 | 
            +
                  df = Daru::DataFrame.new({
         | 
| 1389 1339 | 
             
                    a: [1,2,3,4,5],
         | 
| 1390 1340 | 
             
                    b: [11,22,33,44,55],
         | 
| 1391 1341 | 
             
                    c: %w(a b c d e)
         | 
| 1392 | 
            -
                  } | 
| 1342 | 
            +
                  })
         | 
| 1393 1343 |  | 
| 1394 | 
            -
                   | 
| 1395 | 
            -
                  expect( | 
| 1396 | 
            -
             | 
| 1344 | 
            +
                  ans = df.reindex_vectors(Daru::Index.new([:b, 'a', :a]))
         | 
| 1345 | 
            +
                  expect(ans).to eq(Daru::DataFrame.new({
         | 
| 1346 | 
            +
                    :b  => [11,22,33,44,55],
         | 
| 1347 | 
            +
                    'a' => [nil, nil, nil, nil, nil],
         | 
| 1348 | 
            +
                    :a  => [1,2,3,4,5]
         | 
| 1349 | 
            +
                  }, order: [:b, 'a', :a]))
         | 
| 1397 1350 | 
             
                end
         | 
| 1398 1351 | 
             
              end
         | 
| 1399 1352 |  | 
| @@ -1476,16 +1429,16 @@ describe Daru::DataFrame do | |
| 1476 1429 | 
             
                  expect(@df.pivot_table(index: [:a])).to eq(Daru::DataFrame.new({
         | 
| 1477 1430 | 
             
                    d: [5.5,2.2],
         | 
| 1478 1431 | 
             
                    e: [11.0,4.4]
         | 
| 1479 | 
            -
                  }, index: [ | 
| 1432 | 
            +
                  }, index: ['bar', 'foo']))
         | 
| 1480 1433 | 
             
                end
         | 
| 1481 1434 |  | 
| 1482 1435 | 
             
                it "creates row index as per (double) index argument and default aggregates to mean" do
         | 
| 1483 | 
            -
                  agg_mi = Daru::MultiIndex. | 
| 1436 | 
            +
                  agg_mi = Daru::MultiIndex.from_tuples(
         | 
| 1484 1437 | 
             
                    [        
         | 
| 1485 | 
            -
                      [ | 
| 1486 | 
            -
                      [ | 
| 1487 | 
            -
                      [ | 
| 1488 | 
            -
                      [ | 
| 1438 | 
            +
                      ['bar', 'large'],
         | 
| 1439 | 
            +
                      ['bar', 'small'],
         | 
| 1440 | 
            +
                      ['foo', 'large'],
         | 
| 1441 | 
            +
                      ['foo', 'small']
         | 
| 1489 1442 | 
             
                    ]
         | 
| 1490 1443 | 
             
                  )
         | 
| 1491 1444 | 
             
                  expect(@df.pivot_table(index: [:a, :c]).round(2)).to eq(Daru::DataFrame.new({
         | 
| @@ -1495,46 +1448,48 @@ describe Daru::DataFrame do | |
| 1495 1448 | 
             
                end
         | 
| 1496 1449 |  | 
| 1497 1450 | 
             
                it "creates row and vector index as per (single) index and (single) vectors args" do
         | 
| 1498 | 
            -
                  agg_vectors = Daru::MultiIndex. | 
| 1499 | 
            -
                    [:d,  | 
| 1500 | 
            -
                    [:d,  | 
| 1501 | 
            -
                    [:e,  | 
| 1502 | 
            -
                    [:e,  | 
| 1451 | 
            +
                  agg_vectors = Daru::MultiIndex.from_tuples([
         | 
| 1452 | 
            +
                    [:d, 'one'],
         | 
| 1453 | 
            +
                    [:d, 'two'],
         | 
| 1454 | 
            +
                    [:e, 'one'],
         | 
| 1455 | 
            +
                    [:e, 'two']
         | 
| 1503 1456 | 
             
                  ])
         | 
| 1504 | 
            -
                  agg_index = Daru::MultiIndex. | 
| 1457 | 
            +
                  agg_index = Daru::MultiIndex.from_tuples(
         | 
| 1505 1458 | 
             
                    [
         | 
| 1506 | 
            -
                      [ | 
| 1507 | 
            -
                      [ | 
| 1459 | 
            +
                      ['bar'],
         | 
| 1460 | 
            +
                      ['foo']
         | 
| 1508 1461 | 
             
                    ]
         | 
| 1509 1462 | 
             
                  )
         | 
| 1510 | 
            -
             | 
| 1511 | 
            -
                  expect(@df.pivot_table(index: [:a], vectors: [:b]).round(2)).to eq( | 
| 1512 | 
            -
                     | 
| 1513 | 
            -
                      [ | 
| 1514 | 
            -
             | 
| 1515 | 
            -
             | 
| 1516 | 
            -
             | 
| 1517 | 
            -
             | 
| 1463 | 
            +
                  
         | 
| 1464 | 
            +
                  expect(@df.pivot_table(index: [:a], vectors: [:b]).round(2)).to eq(
         | 
| 1465 | 
            +
                    Daru::DataFrame.new(
         | 
| 1466 | 
            +
                      [
         | 
| 1467 | 
            +
                        [4.5, 1.67],
         | 
| 1468 | 
            +
                        [6.5,  3.0],
         | 
| 1469 | 
            +
                        [9.0, 3.33],
         | 
| 1470 | 
            +
                        [13,     6]
         | 
| 1471 | 
            +
                      ], order: agg_vectors, index: agg_index)
         | 
| 1472 | 
            +
                  )
         | 
| 1518 1473 | 
             
                end
         | 
| 1519 1474 |  | 
| 1520 1475 | 
             
                it "creates row and vector index as per (single) index and (double) vector args" do
         | 
| 1521 | 
            -
                  agg_vectors = Daru::MultiIndex. | 
| 1476 | 
            +
                  agg_vectors = Daru::MultiIndex.from_tuples(
         | 
| 1522 1477 | 
             
                    [
         | 
| 1523 | 
            -
                      [:d,  | 
| 1524 | 
            -
                      [:d,  | 
| 1525 | 
            -
                      [:d,  | 
| 1526 | 
            -
                      [:d,  | 
| 1527 | 
            -
                      [:e,  | 
| 1528 | 
            -
                      [:e,  | 
| 1529 | 
            -
                      [:e,  | 
| 1530 | 
            -
                      [:e,  | 
| 1478 | 
            +
                      [:d, 'one', 'large'],
         | 
| 1479 | 
            +
                      [:d, 'one', 'small'],
         | 
| 1480 | 
            +
                      [:d, 'two', 'large'],
         | 
| 1481 | 
            +
                      [:d, 'two', 'small'],
         | 
| 1482 | 
            +
                      [:e, 'one', 'large'],
         | 
| 1483 | 
            +
                      [:e, 'one', 'small'],
         | 
| 1484 | 
            +
                      [:e, 'two', 'large'],
         | 
| 1485 | 
            +
                      [:e, 'two', 'small']
         | 
| 1531 1486 | 
             
                    ]
         | 
| 1532 1487 | 
             
                  )
         | 
| 1533 1488 |  | 
| 1534 | 
            -
                  agg_index = Daru::MultiIndex. | 
| 1489 | 
            +
                  agg_index = Daru::MultiIndex.from_tuples(
         | 
| 1535 1490 | 
             
                    [
         | 
| 1536 | 
            -
                      [ | 
| 1537 | 
            -
                      [ | 
| 1491 | 
            +
                      ['bar'],
         | 
| 1492 | 
            +
                      ['foo']
         | 
| 1538 1493 | 
             
                    ]
         | 
| 1539 1494 | 
             
                  )
         | 
| 1540 1495 |  | 
| @@ -1553,21 +1508,21 @@ describe Daru::DataFrame do | |
| 1553 1508 | 
             
                end
         | 
| 1554 1509 |  | 
| 1555 1510 | 
             
                it "creates row and vector index with (double) index and (double) vector args" do
         | 
| 1556 | 
            -
                  agg_index = Daru::MultiIndex. | 
| 1557 | 
            -
                    [ | 
| 1558 | 
            -
                    [ | 
| 1559 | 
            -
                    [ | 
| 1560 | 
            -
                    [ | 
| 1561 | 
            -
                    [ | 
| 1562 | 
            -
                    [ | 
| 1563 | 
            -
                    [ | 
| 1511 | 
            +
                  agg_index = Daru::MultiIndex.from_tuples([
         | 
| 1512 | 
            +
                    ['bar', 4],
         | 
| 1513 | 
            +
                    ['bar', 5],
         | 
| 1514 | 
            +
                    ['bar', 6],
         | 
| 1515 | 
            +
                    ['bar', 7],
         | 
| 1516 | 
            +
                    ['foo', 1],
         | 
| 1517 | 
            +
                    ['foo', 2],
         | 
| 1518 | 
            +
                    ['foo', 3]
         | 
| 1564 1519 | 
             
                  ])
         | 
| 1565 1520 |  | 
| 1566 | 
            -
                  agg_vectors = Daru::MultiIndex. | 
| 1567 | 
            -
                    [:e,  | 
| 1568 | 
            -
                    [:e,  | 
| 1569 | 
            -
                    [:e,  | 
| 1570 | 
            -
                    [:e,  | 
| 1521 | 
            +
                  agg_vectors = Daru::MultiIndex.from_tuples([
         | 
| 1522 | 
            +
                    [:e, 'one', 'large'],
         | 
| 1523 | 
            +
                    [:e, 'one', 'small'],
         | 
| 1524 | 
            +
                    [:e, 'two', 'large'],
         | 
| 1525 | 
            +
                    [:e, 'two', 'small']
         | 
| 1571 1526 | 
             
                  ])
         | 
| 1572 1527 |  | 
| 1573 1528 | 
             
                  expect(@df.pivot_table(index: [:a, :d], vectors: [:b, :c])).to eq(
         | 
| @@ -1582,18 +1537,18 @@ describe Daru::DataFrame do | |
| 1582 1537 | 
             
                end
         | 
| 1583 1538 |  | 
| 1584 1539 | 
             
                it "only aggregates over the vector specified in the values argument" do
         | 
| 1585 | 
            -
                  agg_vectors = Daru::MultiIndex. | 
| 1540 | 
            +
                  agg_vectors = Daru::MultiIndex.from_tuples(
         | 
| 1586 1541 | 
             
                    [
         | 
| 1587 | 
            -
                      [:e,  | 
| 1588 | 
            -
                      [:e,  | 
| 1589 | 
            -
                      [:e,  | 
| 1590 | 
            -
                      [:e,  | 
| 1542 | 
            +
                      [:e, 'one', 'large'],
         | 
| 1543 | 
            +
                      [:e, 'one', 'small'],
         | 
| 1544 | 
            +
                      [:e, 'two', 'large'],
         | 
| 1545 | 
            +
                      [:e, 'two', 'small']
         | 
| 1591 1546 | 
             
                    ]
         | 
| 1592 1547 | 
             
                  )
         | 
| 1593 | 
            -
                  agg_index = Daru::MultiIndex. | 
| 1548 | 
            +
                  agg_index = Daru::MultiIndex.from_tuples(
         | 
| 1594 1549 | 
             
                    [
         | 
| 1595 | 
            -
                      [ | 
| 1596 | 
            -
                      [ | 
| 1550 | 
            +
                      ['bar'],
         | 
| 1551 | 
            +
                      ['foo']
         | 
| 1597 1552 | 
             
                    ]
         | 
| 1598 1553 | 
             
                  )
         | 
| 1599 1554 | 
             
                  expect(@df.pivot_table(index: [:a], vectors: [:b, :c], values: :e)).to eq(
         | 
| @@ -1609,18 +1564,18 @@ describe Daru::DataFrame do | |
| 1609 1564 | 
             
                end
         | 
| 1610 1565 |  | 
| 1611 1566 | 
             
                it "overrides default aggregate function to aggregate over sum" do
         | 
| 1612 | 
            -
                  agg_vectors = Daru::MultiIndex. | 
| 1567 | 
            +
                  agg_vectors = Daru::MultiIndex.from_tuples(
         | 
| 1613 1568 | 
             
                    [
         | 
| 1614 | 
            -
                      [:e,  | 
| 1615 | 
            -
                      [:e,  | 
| 1616 | 
            -
                      [:e,  | 
| 1617 | 
            -
                      [:e,  | 
| 1569 | 
            +
                      [:e, 'one', 'large'],
         | 
| 1570 | 
            +
                      [:e, 'one', 'small'],
         | 
| 1571 | 
            +
                      [:e, 'two', 'large'],
         | 
| 1572 | 
            +
                      [:e, 'two', 'small']
         | 
| 1618 1573 | 
             
                    ]
         | 
| 1619 1574 | 
             
                  )
         | 
| 1620 | 
            -
                  agg_index = Daru::MultiIndex. | 
| 1575 | 
            +
                  agg_index = Daru::MultiIndex.from_tuples(
         | 
| 1621 1576 | 
             
                    [
         | 
| 1622 | 
            -
                      [ | 
| 1623 | 
            -
                      [ | 
| 1577 | 
            +
                      ['bar'],
         | 
| 1578 | 
            +
                      ['foo']
         | 
| 1624 1579 | 
             
                    ]
         | 
| 1625 1580 | 
             
                  )
         | 
| 1626 1581 | 
             
                  expect(@df.pivot_table(index: [:a], vectors: [:b, :c], values: :e, agg: :sum)).to eq(
         | 
| @@ -1908,15 +1863,15 @@ describe Daru::DataFrame do | |
| 1908 1863 | 
             
                  df = Daru::DataFrame.crosstab_by_assignation(v1, v2, v3)
         | 
| 1909 1864 |  | 
| 1910 1865 | 
             
                  expect(df[:_id].type).to eq(:object)
         | 
| 1911 | 
            -
                  expect(df[ | 
| 1912 | 
            -
                  expect(df[ | 
| 1866 | 
            +
                  expect(df['a'].type).to eq(:numeric)
         | 
| 1867 | 
            +
                  expect(df['b'].type).to eq(:numeric)
         | 
| 1913 1868 |  | 
| 1914 1869 | 
             
                  ev_id = Daru::Vector.new %w(a b c)
         | 
| 1915 1870 | 
             
                  ev_a  = Daru::Vector.new [0, 0, 0]
         | 
| 1916 1871 | 
             
                  ev_b  = Daru::Vector.new [1, 1, 0]
         | 
| 1917 1872 | 
             
                  ev_c  = Daru::Vector.new [0, 1, 1]
         | 
| 1918 1873 | 
             
                  df2 = Daru::DataFrame.new({ 
         | 
| 1919 | 
            -
                    :_id => ev_id,  | 
| 1874 | 
            +
                    :_id => ev_id, 'a' => ev_a, 'b' => ev_b, 'c' => ev_c })
         | 
| 1920 1875 |  | 
| 1921 1876 | 
             
                  expect(df2).to eq(df)
         | 
| 1922 1877 | 
             
                end
         | 
| @@ -1929,19 +1884,21 @@ describe Daru::DataFrame do | |
| 1929 1884 | 
             
                    ['2', 'fred', 'green', 15, 'orange', 30, 'white', 20],
         | 
| 1930 1885 | 
             
                    ['3', 'alfred', nil, nil, nil, nil, nil, nil]
         | 
| 1931 1886 | 
             
                  ]
         | 
| 1887 | 
            +
             | 
| 1932 1888 | 
             
                  df = Daru::DataFrame.rows(rows, 
         | 
| 1933 | 
            -
                    order: [ | 
| 1934 | 
            -
                       | 
| 1889 | 
            +
                    order: ['id', 'name', 'car_color1', 'car_value1', 'car_color2', 
         | 
| 1890 | 
            +
                      'car_value2', 'car_color3', 'car_value3'])
         | 
| 1935 1891 |  | 
| 1936 1892 | 
             
                  ids     = Daru::Vector.new %w(1 1 2 2 2)
         | 
| 1937 1893 | 
             
                  colors  = Daru::Vector.new %w(red blue green orange white)
         | 
| 1938 1894 | 
             
                  values  = Daru::Vector.new [10, 20, 15, 30, 20]
         | 
| 1939 1895 | 
             
                  col_ids = Daru::Vector.new [1, 2, 1, 2, 3]
         | 
| 1896 | 
            +
             | 
| 1940 1897 | 
             
                  df_expected = Daru::DataFrame.new({
         | 
| 1941 | 
            -
                     | 
| 1942 | 
            -
                    }, order: [ | 
| 1898 | 
            +
                    'id' => ids, '_col_id' => col_ids, 'color' => colors, 'value' => values
         | 
| 1899 | 
            +
                    }, order: ['id', '_col_id', 'color', 'value'])
         | 
| 1943 1900 |  | 
| 1944 | 
            -
                  expect(df.one_to_many([ | 
| 1901 | 
            +
                  expect(df.one_to_many(['id'], 'car_%v%n')).to eq(df_expected)
         | 
| 1945 1902 | 
             
                end
         | 
| 1946 1903 | 
             
              end
         | 
| 1947 1904 |  | 
| @@ -2023,7 +1980,7 @@ describe Daru::DataFrame do | |
| 2023 1980 |  | 
| 2024 1981 | 
             
                context Daru::MultiIndex do
         | 
| 2025 1982 | 
             
                  before do
         | 
| 2026 | 
            -
                    agg_vectors = Daru::MultiIndex. | 
| 1983 | 
            +
                    agg_vectors = Daru::MultiIndex.from_tuples(
         | 
| 2027 1984 | 
             
                      [
         | 
| 2028 1985 | 
             
                        [:d, :one, :large],
         | 
| 2029 1986 | 
             
                        [:d, :one, :small],
         | 
| @@ -2036,7 +1993,7 @@ describe Daru::DataFrame do | |
| 2036 1993 | 
             
                      ]
         | 
| 2037 1994 | 
             
                    )
         | 
| 2038 1995 |  | 
| 2039 | 
            -
                    agg_index = Daru::MultiIndex. | 
| 1996 | 
            +
                    agg_index = Daru::MultiIndex.from_tuples(
         | 
| 2040 1997 | 
             
                      [
         | 
| 2041 1998 | 
             
                        [:bar],
         | 
| 2042 1999 | 
             
                        [:foo]
         | 
| @@ -2057,7 +2014,7 @@ describe Daru::DataFrame do | |
| 2057 2014 | 
             
                  end
         | 
| 2058 2015 |  | 
| 2059 2016 | 
             
                  it "returns numeric vectors" do
         | 
| 2060 | 
            -
                    vectors = Daru::MultiIndex. | 
| 2017 | 
            +
                    vectors = Daru::MultiIndex.from_tuples(
         | 
| 2061 2018 | 
             
                      [
         | 
| 2062 2019 | 
             
                        [:d, :one, :large],
         | 
| 2063 2020 | 
             
                        [:d, :two, :large],
         | 
| @@ -2068,7 +2025,7 @@ describe Daru::DataFrame do | |
| 2068 2025 | 
             
                      ]
         | 
| 2069 2026 | 
             
                    )
         | 
| 2070 2027 |  | 
| 2071 | 
            -
                    index = Daru::MultiIndex. | 
| 2028 | 
            +
                    index = Daru::MultiIndex.from_tuples(
         | 
| 2072 2029 | 
             
                      [
         | 
| 2073 2030 | 
             
                        [:bar],
         | 
| 2074 2031 | 
             
                        [:foo]
         | 
| @@ -2089,4 +2046,45 @@ describe Daru::DataFrame do | |
| 2089 2046 | 
             
                  end
         | 
| 2090 2047 | 
             
                end
         | 
| 2091 2048 | 
             
              end
         | 
| 2049 | 
            +
             | 
| 2050 | 
            +
              context "#set_index" do
         | 
| 2051 | 
            +
                before(:each) do
         | 
| 2052 | 
            +
                  @df = Daru::DataFrame.new({
         | 
| 2053 | 
            +
                    a: [1,2,3,4,5],
         | 
| 2054 | 
            +
                    b: ['a','b','c','d','e'],
         | 
| 2055 | 
            +
                    c: [11,22,33,44,55]
         | 
| 2056 | 
            +
                    })
         | 
| 2057 | 
            +
                end
         | 
| 2058 | 
            +
             | 
| 2059 | 
            +
                it "sets a particular column as the index and deletes that column" do
         | 
| 2060 | 
            +
                  @df.set_index(:b)
         | 
| 2061 | 
            +
                  expect(@df).to eq(
         | 
| 2062 | 
            +
                    Daru::DataFrame.new({
         | 
| 2063 | 
            +
                      a: [1,2,3,4,5],
         | 
| 2064 | 
            +
                      c: [11,22,33,44,55]
         | 
| 2065 | 
            +
                      }, index: ['a','b','c','d','e'])
         | 
| 2066 | 
            +
                    )
         | 
| 2067 | 
            +
                end
         | 
| 2068 | 
            +
             | 
| 2069 | 
            +
                it "sets a particular column as index but keeps that column" do
         | 
| 2070 | 
            +
                  expect(@df.set_index(:c, keep: true)).to eq(
         | 
| 2071 | 
            +
                    Daru::DataFrame.new({
         | 
| 2072 | 
            +
                      a: [1,2,3,4,5],
         | 
| 2073 | 
            +
                      b: ['a','b','c','d','e'],
         | 
| 2074 | 
            +
                      c: [11,22,33,44,55]
         | 
| 2075 | 
            +
                      }, index: [11,22,33,44,55]))
         | 
| 2076 | 
            +
                  expect(@df[:c]).to eq(@df[:c])
         | 
| 2077 | 
            +
                end
         | 
| 2078 | 
            +
             | 
| 2079 | 
            +
                it "raises error if all elements in the column aren't unique" do
         | 
| 2080 | 
            +
                  jholu = Daru::DataFrame.new({
         | 
| 2081 | 
            +
                    a: ['a','b','a'],
         | 
| 2082 | 
            +
                    b: [1,2,4]
         | 
| 2083 | 
            +
                    })
         | 
| 2084 | 
            +
             | 
| 2085 | 
            +
                  expect {
         | 
| 2086 | 
            +
                    jholu.set_index(:a)
         | 
| 2087 | 
            +
                  }.to raise_error(ArgumentError)
         | 
| 2088 | 
            +
                end
         | 
| 2089 | 
            +
              end
         | 
| 2092 2090 | 
             
            end if mri?
         |