Skip to content

Commit 5e4d53b

Browse files
committed
min/max
1 parent a143259 commit 5e4d53b

File tree

2 files changed

+512
-496
lines changed

2 files changed

+512
-496
lines changed

pandas/src/generate_code.py

+128-124
Original file line numberDiff line numberDiff line change
@@ -1357,41 +1357,42 @@ def group_min_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
13571357
13581358
N, K = (<object> values).shape
13591359
1360-
b = 0
1361-
if K > 1:
1362-
for i in range(N):
1363-
while b < ngroups - 1 and i >= bins[b]:
1364-
b += 1
1360+
with nogil:
1361+
b = 0
1362+
if K > 1:
1363+
for i in range(N):
1364+
while b < ngroups - 1 and i >= bins[b]:
1365+
b += 1
13651366
1366-
counts[b] += 1
1367-
for j in range(K):
1368-
val = values[i, j]
1367+
counts[b] += 1
1368+
for j in range(K):
1369+
val = values[i, j]
13691370
1370-
# not nan
1371-
if val == val:
1372-
nobs[b, j] += 1
1373-
if val < minx[b, j]:
1374-
minx[b, j] = val
1375-
else:
1376-
for i in range(N):
1377-
while b < ngroups - 1 and i >= bins[b]:
1378-
b += 1
1371+
# not nan
1372+
if val == val:
1373+
nobs[b, j] += 1
1374+
if val < minx[b, j]:
1375+
minx[b, j] = val
1376+
else:
1377+
for i in range(N):
1378+
while b < ngroups - 1 and i >= bins[b]:
1379+
b += 1
13791380
1380-
counts[b] += 1
1381-
val = values[i, 0]
1381+
counts[b] += 1
1382+
val = values[i, 0]
13821383
1383-
# not nan
1384-
if val == val:
1385-
nobs[b, 0] += 1
1386-
if val < minx[b, 0]:
1387-
minx[b, 0] = val
1384+
# not nan
1385+
if val == val:
1386+
nobs[b, 0] += 1
1387+
if val < minx[b, 0]:
1388+
minx[b, 0] = val
13881389
1389-
for i in range(ngroups):
1390-
for j in range(K):
1391-
if nobs[i, j] == 0:
1392-
out[i, j] = %(nan_val)s
1393-
else:
1394-
out[i, j] = minx[i, j]
1390+
for i in range(ngroups):
1391+
for j in range(K):
1392+
if nobs[i, j] == 0:
1393+
out[i, j] = %(nan_val)s
1394+
else:
1395+
out[i, j] = minx[i, j]
13951396
"""
13961397

13971398
group_max_template = """@cython.wraparound(False)
@@ -1404,7 +1405,7 @@ def group_max_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
14041405
Only aggregates on axis=0
14051406
'''
14061407
cdef:
1407-
Py_ssize_t i, j, N, K, lab
1408+
Py_ssize_t i, j, N, K, lab, ncounts = len(counts)
14081409
%(dest_type2)s val, count
14091410
ndarray[%(dest_type2)s, ndim=2] maxx, nobs
14101411
@@ -1418,42 +1419,43 @@ def group_max_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
14181419
14191420
N, K = (<object> values).shape
14201421
1421-
if K > 1:
1422-
for i in range(N):
1423-
lab = labels[i]
1424-
if lab < 0:
1425-
continue
1422+
with nogil:
1423+
if K > 1:
1424+
for i in range(N):
1425+
lab = labels[i]
1426+
if lab < 0:
1427+
continue
14261428
1427-
counts[lab] += 1
1428-
for j in range(K):
1429-
val = values[i, j]
1429+
counts[lab] += 1
1430+
for j in range(K):
1431+
val = values[i, j]
14301432
1431-
# not nan
1432-
if val == val:
1433-
nobs[lab, j] += 1
1434-
if val > maxx[lab, j]:
1435-
maxx[lab, j] = val
1436-
else:
1437-
for i in range(N):
1438-
lab = labels[i]
1439-
if lab < 0:
1440-
continue
1433+
# not nan
1434+
if val == val:
1435+
nobs[lab, j] += 1
1436+
if val > maxx[lab, j]:
1437+
maxx[lab, j] = val
1438+
else:
1439+
for i in range(N):
1440+
lab = labels[i]
1441+
if lab < 0:
1442+
continue
14411443
1442-
counts[lab] += 1
1443-
val = values[i, 0]
1444+
counts[lab] += 1
1445+
val = values[i, 0]
14441446
1445-
# not nan
1446-
if val == val:
1447-
nobs[lab, 0] += 1
1448-
if val > maxx[lab, 0]:
1449-
maxx[lab, 0] = val
1447+
# not nan
1448+
if val == val:
1449+
nobs[lab, 0] += 1
1450+
if val > maxx[lab, 0]:
1451+
maxx[lab, 0] = val
14501452
1451-
for i in range(len(counts)):
1452-
for j in range(K):
1453-
if nobs[i, j] == 0:
1454-
out[i, j] = %(nan_val)s
1455-
else:
1456-
out[i, j] = maxx[i, j]
1453+
for i in range(ncounts):
1454+
for j in range(K):
1455+
if nobs[i, j] == 0:
1456+
out[i, j] = %(nan_val)s
1457+
else:
1458+
out[i, j] = maxx[i, j]
14571459
"""
14581460

14591461
group_max_bin_template = """@cython.wraparound(False)
@@ -1481,41 +1483,42 @@ def group_max_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
14811483
14821484
N, K = (<object> values).shape
14831485
1484-
b = 0
1485-
if K > 1:
1486-
for i in range(N):
1487-
while b < ngroups - 1 and i >= bins[b]:
1488-
b += 1
1486+
with nogil:
1487+
b = 0
1488+
if K > 1:
1489+
for i in range(N):
1490+
while b < ngroups - 1 and i >= bins[b]:
1491+
b += 1
14891492
1490-
counts[b] += 1
1491-
for j in range(K):
1492-
val = values[i, j]
1493+
counts[b] += 1
1494+
for j in range(K):
1495+
val = values[i, j]
14931496
1494-
# not nan
1495-
if val == val:
1496-
nobs[b, j] += 1
1497-
if val > maxx[b, j]:
1498-
maxx[b, j] = val
1499-
else:
1500-
for i in range(N):
1501-
while b < ngroups - 1 and i >= bins[b]:
1502-
b += 1
1497+
# not nan
1498+
if val == val:
1499+
nobs[b, j] += 1
1500+
if val > maxx[b, j]:
1501+
maxx[b, j] = val
1502+
else:
1503+
for i in range(N):
1504+
while b < ngroups - 1 and i >= bins[b]:
1505+
b += 1
15031506
1504-
counts[b] += 1
1505-
val = values[i, 0]
1507+
counts[b] += 1
1508+
val = values[i, 0]
15061509
1507-
# not nan
1508-
if val == val:
1509-
nobs[b, 0] += 1
1510-
if val > maxx[b, 0]:
1511-
maxx[b, 0] = val
1510+
# not nan
1511+
if val == val:
1512+
nobs[b, 0] += 1
1513+
if val > maxx[b, 0]:
1514+
maxx[b, 0] = val
15121515
1513-
for i in range(ngroups):
1514-
for j in range(K):
1515-
if nobs[i, j] == 0:
1516-
out[i, j] = %(nan_val)s
1517-
else:
1518-
out[i, j] = maxx[i, j]
1516+
for i in range(ngroups):
1517+
for j in range(K):
1518+
if nobs[i, j] == 0:
1519+
out[i, j] = %(nan_val)s
1520+
else:
1521+
out[i, j] = maxx[i, j]
15191522
"""
15201523

15211524

@@ -1529,7 +1532,7 @@ def group_min_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
15291532
Only aggregates on axis=0
15301533
'''
15311534
cdef:
1532-
Py_ssize_t i, j, N, K, lab
1535+
Py_ssize_t i, j, N, K, lab, ncounts = len(counts)
15331536
%(dest_type2)s val, count
15341537
ndarray[%(dest_type2)s, ndim=2] minx, nobs
15351538
@@ -1543,42 +1546,43 @@ def group_min_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
15431546
15441547
N, K = (<object> values).shape
15451548
1546-
if K > 1:
1547-
for i in range(N):
1548-
lab = labels[i]
1549-
if lab < 0:
1550-
continue
1549+
with nogil:
1550+
if K > 1:
1551+
for i in range(N):
1552+
lab = labels[i]
1553+
if lab < 0:
1554+
continue
15511555
1552-
counts[lab] += 1
1553-
for j in range(K):
1554-
val = values[i, j]
1556+
counts[lab] += 1
1557+
for j in range(K):
1558+
val = values[i, j]
15551559
1556-
# not nan
1557-
if val == val:
1558-
nobs[lab, j] += 1
1559-
if val < minx[lab, j]:
1560-
minx[lab, j] = val
1561-
else:
1562-
for i in range(N):
1563-
lab = labels[i]
1564-
if lab < 0:
1565-
continue
1560+
# not nan
1561+
if val == val:
1562+
nobs[lab, j] += 1
1563+
if val < minx[lab, j]:
1564+
minx[lab, j] = val
1565+
else:
1566+
for i in range(N):
1567+
lab = labels[i]
1568+
if lab < 0:
1569+
continue
15661570
1567-
counts[lab] += 1
1568-
val = values[i, 0]
1571+
counts[lab] += 1
1572+
val = values[i, 0]
15691573
1570-
# not nan
1571-
if val == val:
1572-
nobs[lab, 0] += 1
1573-
if val < minx[lab, 0]:
1574-
minx[lab, 0] = val
1574+
# not nan
1575+
if val == val:
1576+
nobs[lab, 0] += 1
1577+
if val < minx[lab, 0]:
1578+
minx[lab, 0] = val
15751579
1576-
for i in range(len(counts)):
1577-
for j in range(K):
1578-
if nobs[i, j] == 0:
1579-
out[i, j] = %(nan_val)s
1580-
else:
1581-
out[i, j] = minx[i, j]
1580+
for i in range(ncounts):
1581+
for j in range(K):
1582+
if nobs[i, j] == 0:
1583+
out[i, j] = %(nan_val)s
1584+
else:
1585+
out[i, j] = minx[i, j]
15821586
"""
15831587

15841588

0 commit comments

Comments
 (0)