daru 0.1.5 → 0.1.6
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/.rubocop.yml +20 -7
- data/CONTRIBUTING.md +1 -1
- data/History.md +48 -1
- data/README.md +3 -3
- data/benchmarks/statistics.rb +6 -6
- data/benchmarks/where_clause.rb +1 -1
- data/benchmarks/where_vs_filter.rb +1 -1
- data/daru.gemspec +3 -2
- data/lib/daru.rb +14 -6
- data/lib/daru/accessors/gsl_wrapper.rb +1 -1
- data/lib/daru/accessors/nmatrix_wrapper.rb +2 -0
- data/lib/daru/category.rb +1 -1
- data/lib/daru/core/group_by.rb +32 -15
- data/lib/daru/core/query.rb +4 -4
- data/lib/daru/dataframe.rb +196 -48
- data/lib/daru/date_time/index.rb +7 -5
- data/lib/daru/formatters/table.rb +1 -0
- data/lib/daru/index/index.rb +121 -33
- data/lib/daru/index/multi_index.rb +83 -3
- data/lib/daru/io/csv/converters.rb +18 -0
- data/lib/daru/io/io.rb +80 -11
- data/lib/daru/io/sql_data_source.rb +10 -0
- data/lib/daru/iruby/templates/dataframe.html.erb +3 -50
- data/lib/daru/iruby/templates/dataframe_mi.html.erb +3 -56
- data/lib/daru/iruby/templates/dataframe_mi_tbody.html.erb +35 -0
- data/lib/daru/iruby/templates/dataframe_mi_thead.html.erb +21 -0
- data/lib/daru/iruby/templates/dataframe_tbody.html.erb +28 -0
- data/lib/daru/iruby/templates/dataframe_thead.html.erb +21 -0
- data/lib/daru/iruby/templates/vector.html.erb +3 -25
- data/lib/daru/iruby/templates/vector_mi.html.erb +3 -34
- data/lib/daru/iruby/templates/vector_mi_tbody.html.erb +26 -0
- data/lib/daru/iruby/templates/vector_mi_thead.html.erb +8 -0
- data/lib/daru/iruby/templates/vector_tbody.html.erb +17 -0
- data/lib/daru/iruby/templates/vector_thead.html.erb +8 -0
- data/lib/daru/maths/statistics/dataframe.rb +9 -11
- data/lib/daru/maths/statistics/vector.rb +139 -32
- data/lib/daru/plotting/gruff/dataframe.rb +13 -15
- data/lib/daru/plotting/nyaplot/category.rb +1 -1
- data/lib/daru/plotting/nyaplot/dataframe.rb +4 -4
- data/lib/daru/plotting/nyaplot/vector.rb +1 -2
- data/lib/daru/vector.rb +169 -80
- data/lib/daru/version.rb +1 -1
- data/spec/category_spec.rb +19 -19
- data/spec/core/group_by_spec.rb +47 -0
- data/spec/core/query_spec.rb +55 -50
- data/spec/daru_spec.rb +22 -0
- data/spec/dataframe_spec.rb +118 -6
- data/spec/date_time/index_spec.rb +34 -16
- data/spec/extensions/rserve_spec.rb +1 -1
- data/spec/fixtures/boolean_converter_test.csv +5 -0
- data/spec/fixtures/eciresults.html +394 -0
- data/spec/fixtures/empty_rows_test.csv +17 -0
- data/spec/fixtures/macau.html +3691 -0
- data/spec/fixtures/macd_data.csv +150 -0
- data/spec/fixtures/moneycontrol.html +6812 -0
- data/spec/fixtures/url_test.txt~ +0 -0
- data/spec/fixtures/valid_markup.html +62 -0
- data/spec/fixtures/wiki_climate.html +1243 -0
- data/spec/fixtures/wiki_table_info.html +631 -0
- data/spec/formatters/table_formatter_spec.rb +29 -0
- data/spec/index/categorical_index_spec.rb +33 -33
- data/spec/index/index_spec.rb +134 -41
- data/spec/index/multi_index_spec.rb +115 -31
- data/spec/io/io_spec.rb +201 -0
- data/spec/io/sql_data_source_spec.rb +31 -41
- data/spec/iruby/dataframe_spec.rb +17 -19
- data/spec/iruby/vector_spec.rb +26 -28
- data/spec/maths/statistics/vector_spec.rb +136 -14
- data/spec/plotting/gruff/category_spec.rb +3 -3
- data/spec/plotting/gruff/dataframe_spec.rb +14 -4
- data/spec/plotting/gruff/vector_spec.rb +9 -9
- data/spec/plotting/nyaplot/category_spec.rb +5 -9
- data/spec/plotting/nyaplot/dataframe_spec.rb +72 -47
- data/spec/plotting/nyaplot/vector_spec.rb +5 -11
- data/spec/shared/vector_display_spec.rb +12 -14
- data/spec/spec_helper.rb +21 -0
- data/spec/support/matchers.rb +5 -0
- data/spec/vector_spec.rb +222 -72
- metadata +68 -23
- data/spec/fixtures/stock_data.csv +0 -500
@@ -7,12 +7,12 @@ module Daru
|
|
7
7
|
size = opts[:size] || 500
|
8
8
|
x = extract_x_vector opts[:x]
|
9
9
|
y = extract_y_vectors opts[:y]
|
10
|
-
|
11
|
-
return plot_with_category(size, type, x, y, opts[:categorized])
|
12
|
-
end
|
10
|
+
type = process_type type, opts[:categorized]
|
13
11
|
case type
|
14
12
|
when :line, :bar, :scatter
|
15
13
|
plot = send("#{type}_plot", size, x, y)
|
14
|
+
when :scatter_categorized
|
15
|
+
plot = scatter_with_category(size, x, y, opts[:categorized])
|
16
16
|
# TODO: hist, box
|
17
17
|
# It turns out hist and box are not supported in Gruff yet
|
18
18
|
else
|
@@ -24,6 +24,10 @@ module Daru
|
|
24
24
|
|
25
25
|
private
|
26
26
|
|
27
|
+
def process_type type, categorized
|
28
|
+
type == :scatter && categorized ? :scatter_categorized : type
|
29
|
+
end
|
30
|
+
|
27
31
|
def line_plot size, x, y
|
28
32
|
plot = Gruff::Line.new size
|
29
33
|
plot.labels = size.times.to_a.zip(x).to_h
|
@@ -50,21 +54,15 @@ module Daru
|
|
50
54
|
plot
|
51
55
|
end
|
52
56
|
|
53
|
-
def
|
57
|
+
def scatter_with_category size, x, y, opts
|
54
58
|
x = Daru::Vector.new x
|
55
59
|
y = y.first
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
bools = cat_dv.eq cat
|
62
|
-
plot.data cat, x.where(bools).to_a, y.where(bools).to_a
|
63
|
-
end
|
64
|
-
else
|
65
|
-
raise ArgumentError, "Type #{type} is not supported."
|
60
|
+
plot = Gruff::Scatter.new size
|
61
|
+
cat_dv = self[opts[:by]]
|
62
|
+
cat_dv.categories.each do |cat|
|
63
|
+
bools = cat_dv.eq cat
|
64
|
+
plot.data cat, x.where(bools).to_a, y.where(bools).to_a
|
66
65
|
end
|
67
|
-
yield plot if block_given?
|
68
66
|
plot
|
69
67
|
end
|
70
68
|
|
@@ -38,7 +38,7 @@ module Daru
|
|
38
38
|
|
39
39
|
diagram =
|
40
40
|
case
|
41
|
-
when !([
|
41
|
+
when !(%i[scatter bar line histogram] & types).empty?
|
42
42
|
plot_regular_diagrams plot, opts
|
43
43
|
when types.include?(:box)
|
44
44
|
plot_box_diagram plot
|
@@ -48,7 +48,7 @@ module Daru
|
|
48
48
|
|
49
49
|
yield(plot, diagram) if block_given?
|
50
50
|
|
51
|
-
plot
|
51
|
+
plot
|
52
52
|
end
|
53
53
|
|
54
54
|
def plot_with_category opts
|
@@ -66,8 +66,8 @@ module Daru
|
|
66
66
|
|
67
67
|
plot.legend true
|
68
68
|
yield plot, *diagrams if block_given?
|
69
|
-
plot.show
|
70
69
|
|
70
|
+
plot
|
71
71
|
else
|
72
72
|
raise ArgumentError, "Unsupported type #{type}"
|
73
73
|
end
|
@@ -102,7 +102,7 @@ module Daru
|
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
|
-
SHAPES = %w
|
105
|
+
SHAPES = %w[circle triangle-up diamond square triangle-down cross].freeze
|
106
106
|
def get_shape type
|
107
107
|
validate_type type, :scatter
|
108
108
|
SHAPES.cycle
|
data/lib/daru/vector.rb
CHANGED
@@ -352,7 +352,7 @@ module Daru
|
|
352
352
|
if other.is_a?(Daru::Vector)
|
353
353
|
mod.apply_vector_operator operator, self, other
|
354
354
|
else
|
355
|
-
mod.apply_scalar_operator operator, @data,other
|
355
|
+
mod.apply_scalar_operator operator, @data, other
|
356
356
|
end
|
357
357
|
end
|
358
358
|
alias_method operator, method if operator != :== && operator != :!=
|
@@ -462,6 +462,26 @@ module Daru
|
|
462
462
|
values.any? { |v| include_with_nan? @data, v }
|
463
463
|
end
|
464
464
|
|
465
|
+
# @note Do not use it to check for Float::NAN as
|
466
|
+
# Float::NAN == Float::NAN is false
|
467
|
+
# Return vector of booleans with value at ith position is either
|
468
|
+
# true or false depending upon whether value at position i is equal to
|
469
|
+
# any of the values passed in the argument or not
|
470
|
+
# @param [Array] *values values to equate with
|
471
|
+
# @return [Daru::Vector] vector of boolean values
|
472
|
+
# @example
|
473
|
+
# dv = Daru::Vector.new [1, 2, 3, 2, 1]
|
474
|
+
# dv.is_values 1, 2
|
475
|
+
# # => #<Daru::Vector(5)>
|
476
|
+
# # 0 true
|
477
|
+
# # 1 true
|
478
|
+
# # 2 false
|
479
|
+
# # 3 true
|
480
|
+
# # 4 true
|
481
|
+
def is_values(*values)
|
482
|
+
Daru::Vector.new values.map { |v| eq(v) }.inject(:|)
|
483
|
+
end
|
484
|
+
|
465
485
|
# Append an element to the vector by specifying the element and index
|
466
486
|
def concat element, index
|
467
487
|
raise IndexError, 'Expected new unique index' if @index.include? index
|
@@ -481,8 +501,7 @@ module Daru
|
|
481
501
|
# * +:dtype+ - :array for Ruby Array. :nmatrix for NMatrix.
|
482
502
|
def cast opts={}
|
483
503
|
dt = opts[:dtype]
|
484
|
-
raise ArgumentError, "Unsupported dtype #{opts[:dtype]}" unless
|
485
|
-
dt == :array || dt == :nmatrix || dt == :gsl
|
504
|
+
raise ArgumentError, "Unsupported dtype #{opts[:dtype]}" unless %i[array nmatrix gsl].include?(dt)
|
486
505
|
|
487
506
|
@data = cast_vector_to dt unless @dtype == dt
|
488
507
|
end
|
@@ -535,7 +554,7 @@ module Daru
|
|
535
554
|
# Get index of element
|
536
555
|
def index_of element
|
537
556
|
case dtype
|
538
|
-
when :array then @index.key
|
557
|
+
when :array then @index.key(@data.index { |x| x.eql? element })
|
539
558
|
else @index.key @data.index(element)
|
540
559
|
end
|
541
560
|
end
|
@@ -583,6 +602,31 @@ module Daru
|
|
583
602
|
Daru::Vector.new(vector, index: index, name: @name, dtype: @dtype)
|
584
603
|
end
|
585
604
|
|
605
|
+
# Sorts the vector according to it's`Index` values. Defaults to ascending
|
606
|
+
# order sorting.
|
607
|
+
#
|
608
|
+
# @param [Hash] opts the options for sort_by_index method.
|
609
|
+
# @option opts [Boolean] :ascending false, will sort `index` in
|
610
|
+
# descending order.
|
611
|
+
#
|
612
|
+
# @return [Vector] new sorted `Vector` according to the index values.
|
613
|
+
#
|
614
|
+
# @example
|
615
|
+
#
|
616
|
+
# dv = Daru::Vector.new [11, 13, 12], index: [23, 21, 22]
|
617
|
+
# # Say you want to sort index in ascending order
|
618
|
+
# dv.sort_by_index(ascending: true)
|
619
|
+
# #=> Daru::Vector.new [13, 12, 11], index: [21, 22, 23]
|
620
|
+
# # Say you want to sort index in descending order
|
621
|
+
# dv.sort_by_index(ascending: false)
|
622
|
+
# #=> Daru::Vector.new [11, 12, 13], index: [23, 22, 21]
|
623
|
+
def sort_by_index opts={}
|
624
|
+
opts = {ascending: true}.merge(opts)
|
625
|
+
_, new_order = resort_index(@index.each_with_index, opts).transpose
|
626
|
+
|
627
|
+
reorder new_order
|
628
|
+
end
|
629
|
+
|
586
630
|
DEFAULT_SORTER = lambda { |(lv, li), (rv, ri)|
|
587
631
|
case
|
588
632
|
when lv.nil? && rv.nil?
|
@@ -624,7 +668,7 @@ module Daru
|
|
624
668
|
def delete_if
|
625
669
|
return to_enum(:delete_if) unless block_given?
|
626
670
|
|
627
|
-
keep_e, keep_i = each_with_index.
|
671
|
+
keep_e, keep_i = each_with_index.reject { |n, _i| yield(n) }.transpose
|
628
672
|
|
629
673
|
@data = cast_vector_to @dtype, keep_e
|
630
674
|
@index = Daru::Index.new(keep_i)
|
@@ -702,31 +746,6 @@ module Daru
|
|
702
746
|
self
|
703
747
|
end
|
704
748
|
|
705
|
-
# Returns a vector which has *true* in the position where the element in self
|
706
|
-
# is nil, and false otherwise.
|
707
|
-
#
|
708
|
-
# == Usage
|
709
|
-
#
|
710
|
-
# v = Daru::Vector.new([1,2,4,nil])
|
711
|
-
# v.is_nil?
|
712
|
-
# # =>
|
713
|
-
# #<Daru::Vector:89421000 @name = nil @size = 4 >
|
714
|
-
# # nil
|
715
|
-
# # 0 false
|
716
|
-
# # 1 false
|
717
|
-
# # 2 false
|
718
|
-
# # 3 true
|
719
|
-
#
|
720
|
-
def is_nil?
|
721
|
-
# FIXME: EXTREMELY bad name for method not returning boolean - zverok, 2016-05-18
|
722
|
-
recode(&:nil?)
|
723
|
-
end
|
724
|
-
|
725
|
-
# Opposite of #is_nil?
|
726
|
-
def not_nil?
|
727
|
-
recode { |v| !v.nil? }
|
728
|
-
end
|
729
|
-
|
730
749
|
# Replace all nils in the vector with the value passed as an argument. Destructive.
|
731
750
|
# See #replace_nils for non-destructive version
|
732
751
|
#
|
@@ -741,27 +760,43 @@ module Daru
|
|
741
760
|
self
|
742
761
|
end
|
743
762
|
|
744
|
-
# Lags the series by k periods.
|
763
|
+
# Lags the series by `k` periods.
|
764
|
+
#
|
765
|
+
# Lags the series by `k` periods, "shifting" data and inserting `nil`s
|
766
|
+
# from beginning or end of a vector, while preserving original vector's
|
767
|
+
# size.
|
768
|
+
#
|
769
|
+
# `k` can be positive or negative integer. If `k` is positive, `nil`s
|
770
|
+
# are inserted at the beginning of the vector, otherwise they are
|
771
|
+
# inserted at the end.
|
745
772
|
#
|
746
|
-
#
|
747
|
-
#
|
748
|
-
# same as the original.
|
773
|
+
# @param [Integer] k "shift" the series by `k` periods. `k` can be
|
774
|
+
# positive or negative. (default = 1)
|
749
775
|
#
|
750
|
-
#
|
776
|
+
# @return [Daru::Vector] a new vector with "shifted" inital values
|
777
|
+
# and `nil` values inserted. The return vector is the same length
|
778
|
+
# as the orignal vector.
|
751
779
|
#
|
752
|
-
#
|
753
|
-
#
|
780
|
+
# @example Lag a vector with different periods `k`
|
781
|
+
#
|
782
|
+
# ts = Daru::Vector.new(1..5)
|
783
|
+
# # => [1, 2, 3, 4, 5]
|
784
|
+
#
|
785
|
+
# ts.lag # => [nil, 1, 2, 3, 4]
|
786
|
+
# ts.lag(1) # => [nil, 1, 2, 3, 4]
|
787
|
+
# ts.lag(2) # => [nil, nil, 1, 2, 3]
|
788
|
+
# ts.lag(-1) # => [2, 3, 4, 5, nil]
|
754
789
|
#
|
755
|
-
# ts.lag # => [nil, 0.69, 0.23, 0.44, ...]
|
756
|
-
# ts.lag(2) # => [nil, nil, 0.69, 0.23, ...]
|
757
790
|
def lag k=1
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
791
|
+
case k
|
792
|
+
when 0 then dup
|
793
|
+
when 1...size
|
794
|
+
copy([nil] * k + data.to_a)
|
795
|
+
when -size..-1
|
796
|
+
copy(data.to_a[k.abs...size])
|
797
|
+
else
|
798
|
+
copy([])
|
799
|
+
end
|
765
800
|
end
|
766
801
|
|
767
802
|
def detach_index
|
@@ -871,7 +906,9 @@ module Daru
|
|
871
906
|
end
|
872
907
|
|
873
908
|
# Convert to html for iruby
|
874
|
-
def to_html
|
909
|
+
def to_html(threshold=30)
|
910
|
+
table_thead = to_html_thead
|
911
|
+
table_tbody = to_html_tbody(threshold)
|
875
912
|
path = if index.is_a?(MultiIndex)
|
876
913
|
File.expand_path('../iruby/templates/vector_mi.html.erb', __FILE__)
|
877
914
|
else
|
@@ -880,51 +917,97 @@ module Daru
|
|
880
917
|
ERB.new(File.read(path).strip).result(binding)
|
881
918
|
end
|
882
919
|
|
920
|
+
def to_html_thead
|
921
|
+
table_thead_path =
|
922
|
+
if index.is_a?(MultiIndex)
|
923
|
+
File.expand_path('../iruby/templates/vector_mi_thead.html.erb', __FILE__)
|
924
|
+
else
|
925
|
+
File.expand_path('../iruby/templates/vector_thead.html.erb', __FILE__)
|
926
|
+
end
|
927
|
+
ERB.new(File.read(table_thead_path).strip).result(binding)
|
928
|
+
end
|
929
|
+
|
930
|
+
def to_html_tbody(threshold=30)
|
931
|
+
table_tbody_path =
|
932
|
+
if index.is_a?(MultiIndex)
|
933
|
+
File.expand_path('../iruby/templates/vector_mi_tbody.html.erb', __FILE__)
|
934
|
+
else
|
935
|
+
File.expand_path('../iruby/templates/vector_tbody.html.erb', __FILE__)
|
936
|
+
end
|
937
|
+
ERB.new(File.read(table_tbody_path).strip).result(binding)
|
938
|
+
end
|
939
|
+
|
883
940
|
def to_s
|
884
|
-
|
941
|
+
"#<#{self.class}#{': ' + @name.to_s if @name}(#{size})#{':category' if category?}>"
|
885
942
|
end
|
886
943
|
|
887
|
-
# Create a summary of the Vector
|
888
|
-
|
889
|
-
|
944
|
+
# Create a summary of the Vector
|
945
|
+
# @params [Fixnum] indent_level
|
946
|
+
# @return [String] String containing the summary of the Vector
|
947
|
+
# @example
|
948
|
+
# dv = Daru::Vector.new [1, 2, 3]
|
949
|
+
# puts dv.summary
|
950
|
+
#
|
951
|
+
# # =
|
952
|
+
# # n :3
|
953
|
+
# # non-missing:3
|
954
|
+
# # median: 2
|
955
|
+
# # mean: 2.0000
|
956
|
+
# # std.dev.: 1.0000
|
957
|
+
# # std.err.: 0.5774
|
958
|
+
# # skew: 0.0000
|
959
|
+
# # kurtosis: -2.3333
|
960
|
+
def summary(indent_level=0)
|
961
|
+
non_missing = size - count_values(*Daru::MISSING_VALUES)
|
962
|
+
summary = ' =' * indent_level + "= #{name}" \
|
963
|
+
"\n n :#{size}" \
|
964
|
+
"\n non-missing:#{non_missing}"
|
965
|
+
case type
|
966
|
+
when :object
|
967
|
+
summary << object_summary
|
968
|
+
when :numeric
|
969
|
+
summary << numeric_summary
|
970
|
+
end
|
971
|
+
summary.split("\n").join("\n" + ' ' * indent_level)
|
890
972
|
end
|
891
973
|
|
892
|
-
#
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
s.text "mode: #{mode}"
|
900
|
-
|
901
|
-
s.table(name: 'Distribution') do |t|
|
902
|
-
frequencies.sort_by(&:to_s).each do |k,v|
|
903
|
-
key = @index.include?(k) ? @index[k] : k
|
904
|
-
t.row [key, v, ('%0.2f%%' % (v.quo(count_values(*Daru::MISSING_VALUES))*100))]
|
905
|
-
end
|
906
|
-
end
|
907
|
-
end
|
974
|
+
# Displays summary for an object type Vector
|
975
|
+
# @return [String] String containing object vector summary
|
976
|
+
def object_summary
|
977
|
+
nval = count_values(*Daru::MISSING_VALUES)
|
978
|
+
summary = "\n factors: #{factors.to_a.join(',')}" \
|
979
|
+
"\n mode: #{mode.to_a.join(',')}" \
|
980
|
+
"\n Distribution\n"
|
908
981
|
|
909
|
-
|
910
|
-
|
911
|
-
s.text 'mean: %0.4f' % mean
|
912
|
-
if sd
|
913
|
-
s.text 'std.dev.: %0.4f' % sd
|
914
|
-
s.text 'std.err.: %0.4f' % se
|
915
|
-
s.text 'skew: %0.4f' % skew
|
916
|
-
s.text 'kurtosis: %0.4f' % kurtosis
|
917
|
-
end
|
918
|
-
end
|
982
|
+
data = frequencies.sort.each_with_index.map do |v, k|
|
983
|
+
[k, v, '%0.2f%%' % ((nval.zero? ? 1 : v.quo(nval))*100)]
|
919
984
|
end
|
985
|
+
|
986
|
+
summary + Formatters::Table.format(data)
|
987
|
+
end
|
988
|
+
|
989
|
+
# Displays summary for an numeric type Vector
|
990
|
+
# @return [String] String containing numeric vector summary
|
991
|
+
def numeric_summary
|
992
|
+
summary = "\n median: #{median}" +
|
993
|
+
"\n mean: %0.4f" % mean
|
994
|
+
if sd
|
995
|
+
summary << "\n std.dev.: %0.4f" % sd +
|
996
|
+
"\n std.err.: %0.4f" % se
|
997
|
+
end
|
998
|
+
|
999
|
+
if count_values(*Daru::MISSING_VALUES).zero?
|
1000
|
+
summary << "\n skew: %0.4f" % skew +
|
1001
|
+
"\n kurtosis: %0.4f" % kurtosis
|
1002
|
+
end
|
1003
|
+
summary
|
920
1004
|
end
|
921
|
-
# :nocov:
|
922
1005
|
|
923
1006
|
# Over rides original inspect for pretty printing in irb
|
924
1007
|
def inspect spacing=20, threshold=15
|
925
1008
|
row_headers = index.is_a?(MultiIndex) ? index.sparse_tuples : index.to_a
|
926
1009
|
|
927
|
-
"#<#{self.class}(#{size})#{':
|
1010
|
+
"#<#{self.class}(#{size})#{':category' if category?}>\n" +
|
928
1011
|
Formatters::Table.format(
|
929
1012
|
to_a.lazy.map { |v| [v] },
|
930
1013
|
headers: @name && [@name],
|
@@ -1336,6 +1419,12 @@ module Daru
|
|
1336
1419
|
|
1337
1420
|
private
|
1338
1421
|
|
1422
|
+
def copy(values)
|
1423
|
+
# Make sure values is right-justified to the size of the vector
|
1424
|
+
values.concat([nil] * (size-values.size)) if values.size < size
|
1425
|
+
Daru::Vector.new(values[0...size], index: @index, name: @name)
|
1426
|
+
end
|
1427
|
+
|
1339
1428
|
def nil_positions
|
1340
1429
|
@nil_positions ||
|
1341
1430
|
@nil_positions = size.times.select { |i| @data[i].nil? }
|
@@ -1426,7 +1515,7 @@ module Daru
|
|
1426
1515
|
else raise ArgumentError, "Unknown dtype #{dtype}"
|
1427
1516
|
end
|
1428
1517
|
|
1429
|
-
@dtype = dtype
|
1518
|
+
@dtype = dtype
|
1430
1519
|
new_vector
|
1431
1520
|
end
|
1432
1521
|
|