@@ -71,12 +71,45 @@ define([
71
71
this . previewOpened = false ;
72
72
this . codepreview = undefined ;
73
73
74
+ this . periodList = [
75
+ { label : 'business day' , value : 'B' } ,
76
+ { label : 'custom business day' , value : 'C' } ,
77
+ { label : 'calendar day' , value : 'D' } ,
78
+ { label : 'weekly' , value : 'W' } ,
79
+ { label : 'month end' , value : 'M' } ,
80
+ { label : 'semi-month end' , value : 'SM' } ,
81
+ { label : 'business month end' , value : 'BM' } ,
82
+ { label : 'custom business month end' , value : 'CBM' } ,
83
+ { label : 'month start' , value : 'MS' } ,
84
+ { label : 'semi-month start' , value : 'SMS' } ,
85
+ { label : 'business month start' , value : 'BMS' } ,
86
+ { label : 'custom business month start' , value : 'CBMS' } ,
87
+ { label : 'quarter end' , value : 'Q' } ,
88
+ { label : 'business quarter end' , value : 'BQ' } ,
89
+ { label : 'quarter start' , value : 'QS' } ,
90
+ { label : 'business quarter start' , value : 'BQS' } ,
91
+ { label : 'year end' , value : 'Y' } ,
92
+ { label : 'business year end' , value : 'BY' } ,
93
+ { label : 'year start' , value : 'YS' } ,
94
+ { label : 'business year start' , value : 'BYS' } ,
95
+ { label : 'business hour' , value : 'BH' } ,
96
+ { label : 'hourly' , value : 'H' } ,
97
+ { label : 'minutely' , value : 'min' } ,
98
+ { label : 'secondly' , value : 'S' } ,
99
+ { label : 'milliseconds' , value : 'ms' } ,
100
+ { label : 'microseconds' , value : 'us' } ,
101
+ { label : 'nanoseconds' , value : 'N' }
102
+ ]
103
+
74
104
this . methodList = [
105
+ { label : 'count' , value : 'count' } ,
106
+ { label : 'size' , value : 'size' } ,
107
+ { label : 'std' , value : 'std' } ,
75
108
{ label : 'sum' , value : 'sum' } ,
109
+ { label : 'max' , value : 'max' } ,
76
110
{ label : 'mean' , value : 'mean' } ,
111
+ { label : 'median' , value : 'median' } ,
77
112
{ label : 'min' , value : 'min' } ,
78
- { label : 'max' , value : 'max' } ,
79
- { label : 'std' , value : 'std' } ,
80
113
]
81
114
}
82
115
@@ -97,13 +130,17 @@ define([
97
130
*/
98
131
_loadState ( state ) {
99
132
var {
100
- variable, groupby, display, method, advanced, allocateTo, resetIndex,
133
+ variable, groupby, useGrouper, grouperNumber, grouperPeriod,
134
+ display, method, advanced, allocateTo, resetIndex,
101
135
advPageDom, advColList, advNamingList
102
136
} = state ;
103
137
104
138
$ ( this . _wrapSelector ( '#vp_gbVariable' ) ) . val ( variable ) ;
105
139
$ ( this . _wrapSelector ( '#vp_gbBy' ) ) . val ( groupby . join ( ',' ) ) ;
106
140
$ ( this . _wrapSelector ( '#vp_gbBy' ) ) . data ( 'list' , groupby ) ;
141
+ $ ( this . _wrapSelector ( '#vp_gbByGrouper' ) ) . prop ( 'checked' , useGrouper ) ;
142
+ $ ( this . _wrapSelector ( '#vp_gbByGrouperNumber' ) ) . val ( grouperNumber ) ;
143
+ $ ( this . _wrapSelector ( '#vp_gbByGrouperPeriod' ) ) . val ( grouperPeriod ) ;
107
144
$ ( this . _wrapSelector ( '#vp_gbDisplay' ) ) . val ( display . join ( ',' ) ) ;
108
145
$ ( this . _wrapSelector ( '#vp_gbDisplay' ) ) . data ( 'list' , display ) ;
109
146
$ ( this . _wrapSelector ( '#vp_gbMethod' ) ) . val ( method ) ;
@@ -191,8 +228,11 @@ define([
191
228
this . state = {
192
229
variable : '' ,
193
230
groupby : [ ] ,
231
+ useGrouper : false ,
232
+ grouperNumber : 0 ,
233
+ grouperPeriod : this . periodList [ 0 ] . value ,
194
234
display : [ ] ,
195
- method : 'sum' ,
235
+ method : this . methodList [ 0 ] . value ,
196
236
advanced : false ,
197
237
allocateTo : '' ,
198
238
resetIndex : false ,
@@ -260,6 +300,16 @@ define([
260
300
page . appendFormatLine ( '<label for="{0}" class="{1}">{2}</label>' , 'vp_gbBy' , 'vp-orange-text wp80' , 'Groupby' ) ;
261
301
page . appendFormatLine ( '<input type="text" id="{0}" disabled/>' , 'vp_gbBy' ) ;
262
302
page . appendFormatLine ( '<button id="{0}" class="{1}">{2}</button>' , 'vp_gbBySelect' , 'vp-button wp50' , 'Edit' ) ;
303
+ page . appendFormatLine ( '<label style="display: none;"><input type="checkbox" id="{0}"/><span>{1}</span></label>' , 'vp_gbByGrouper' , 'Grouper' ) ;
304
+ page . appendFormatLine ( '<div class="{0}" style="display:none;">' , 'vp-gb-by-grouper-box' ) ;
305
+ page . appendFormatLine ( '<input type="number" id="{0}" class="{1}"/>' , 'vp_gbByGrouperNumber' , 'vp-gb-by-number' ) ;
306
+ page . appendFormatLine ( '<select id="{0}">' , 'vp_gbByGrouperPeriod' ) ;
307
+ var savedPeriod = this . state . period ;
308
+ this . periodList . forEach ( period => {
309
+ page . appendFormatLine ( '<option value="{0}"{1}>{2}</option>' , period . value , savedPeriod == period . value ?' selected' :'' , period . label ) ;
310
+ } ) ;
311
+ page . appendLine ( '</select>' ) ;
312
+ page . appendLine ( '</div>' ) ; // by-grouper-box
263
313
page . appendLine ( '</div>' ) ;
264
314
page . appendLine ( '<hr style="margin: 10px 0;"/>' ) ;
265
315
// display column
@@ -535,6 +585,7 @@ define([
535
585
$ ( document ) . off ( 'click' , this . _wrapSelector ( '.vp-gb-df-refresh' ) ) ;
536
586
$ ( document ) . off ( 'change' , this . _wrapSelector ( '#vp_gbBy' ) ) ;
537
587
$ ( document ) . off ( 'click' , this . _wrapSelector ( '#vp_gbBySelect' ) ) ;
588
+ $ ( document ) . off ( 'change' , this . _wrapSelector ( '#vp_gbByGrouper' ) ) ;
538
589
$ ( document ) . off ( 'change' , this . _wrapSelector ( '#vp_gbDisplay' ) ) ;
539
590
$ ( document ) . off ( 'click' , this . _wrapSelector ( '#vp_gbDisplaySelect' ) ) ;
540
591
$ ( document ) . off ( 'change' , this . _wrapSelector ( '#vp_gbMethodSelect' ) ) ;
@@ -596,14 +647,41 @@ define([
596
647
$ ( document ) . on ( 'change' , this . _wrapSelector ( '#vp_gbBy' ) , function ( event ) {
597
648
var colList = event . colList ;
598
649
that . state . groupby = colList ;
599
- console . log ( 'groupby' , colList ) ;
650
+
651
+ if ( colList && colList . length == 1 ) {
652
+ $ ( that . _wrapSelector ( '#vp_gbByGrouper' ) ) . parent ( ) . show ( ) ;
653
+ } else {
654
+ $ ( that . _wrapSelector ( '#vp_gbByGrouper' ) ) . parent ( ) . hide ( ) ;
655
+ }
600
656
} ) ;
601
657
602
658
// groupby select button event
603
659
$ ( document ) . on ( 'click' , this . _wrapSelector ( '#vp_gbBySelect' ) , function ( ) {
604
660
that . openInnerPopup ( $ ( that . _wrapSelector ( '#vp_gbBy' ) ) , 'Select columns to group' ) ;
605
661
} ) ;
606
662
663
+ // groupby grouper event
664
+ $ ( document ) . on ( 'change' , this . _wrapSelector ( '#vp_gbByGrouper' ) , function ( ) {
665
+ var useGrouper = $ ( this ) . prop ( 'checked' ) ;
666
+ that . state . useGrouper = useGrouper ;
667
+
668
+ if ( useGrouper == true ) {
669
+ $ ( that . _wrapSelector ( '.vp-gb-by-grouper-box' ) ) . show ( ) ;
670
+ } else {
671
+ $ ( that . _wrapSelector ( '.vp-gb-by-grouper-box' ) ) . hide ( ) ;
672
+ }
673
+ } ) ;
674
+
675
+ // grouper number change event
676
+ $ ( document ) . on ( 'change' , this . _wrapSelector ( '#vp_gbByGrouperNumber' ) , function ( ) {
677
+ that . state . grouperNumber = $ ( this ) . val ( ) ;
678
+ } ) ;
679
+
680
+ // grouper period change event
681
+ $ ( document ) . on ( 'change' , this . _wrapSelector ( '#vp_gbByGrouperPeriod' ) , function ( ) {
682
+ that . state . grouperPeriod = $ ( this ) . val ( ) ;
683
+ } ) ;
684
+
607
685
// display change event
608
686
$ ( document ) . on ( 'change' , this . _wrapSelector ( '#vp_gbDisplay' ) , function ( event ) {
609
687
var colList = event . colList ;
@@ -875,7 +953,8 @@ define([
875
953
generateCode ( ) {
876
954
var code = new sb . StringBuilder ( ) ;
877
955
var {
878
- variable, groupby, display, method, advanced, allocateTo, resetIndex
956
+ variable, groupby, useGrouper, grouperNumber, grouperPeriod,
957
+ display, method, advanced, allocateTo, resetIndex
879
958
} = this . state ;
880
959
881
960
//====================================================================
@@ -886,7 +965,7 @@ define([
886
965
}
887
966
888
967
//====================================================================
889
- // Dataframe variable & Groupby columns
968
+ // Dataframe variable & Groupby(with Grouper) columns
890
969
//====================================================================
891
970
var byStr = '' ;
892
971
if ( groupby . length <= 1 ) {
@@ -895,12 +974,16 @@ define([
895
974
byStr = '[' + groupby . join ( ',' ) + ']' ;
896
975
}
897
976
898
- var optStr = '' ;
977
+ // Grouper
978
+ if ( useGrouper ) {
979
+ byStr = vpCommon . formatString ( "pd.Grouper(key={0}, freq='{1}')" , byStr , grouperNumber + grouperPeriod ) ;
980
+ }
981
+
899
982
if ( resetIndex == true ) {
900
- optStr = ', as_index=False' ;
983
+ byStr + = ', as_index=False' ;
901
984
}
902
985
// variable & groupby columns & option
903
- code . appendFormat ( '{0}.groupby({1}{2} )' , variable , byStr , optStr ) ;
986
+ code . appendFormat ( '{0}.groupby({1})' , variable , byStr ) ;
904
987
905
988
//====================================================================
906
989
// Display columns
0 commit comments