polars-df 0.13.0-x86_64-linux → 0.15.0-x86_64-linux

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/Cargo.lock +1368 -319
  4. data/LICENSE-THIRD-PARTY.txt +24801 -13447
  5. data/LICENSE.txt +1 -0
  6. data/README.md +1 -2
  7. data/lib/polars/3.1/polars.so +0 -0
  8. data/lib/polars/3.2/polars.so +0 -0
  9. data/lib/polars/3.3/polars.so +0 -0
  10. data/lib/polars/batched_csv_reader.rb +0 -2
  11. data/lib/polars/binary_expr.rb +133 -9
  12. data/lib/polars/binary_name_space.rb +101 -6
  13. data/lib/polars/config.rb +4 -0
  14. data/lib/polars/data_frame.rb +285 -62
  15. data/lib/polars/data_type_group.rb +28 -0
  16. data/lib/polars/data_types.rb +2 -0
  17. data/lib/polars/date_time_expr.rb +244 -0
  18. data/lib/polars/date_time_name_space.rb +87 -0
  19. data/lib/polars/expr.rb +109 -8
  20. data/lib/polars/functions/as_datatype.rb +51 -2
  21. data/lib/polars/functions/col.rb +1 -1
  22. data/lib/polars/functions/eager.rb +1 -3
  23. data/lib/polars/functions/lazy.rb +88 -10
  24. data/lib/polars/functions/range/time_range.rb +21 -21
  25. data/lib/polars/io/csv.rb +14 -16
  26. data/lib/polars/io/database.rb +2 -2
  27. data/lib/polars/io/ipc.rb +14 -12
  28. data/lib/polars/io/ndjson.rb +10 -0
  29. data/lib/polars/io/parquet.rb +168 -111
  30. data/lib/polars/lazy_frame.rb +649 -15
  31. data/lib/polars/list_name_space.rb +169 -0
  32. data/lib/polars/selectors.rb +1144 -0
  33. data/lib/polars/series.rb +470 -40
  34. data/lib/polars/string_cache.rb +27 -1
  35. data/lib/polars/string_expr.rb +0 -1
  36. data/lib/polars/string_name_space.rb +73 -3
  37. data/lib/polars/struct_name_space.rb +31 -7
  38. data/lib/polars/utils/various.rb +5 -1
  39. data/lib/polars/utils.rb +45 -10
  40. data/lib/polars/version.rb +1 -1
  41. data/lib/polars.rb +2 -1
  42. metadata +4 -3
  43. data/lib/polars/functions.rb +0 -57
data/lib/polars/series.rb CHANGED
@@ -88,6 +88,11 @@ module Polars
88
88
  # Get the data type of this Series.
89
89
  #
90
90
  # @return [Symbol]
91
+ #
92
+ # @example
93
+ # s = Polars::Series.new("a", [1, 2, 3])
94
+ # s.dtype
95
+ # # => Polars::Int64
91
96
  def dtype
92
97
  _s.dtype
93
98
  end
@@ -95,6 +100,11 @@ module Polars
95
100
  # Get flags that are set on the Series.
96
101
  #
97
102
  # @return [Hash]
103
+ #
104
+ # @example
105
+ # s = Polars::Series.new("a", [1, 2, 3])
106
+ # s.flags
107
+ # # => {"SORTED_ASC"=>false, "SORTED_DESC"=>false}
98
108
  def flags
99
109
  out = {
100
110
  "SORTED_ASC" => _s.is_sorted_flag,
@@ -106,16 +116,14 @@ module Polars
106
116
  out
107
117
  end
108
118
 
109
- # Get the inner dtype in of a List typed Series.
110
- #
111
- # @return [Symbol]
112
- def inner_dtype
113
- _s.inner_dtype
114
- end
115
-
116
119
  # Get the name of this Series.
117
120
  #
118
121
  # @return [String]
122
+ #
123
+ # @example
124
+ # s = Polars::Series.new("a", [1, 2, 3])
125
+ # s.name
126
+ # # => "a"
119
127
  def name
120
128
  _s.name
121
129
  end
@@ -123,17 +131,15 @@ module Polars
123
131
  # Shape of this Series.
124
132
  #
125
133
  # @return [Array]
134
+ #
135
+ # @example
136
+ # s = Polars::Series.new("a", [1, 2, 3])
137
+ # s.shape
138
+ # # => [3]
126
139
  def shape
127
140
  [_s.len]
128
141
  end
129
142
 
130
- # Get the time unit of underlying Datetime Series as `"ns"`, `"us"`, or `"ms"`.
131
- #
132
- # @return [String]
133
- def time_unit
134
- _s.time_unit
135
- end
136
-
137
143
  # Returns a string representing the Series.
138
144
  #
139
145
  # @return [String]
@@ -524,6 +530,18 @@ module Polars
524
530
  # Compute the square root of the elements.
525
531
  #
526
532
  # @return [Series]
533
+ #
534
+ # @example
535
+ # s = Polars::Series.new([1, 2, 3])
536
+ # s.sqrt
537
+ # # =>
538
+ # # shape: (3,)
539
+ # # Series: '' [f64]
540
+ # # [
541
+ # # 1.0
542
+ # # 1.414214
543
+ # # 1.732051
544
+ # # ]
527
545
  def sqrt
528
546
  self**0.5
529
547
  end
@@ -531,6 +549,18 @@ module Polars
531
549
  # Check if any boolean value in the column is `true`.
532
550
  #
533
551
  # @return [Boolean]
552
+ #
553
+ # @example
554
+ # Polars::Series.new([true, false]).any?
555
+ # # => true
556
+ #
557
+ # @example
558
+ # Polars::Series.new([false, false]).any?
559
+ # # => false
560
+ #
561
+ # @example
562
+ # Polars::Series.new([nil, false]).any?
563
+ # # => false
534
564
  def any?(ignore_nulls: true, &block)
535
565
  if block_given?
536
566
  apply(skip_nulls: ignore_nulls, &block).any?
@@ -543,6 +573,18 @@ module Polars
543
573
  # Check if all boolean values in the column are `true`.
544
574
  #
545
575
  # @return [Boolean]
576
+ #
577
+ # @example
578
+ # Polars::Series.new([true, true]).all?
579
+ # # => true
580
+ #
581
+ # @example
582
+ # Polars::Series.new([false, true]).all?
583
+ # # => false
584
+ #
585
+ # @example
586
+ # Polars::Series.new([nil, true]).all?
587
+ # # => true
546
588
  def all?(ignore_nulls: true, &block)
547
589
  if block_given?
548
590
  apply(skip_nulls: ignore_nulls, &block).all?
@@ -555,6 +597,18 @@ module Polars
555
597
  # Check if all boolean values in the column are `false`.
556
598
  #
557
599
  # @return [Boolean]
600
+ #
601
+ # @example
602
+ # Polars::Series.new([true, false]).none?
603
+ # # => false
604
+ #
605
+ # @example
606
+ # Polars::Series.new([false, false]).none?
607
+ # # => true
608
+ #
609
+ # @example
610
+ # Polars::Series.new([nil, false]).none?
611
+ # # => true
558
612
  def none?(&block)
559
613
  if block_given?
560
614
  apply(&block).none?
@@ -570,6 +624,18 @@ module Polars
570
624
  # Given base, defaults to `Math::E`.
571
625
  #
572
626
  # @return [Series]
627
+ #
628
+ # @example
629
+ # s = Polars::Series.new([1, 2, 3])
630
+ # s.log
631
+ # # =>
632
+ # # shape: (3,)
633
+ # # Series: '' [f64]
634
+ # # [
635
+ # # 0.0
636
+ # # 0.693147
637
+ # # 1.098612
638
+ # # ]
573
639
  def log(base = Math::E)
574
640
  super
575
641
  end
@@ -577,6 +643,18 @@ module Polars
577
643
  # Compute the base 10 logarithm of the input array, element-wise.
578
644
  #
579
645
  # @return [Series]
646
+ #
647
+ # @example
648
+ # s = Polars::Series.new([10, 100, 1000])
649
+ # s.log10
650
+ # # =>
651
+ # # shape: (3,)
652
+ # # Series: '' [f64]
653
+ # # [
654
+ # # 1.0
655
+ # # 2.0
656
+ # # 3.0
657
+ # # ]
580
658
  def log10
581
659
  super
582
660
  end
@@ -584,6 +662,18 @@ module Polars
584
662
  # Compute the exponential, element-wise.
585
663
  #
586
664
  # @return [Series]
665
+ #
666
+ # @example
667
+ # s = Polars::Series.new([1, 2, 3])
668
+ # s.exp
669
+ # # =>
670
+ # # shape: (3,)
671
+ # # Series: '' [f64]
672
+ # # [
673
+ # # 2.718282
674
+ # # 7.389056
675
+ # # 20.085537
676
+ # # ]
587
677
  def exp
588
678
  super
589
679
  end
@@ -591,6 +681,18 @@ module Polars
591
681
  # Create a new Series that copies data from this Series without null values.
592
682
  #
593
683
  # @return [Series]
684
+ #
685
+ # @example
686
+ # s = Polars::Series.new([1.0, nil, 3.0, Float::NAN])
687
+ # s.drop_nulls
688
+ # # =>
689
+ # # shape: (3,)
690
+ # # Series: '' [f64]
691
+ # # [
692
+ # # 1.0
693
+ # # 3.0
694
+ # # NaN
695
+ # # ]
594
696
  def drop_nulls
595
697
  super
596
698
  end
@@ -598,6 +700,18 @@ module Polars
598
700
  # Drop NaN values.
599
701
  #
600
702
  # @return [Series]
703
+ #
704
+ # @example
705
+ # s = Polars::Series.new([1.0, nil, 3.0, Float::NAN])
706
+ # s.drop_nans
707
+ # # =>
708
+ # # shape: (3,)
709
+ # # Series: '' [f64]
710
+ # # [
711
+ # # 1.0
712
+ # # null
713
+ # # 3.0
714
+ # # ]
601
715
  def drop_nans
602
716
  super
603
717
  end
@@ -605,7 +719,37 @@ module Polars
605
719
  # Cast this Series to a DataFrame.
606
720
  #
607
721
  # @return [DataFrame]
608
- def to_frame
722
+ #
723
+ # @example
724
+ # s = Polars::Series.new("a", [123, 456])
725
+ # s.to_frame
726
+ # # =>
727
+ # # shape: (2, 1)
728
+ # # ┌─────┐
729
+ # # │ a │
730
+ # # │ --- │
731
+ # # │ i64 │
732
+ # # ╞═════╡
733
+ # # │ 123 │
734
+ # # │ 456 │
735
+ # # └─────┘
736
+ #
737
+ # @example
738
+ # s.to_frame("xyz")
739
+ # # =>
740
+ # # shape: (2, 1)
741
+ # # ┌─────┐
742
+ # # │ xyz │
743
+ # # │ --- │
744
+ # # │ i64 │
745
+ # # ╞═════╡
746
+ # # │ 123 │
747
+ # # │ 456 │
748
+ # # └─────┘
749
+ def to_frame(name = nil)
750
+ if name
751
+ return Utils.wrap_df(RbDataFrame.new([rename(name)._s]))
752
+ end
609
753
  Utils.wrap_df(RbDataFrame.new([_s]))
610
754
  end
611
755
 
@@ -722,6 +866,11 @@ module Polars
722
866
  # Reduce this Series to the product value.
723
867
  #
724
868
  # @return [Numeric]
869
+ #
870
+ # @example
871
+ # s = Polars::Series.new("a", [1, 2, 3])
872
+ # s.product
873
+ # # => 6
725
874
  def product
726
875
  to_frame.select(Polars.col(name).product).to_series[0]
727
876
  end
@@ -753,15 +902,35 @@ module Polars
753
902
  # Get maximum value, but propagate/poison encountered NaN values.
754
903
  #
755
904
  # @return [Object]
905
+ #
906
+ # @example
907
+ # s = Polars::Series.new("a", [1, 3, 4])
908
+ # s.nan_max
909
+ # # => 4
910
+ #
911
+ # @example
912
+ # s = Polars::Series.new("a", [1.0, Float::NAN, 4.0])
913
+ # s.nan_max
914
+ # # => NaN
756
915
  def nan_max
757
- to_frame.select(Polars.col(name).nan_max)[0, 0]
916
+ to_frame.select(F.col(name).nan_max)[0, 0]
758
917
  end
759
918
 
760
919
  # Get minimum value, but propagate/poison encountered NaN values.
761
920
  #
762
921
  # @return [Object]
922
+ #
923
+ # @example
924
+ # s = Polars::Series.new("a", [1, 3, 4])
925
+ # s.nan_min
926
+ # # => 1
927
+ #
928
+ # @example
929
+ # s = Polars::Series.new("a", [1.0, Float::NAN, 4.0])
930
+ # s.nan_min
931
+ # # => NaN
763
932
  def nan_min
764
- to_frame.select(Polars.col(name).nan_min)[0, 0]
933
+ to_frame.select(F.col(name).nan_min)[0, 0]
765
934
  end
766
935
 
767
936
  # Get the standard deviation of this Series.
@@ -1661,20 +1830,7 @@ module Polars
1661
1830
  def arg_sort(reverse: false, nulls_last: false)
1662
1831
  super
1663
1832
  end
1664
-
1665
- # Get the index values that would sort this Series.
1666
- #
1667
- # Alias for {#arg_sort}.
1668
- #
1669
- # @param reverse [Boolean]
1670
- # Sort in reverse (descending) order.
1671
- # @param nulls_last [Boolean]
1672
- # Place null values last instead of first.
1673
- #
1674
- # @return [Series]
1675
- def argsort(reverse: false, nulls_last: false)
1676
- super
1677
- end
1833
+ alias_method :argsort, :arg_sort
1678
1834
 
1679
1835
  # Get unique index as Series.
1680
1836
  #
@@ -1725,6 +1881,52 @@ module Polars
1725
1881
  # Expression or scalar value.
1726
1882
  #
1727
1883
  # @return [Integer]
1884
+ #
1885
+ # @example
1886
+ # s = Polars::Series.new("set", [1, 2, 3, 4, 4, 5, 6, 7])
1887
+ # s.search_sorted(4)
1888
+ # # => 3
1889
+ #
1890
+ # @example
1891
+ # s.search_sorted(4, side: "left")
1892
+ # # => 3
1893
+ #
1894
+ # @example
1895
+ # s.search_sorted(4, side: "right")
1896
+ # # => 5
1897
+ #
1898
+ # @example
1899
+ # s.search_sorted([1, 4, 5])
1900
+ # # =>
1901
+ # # shape: (3,)
1902
+ # # Series: 'set' [u32]
1903
+ # # [
1904
+ # # 0
1905
+ # # 3
1906
+ # # 5
1907
+ # # ]
1908
+ #
1909
+ # @example
1910
+ # s.search_sorted([1, 4, 5], side: "left")
1911
+ # # =>
1912
+ # # shape: (3,)
1913
+ # # Series: 'set' [u32]
1914
+ # # [
1915
+ # # 0
1916
+ # # 3
1917
+ # # 5
1918
+ # # ]
1919
+ #
1920
+ # @example
1921
+ # s.search_sorted([1, 4, 5], side: "right")
1922
+ # # =>
1923
+ # # shape: (3,)
1924
+ # # Series: 'set' [u32]
1925
+ # # [
1926
+ # # 1
1927
+ # # 5
1928
+ # # 6
1929
+ # # ]
1728
1930
  def search_sorted(element, side: "any")
1729
1931
  if element.is_a?(Integer) || element.is_a?(Float)
1730
1932
  return Polars.select(Polars.lit(self).search_sorted(element, side: side)).item
@@ -1780,6 +1982,11 @@ module Polars
1780
1982
  # Count the null values in this Series.
1781
1983
  #
1782
1984
  # @return [Integer]
1985
+ #
1986
+ # @example
1987
+ # s = Polars::Series.new([1, nil, nil])
1988
+ # s.null_count
1989
+ # # => 2
1783
1990
  def null_count
1784
1991
  _s.null_count
1785
1992
  end
@@ -1790,6 +1997,15 @@ module Polars
1790
1997
  # Use this to swiftly assert a Series does not have null values.
1791
1998
  #
1792
1999
  # @return [Boolean]
2000
+ #
2001
+ # @example
2002
+ # s = Polars::Series.new([1, 2, nil])
2003
+ # s.has_nulls
2004
+ # # => true
2005
+ #
2006
+ # @example
2007
+ # s[...2].has_nulls
2008
+ # # => false
1793
2009
  def has_nulls
1794
2010
  _s.has_nulls
1795
2011
  end
@@ -2019,9 +2235,24 @@ module Polars
2019
2235
  # Get a mask of the first unique value.
2020
2236
  #
2021
2237
  # @return [Series]
2022
- def is_first
2238
+ #
2239
+ # @example
2240
+ # s = Polars::Series.new([1, 1, 2, 3, 2])
2241
+ # s.is_first_distinct
2242
+ # # =>
2243
+ # # shape: (5,)
2244
+ # # Series: '' [bool]
2245
+ # # [
2246
+ # # true
2247
+ # # false
2248
+ # # true
2249
+ # # true
2250
+ # # false
2251
+ # # ]
2252
+ def is_first_distinct
2023
2253
  super
2024
2254
  end
2255
+ alias_method :is_first, :is_first_distinct
2025
2256
 
2026
2257
  # Get mask of all duplicated values.
2027
2258
  #
@@ -2187,6 +2418,35 @@ module Polars
2187
2418
  # In place or not.
2188
2419
  #
2189
2420
  # @return [Series]
2421
+ #
2422
+ # @example
2423
+ # s1 = Polars::Series.new("a", [1, 2, 3])
2424
+ # s1.n_chunks
2425
+ # # => 1
2426
+ #
2427
+ # @example
2428
+ # s2 = Polars::Series.new("a", [4, 5, 6])
2429
+ # s = Polars.concat([s1, s2], rechunk: false)
2430
+ # s.n_chunks
2431
+ # # => 2
2432
+ #
2433
+ # @example
2434
+ # s.rechunk(in_place: true)
2435
+ # # =>
2436
+ # # shape: (6,)
2437
+ # # Series: 'a' [i64]
2438
+ # # [
2439
+ # # 1
2440
+ # # 2
2441
+ # # 3
2442
+ # # 4
2443
+ # # 5
2444
+ # # 6
2445
+ # # ]
2446
+ #
2447
+ # @example
2448
+ # s.n_chunks
2449
+ # # => 1
2190
2450
  def rechunk(in_place: false)
2191
2451
  opt_s = _s.rechunk(in_place)
2192
2452
  in_place ? self : Utils.wrap_s(opt_s)
@@ -2606,12 +2866,12 @@ module Polars
2606
2866
  # s.sign
2607
2867
  # # =>
2608
2868
  # # shape: (5,)
2609
- # # Series: 'a' [i64]
2869
+ # # Series: 'a' [f64]
2610
2870
  # # [
2611
- # # -1
2612
- # # 0
2613
- # # 0
2614
- # # 1
2871
+ # # -1.0
2872
+ # # -0.0
2873
+ # # 0.0
2874
+ # # 1.0
2615
2875
  # # null
2616
2876
  # # ]
2617
2877
  def sign
@@ -3518,6 +3778,18 @@ module Polars
3518
3778
  # If true, reinterpret as `:i64`. Otherwise, reinterpret as `:u64`.
3519
3779
  #
3520
3780
  # @return [Series]
3781
+ #
3782
+ # @example
3783
+ # s = Polars::Series.new("a", [-(2**60), -2, 3])
3784
+ # s.reinterpret(signed: false)
3785
+ # # =>
3786
+ # # shape: (3,)
3787
+ # # Series: 'a' [u64]
3788
+ # # [
3789
+ # # 17293822569102704640
3790
+ # # 18446744073709551614
3791
+ # # 3
3792
+ # # ]
3521
3793
  def reinterpret(signed: true)
3522
3794
  super
3523
3795
  end
@@ -3546,6 +3818,18 @@ module Polars
3546
3818
  # Compute absolute values.
3547
3819
  #
3548
3820
  # @return [Series]
3821
+ #
3822
+ # @example
3823
+ # s = Polars::Series.new([1, -2, -3])
3824
+ # s.abs
3825
+ # # =>
3826
+ # # shape: (3,)
3827
+ # # Series: '' [i64]
3828
+ # # [
3829
+ # # 1
3830
+ # # 2
3831
+ # # 3
3832
+ # # ]
3549
3833
  def abs
3550
3834
  super
3551
3835
  end
@@ -3616,6 +3900,44 @@ module Polars
3616
3900
  # How to handle null values.
3617
3901
  #
3618
3902
  # @return [Series]
3903
+ #
3904
+ # @example
3905
+ # s = Polars::Series.new("s", [20, 10, 30, 25, 35], dtype: Polars::Int8)
3906
+ # s.diff
3907
+ # # =>
3908
+ # # shape: (5,)
3909
+ # # Series: 's' [i8]
3910
+ # # [
3911
+ # # null
3912
+ # # -10
3913
+ # # 20
3914
+ # # -5
3915
+ # # 10
3916
+ # # ]
3917
+ #
3918
+ # @example
3919
+ # s.diff(n: 2)
3920
+ # # =>
3921
+ # # shape: (5,)
3922
+ # # Series: 's' [i8]
3923
+ # # [
3924
+ # # null
3925
+ # # null
3926
+ # # 10
3927
+ # # 15
3928
+ # # 5
3929
+ # # ]
3930
+ #
3931
+ # @example
3932
+ # s.diff(n: 2, null_behavior: "drop")
3933
+ # # =>
3934
+ # # shape: (3,)
3935
+ # # Series: 's' [i8]
3936
+ # # [
3937
+ # # 10
3938
+ # # 15
3939
+ # # 5
3940
+ # # ]
3619
3941
  def diff(n: 1, null_behavior: "ignore")
3620
3942
  super
3621
3943
  end
@@ -3683,6 +4005,11 @@ module Polars
3683
4005
  # If `false`, the calculations are corrected for statistical bias.
3684
4006
  #
3685
4007
  # @return [Float, nil]
4008
+ #
4009
+ # @example
4010
+ # s = Polars::Series.new([1, 2, 2, 4, 5])
4011
+ # s.skew
4012
+ # # => 0.34776706224699483
3686
4013
  def skew(bias: true)
3687
4014
  _s.skew(bias)
3688
4015
  end
@@ -3702,6 +4029,19 @@ module Polars
3702
4029
  # If `false`, the calculations are corrected for statistical bias.
3703
4030
  #
3704
4031
  # @return [Float, nil]
4032
+ #
4033
+ # @example
4034
+ # s = Polars::Series.new("grades", [66, 79, 54, 97, 96, 70, 69, 85, 93, 75])
4035
+ # s.kurtosis
4036
+ # # => -1.0522623626787952
4037
+ #
4038
+ # @example
4039
+ # s.kurtosis(fisher: false)
4040
+ # # => 1.9477376373212048
4041
+ #
4042
+ # @example
4043
+ # s.kurtosis(fisher: false, bias: false)
4044
+ # # => 2.1040361802642726
3705
4045
  def kurtosis(fisher: true, bias: true)
3706
4046
  _s.kurtosis(fisher, bias)
3707
4047
  end
@@ -3845,6 +4185,35 @@ module Polars
3845
4185
  # dimension is inferred.
3846
4186
  #
3847
4187
  # @return [Series]
4188
+ #
4189
+ # @example
4190
+ # s = Polars::Series.new("foo", [1, 2, 3, 4, 5, 6, 7, 8, 9])
4191
+ # square = s.reshape([3, 3])
4192
+ # # =>
4193
+ # # shape: (3,)
4194
+ # # Series: 'foo' [array[i64, 3]]
4195
+ # # [
4196
+ # # [1, 2, 3]
4197
+ # # [4, 5, 6]
4198
+ # # [7, 8, 9]
4199
+ # # ]
4200
+ #
4201
+ # @example
4202
+ # square.reshape([9])
4203
+ # # =>
4204
+ # # shape: (9,)
4205
+ # # Series: 'foo' [i64]
4206
+ # # [
4207
+ # # 1
4208
+ # # 2
4209
+ # # 3
4210
+ # # 4
4211
+ # # 5
4212
+ # # 6
4213
+ # # 7
4214
+ # # 8
4215
+ # # 9
4216
+ # # ]
3848
4217
  def reshape(dims)
3849
4218
  super
3850
4219
  end
@@ -3874,6 +4243,18 @@ module Polars
3874
4243
  # Exponentially-weighted moving average.
3875
4244
  #
3876
4245
  # @return [Series]
4246
+ #
4247
+ # @example
4248
+ # s = Polars::Series.new([1, 2, 3])
4249
+ # s.ewm_mean(com: 1, ignore_nulls: false)
4250
+ # # =>
4251
+ # # shape: (3,)
4252
+ # # Series: '' [f64]
4253
+ # # [
4254
+ # # 1.0
4255
+ # # 1.666667
4256
+ # # 2.428571
4257
+ # # ]
3877
4258
  def ewm_mean(
3878
4259
  com: nil,
3879
4260
  span: nil,
@@ -3889,6 +4270,18 @@ module Polars
3889
4270
  # Exponentially-weighted moving standard deviation.
3890
4271
  #
3891
4272
  # @return [Series]
4273
+ #
4274
+ # @example
4275
+ # s = Polars::Series.new("a", [1, 2, 3])
4276
+ # s.ewm_std(com: 1, ignore_nulls: false)
4277
+ # # =>
4278
+ # # shape: (3,)
4279
+ # # Series: 'a' [f64]
4280
+ # # [
4281
+ # # 0.0
4282
+ # # 0.707107
4283
+ # # 0.963624
4284
+ # # ]
3892
4285
  def ewm_std(
3893
4286
  com: nil,
3894
4287
  span: nil,
@@ -3905,6 +4298,18 @@ module Polars
3905
4298
  # Exponentially-weighted moving variance.
3906
4299
  #
3907
4300
  # @return [Series]
4301
+ #
4302
+ # @example
4303
+ # s = Polars::Series.new("a", [1, 2, 3])
4304
+ # s.ewm_var(com: 1, ignore_nulls: false)
4305
+ # # =>
4306
+ # # shape: (3,)
4307
+ # # Series: 'a' [f64]
4308
+ # # [
4309
+ # # 0.0
4310
+ # # 0.5
4311
+ # # 0.928571
4312
+ # # ]
3908
4313
  def ewm_var(
3909
4314
  com: nil,
3910
4315
  span: nil,
@@ -3969,6 +4374,18 @@ module Polars
3969
4374
  # Create a new Series filled with values from the given index.
3970
4375
  #
3971
4376
  # @return [Series]
4377
+ #
4378
+ # @example
4379
+ # s = Polars::Series.new("a", [1, 2, 3, 4, 5])
4380
+ # s.new_from_index(1, 3)
4381
+ # # =>
4382
+ # # shape: (3,)
4383
+ # # Series: 'a' [i64]
4384
+ # # [
4385
+ # # 2
4386
+ # # 2
4387
+ # # 2
4388
+ # # ]
3972
4389
  def new_from_index(index, length)
3973
4390
  Utils.wrap_s(_s.new_from_index(index, length))
3974
4391
  end
@@ -3979,6 +4396,21 @@ module Polars
3979
4396
  # This can be used to reduce memory pressure.
3980
4397
  #
3981
4398
  # @return [Series]
4399
+ #
4400
+ # @example
4401
+ # s = Polars::Series.new("a", [1, 2, 3, 4, 5, 6])
4402
+ # s.shrink_dtype
4403
+ # # =>
4404
+ # # shape: (6,)
4405
+ # # Series: 'a' [i8]
4406
+ # # [
4407
+ # # 1
4408
+ # # 2
4409
+ # # 3
4410
+ # # 4
4411
+ # # 5
4412
+ # # 6
4413
+ # # ]
3982
4414
  def shrink_dtype
3983
4415
  super
3984
4416
  end
@@ -4264,12 +4696,10 @@ module Polars
4264
4696
  end
4265
4697
 
4266
4698
  constructor = polars_type_to_constructor(dtype)
4267
- # TODO remove
4268
- strict = false if dtype == Decimal
4269
4699
  rbseries = constructor.call(name, values, strict)
4270
4700
 
4271
4701
  base_type = dtype.is_a?(DataType) ? dtype.class : dtype
4272
- if [Date, Datetime, Duration, Time, Categorical, Boolean, Enum].include?(base_type)
4702
+ if [Date, Datetime, Duration, Time, Categorical, Boolean, Enum, Decimal].include?(base_type)
4273
4703
  if rbseries.dtype != dtype
4274
4704
  rbseries = rbseries.cast(dtype, true)
4275
4705
  end