@@ -75,6 +75,16 @@ class DataFrame(T)
7575
7676 mixin (" this(" ~ initializerArgs ~ " ){" ~ initializerContent ~ " }" );
7777
78+ size_t opDollar (size_t pos)()
79+ {
80+ return length;
81+ }
82+
83+ auto opSlice ()(size_t start, size_t end)
84+ {
85+ return iota (start, end).map! (idx => row(idx)).array;
86+ }
87+
7888 /**
7989 * Access the DataFrame column by label
8090 */
@@ -563,4 +573,32 @@ unittest
563573 {"count":0,"name":"B","name2":"B3","value1":5.0,"value2":120.0},
564574 {"count":0,"name":"C","name2":"C1","value1":6.0,"value2":60.0}]` ;
565575 assert (df5.toJSON == parseJSON(jsonOutput));
576+
577+ struct Sample2
578+ {
579+ string name;
580+ double value;
581+ double avg;
582+ }
583+
584+ auto dfSample2 = new DataFrame! Sample2(
585+ name: [" A" , " A" , " B" , " B" , " B" , " C" ],
586+ value: [1 , 2 , 3 , 4 , 5 , 6 ]
587+ );
588+
589+ import std.math : isNaN;
590+
591+ dfSample2.avg = dfSample2.value.rolling! (mean, double )(2 );
592+ assert (dfSample2.avg[0 ].isNaN);
593+ assert (dfSample2.avg.values [1 .. $] == [1.5 , 2.5 , 3.5 , 4.5 , 5.5 ]);
594+
595+ double smaFunc (Row! Sample2[] data)
596+ {
597+ // Get the mean of the field "value"
598+ return data.map! (a => a.value).mean;
599+ }
600+
601+ dfSample2.avg = dfSample2.rolling! (smaFunc, double )(2 );
602+ assert (dfSample2.avg[0 ].isNaN);
603+ assert (dfSample2.avg.values [1 .. $] == [1.5 , 2.5 , 3.5 , 4.5 , 5.5 ]);
566604}
0 commit comments