Skip to content

Commit a655247

Browse files
committed
update groupby to display dataframe
1 parent 57ad7a0 commit a655247

2 files changed

Lines changed: 140 additions & 24 deletions

File tree

danfojs/src/core/groupby.js

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -165,13 +165,20 @@ export class GroupBy {
165165
*/
166166
arithemetic(operation){
167167

168-
let ops_name = ["mean","sum","count","mode"]
168+
let ops_name = ["mean","sum","count","mode","std","var","cumsum","cumprod",
169+
"cummax","cummin"]
169170

170171
let ops_map = {
171172
"mean": "mean()",
172173
"sum": "sum()",
173174
"mode": "mode()",
174-
"count": "count()"
175+
"count": "count()",
176+
"std" : "std()",
177+
"var" : "var()",
178+
"cumsum" : "cumsum().values",
179+
"cumprod": "cumprod().values",
180+
"cummax" : "cummax().values",
181+
"cummin" : "cummin().values"
175182
}
176183
let is_array = false;
177184

@@ -201,8 +208,11 @@ export class GroupBy {
201208
}else{
202209
data = eval(`this.group_col[key1][key2][i].${operation}`)
203210
}
204-
205-
count_group[key1][key2].push(data)
211+
if(Array.isArray(data)){
212+
count_group[key1][key2].push(...data)
213+
}else{
214+
count_group[key1][key2].push(data)
215+
}
206216
}
207217

208218
}
@@ -227,8 +237,12 @@ export class GroupBy {
227237
}else{
228238
data = eval(`this.group_col[key1][i].${operation}`)
229239
}
240+
if(Array.isArray(data)){
241+
count_group[key1].push(...data)
242+
}else{
243+
count_group[key1].push(data)
244+
}
230245

231-
count_group[key1].push(data)
232246
}
233247
}
234248

@@ -251,7 +265,46 @@ export class GroupBy {
251265
return df
252266
}
253267

268+
std(){
269+
let value = this.arithemetic("std()")
270+
let df = this.to_DataFrame(this.key_col, this.group_col_name,value,"std")
271+
return df
272+
}
273+
274+
var(){
275+
let value = this.arithemetic("var()")
276+
let df = this.to_DataFrame(this.key_col, this.group_col_name,value,"var")
277+
return df
278+
}
279+
280+
mean(){
281+
let value = this.arithemetic("mean()")
282+
let df = this.to_DataFrame(this.key_col, this.group_col_name,value,"mean")
283+
return df
284+
}
285+
286+
cumsum(){
287+
let value = this.arithemetic("cumsum().values")
288+
let df = this.to_DataFrame(this.key_col, this.group_col_name,value,"cumsum")
289+
return df
290+
}
291+
cummax(){
292+
let value = this.arithemetic("cummax().values")
293+
let df = this.to_DataFrame(this.key_col, this.group_col_name,value,"cummax")
294+
return df
295+
}
254296

297+
cumprod(){
298+
let value = this.arithemetic("cumprod().values")
299+
let df = this.to_DataFrame(this.key_col, this.group_col_name,value,"cumprod")
300+
return df
301+
}
302+
303+
cummin(){
304+
let value = this.arithemetic("cummin().values")
305+
let df = this.to_DataFrame(this.key_col, this.group_col_name,value,"cummin")
306+
return df
307+
}
255308

256309
/**
257310
* returns dataframe of a group
@@ -312,8 +365,8 @@ export class GroupBy {
312365
for(let key_2 in key_val){
313366
let k_data = key_val[key_2]
314367
let kk = []
315-
kk[0] = key_1
316-
kk[1] = key_2
368+
kk[0] = isNaN(parseInt(key_1)) ? key_1 : parseInt(key_1)
369+
kk[1] = isNaN(parseInt(key_2)) ? key_1 : parseInt(key_2)
317370
kk.push(...k_data)
318371
df_data.push(kk)
319372

@@ -336,7 +389,8 @@ export class GroupBy {
336389

337390
let key_val = data[key_1]
338391

339-
let key_data = [key_1]
392+
let key_data = []
393+
key_data[0] = isNaN(parseInt(key_1)) ? key_1 : parseInt(key_1)
340394
key_data.push(...key_val)
341395
df_data.push(key_data)
342396
}

danfojs/tests/core/groupby.js

Lines changed: 78 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,10 @@ describe("groupby", function () {
6262
let df = new DataFrame(data, { columns: cols })
6363
let group_df = df.groupby(["A", "B"]);
6464
let new_data = [
65-
[ '1', '2', 1 ],
66-
[ '4', '5', 1 ],
67-
[ '20', '30', 1 ],
68-
[ '39', '89', 1 ]
65+
[ 1, 2, 1 ],
66+
[ 4, 5, 1 ],
67+
[ 20, 30, 1 ],
68+
[ 39, 89, 1 ]
6969
]
7070

7171
assert.deepEqual(group_df.col(["C"]).count().values, new_data);
@@ -77,10 +77,10 @@ describe("groupby", function () {
7777
let df = new DataFrame(data, { columns: cols })
7878
let group_df = df.groupby(["A", "B"]);
7979
let new_data = [
80-
[ '1', '2', 3 ],
81-
[ '4', '5', 6 ],
82-
[ '20', '30', 40 ],
83-
[ '39', '89', 78 ]
80+
[ 1, 2, 3 ],
81+
[ 4, 5, 6 ],
82+
[ 20, 30, 40 ],
83+
[ 39, 89, 78 ]
8484
]
8585
assert.deepEqual(group_df.col(["C"]).sum().values, new_data);
8686
});
@@ -93,10 +93,10 @@ describe("groupby", function () {
9393
let group_df = df.groupby(["A","B"]);
9494

9595
let new_data = [
96-
[ '1', '2', 2, 3 ],
97-
[ '1', '5', 5, 6 ],
98-
[ '20', '30', 30, 40 ],
99-
[ '39', '89', 89, 78 ]
96+
[ 1, 2, 2, 3 ],
97+
[ 1, 5, 5, 6 ],
98+
[ 20, 30, 30, 40 ],
99+
[ 39, 89, 89, 78 ]
100100
]
101101

102102
assert.deepEqual(group_df.col(["B", "C"]).sum().values, new_data);
@@ -109,14 +109,76 @@ describe("groupby", function () {
109109
let df = new DataFrame(data, { columns: cols })
110110
let group_df = df.groupby(["A", "B"]);
111111
let new_data = [
112-
[ '1', '2', 2, 1 ],
113-
[ '4', '5', 5, 1 ],
114-
[ '20', '30', 30, 1 ],
115-
[ '39', '89', 89, 1 ]
112+
[ 1, 2, 2, 1 ],
113+
[ 4, 5, 5, 1 ],
114+
[ 20, 30, 30, 1 ],
115+
[39, 89, 89, 1 ]
116116
]
117117

118118
assert.deepEqual(group_df.agg({ "B": "mean", "C": "count" }).values, new_data);
119119
});
120+
it("cummulative sum for groupby", function () {
120121

122+
let data = [[1, 2, 3], [4, 5, 6], [20, 30, 40], [39, 89, 78]]
123+
let cols = ["A", "B", "C"]
124+
let df = new DataFrame(data, { columns: cols })
125+
let group_df = df.groupby(["A", "B"]);
126+
let new_data = [
127+
[ 1, 2, 2, 3 ],
128+
[ 4, 5, 5 , 6 ],
129+
[ 20, 30, 30, 40 ],
130+
[ 39, 89, 89 , 78 ]
131+
]
132+
133+
assert.deepEqual(group_df.col(["B", "C"]).cumsum().values, new_data);
134+
});
135+
it("cummulative max for groupby", function () {
136+
137+
let data = [[1, 2, 3], [4, 5, 6], [20, 30, 40], [39, 89, 78]]
138+
let cols = ["A", "B", "C"]
139+
let df = new DataFrame(data, { columns: cols })
140+
let group_df = df.groupby(["A"]);
141+
let new_data = [ [ 1, 3 ], [ 4, 6 ], [ 20, 40 ], [ 39, 78 ] ]
142+
143+
144+
145+
assert.deepEqual(group_df.col(["C"]).cummax().values, new_data);
146+
});
147+
it("cummulative min for groupby", function () {
148+
149+
let data = [[1, 2, 3], [4, 5, 6], [20, 30, 40], [39, 89, 78]]
150+
let cols = ["A", "B", "C"]
151+
let df = new DataFrame(data, { columns: cols })
152+
let group_df = df.groupby(["A"]);
153+
let new_data = [ [ 1, 3 ], [ 4, 6 ], [ 20, 40 ], [ 39, 78 ] ]
154+
155+
assert.deepEqual(group_df.col(["C"]).cummin().values, new_data);
156+
});
157+
158+
it("cummulative prod for groupby", function () {
159+
160+
let data = [[1, 2, 3], [4, 5, 6], [20, 30, 40], [39, 89, 78]]
161+
let cols = ["A", "B", "C"]
162+
let df = new DataFrame(data, { columns: cols })
163+
let group_df = df.groupby(["A"]);
164+
let new_data = [ [ 1, 3 ], [ 4, 6 ], [ 20, 40 ], [ 39, 78 ] ]
165+
166+
assert.deepEqual(group_df.col(["C"]).cumprod().values, new_data);
167+
});
168+
it("mean for groupby", function () {
169+
170+
let data = [[1, 2, 3], [4, 5, 6], [20, 30, 40], [39, 89, 78]]
171+
let cols = ["A", "B", "C"]
172+
let df = new DataFrame(data, { columns: cols })
173+
let group_df = df.groupby(["A", "B"]);
174+
let new_data = [
175+
[ 1, 2, 2, 3 ],
176+
[ 4, 5, 5 , 6 ],
177+
[ 20, 30, 30, 40 ],
178+
[ 39, 89, 89 , 78 ]
179+
]
180+
181+
assert.deepEqual(group_df.col(["B", "C"]).mean().values, new_data);
182+
});
121183

122184
});

0 commit comments

Comments
 (0)