Skip to content

Commit 7491509

Browse files
committed
mean,mean_bin
1 parent c94fde7 commit 7491509

File tree

2 files changed

+183
-177
lines changed

2 files changed

+183
-177
lines changed

pandas/src/generate_code.py

+61-59
Original file line numberDiff line numberDiff line change
@@ -1585,7 +1585,7 @@ def group_mean_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
15851585
ndarray[%(dest_type2)s, ndim=2] values,
15861586
ndarray[int64_t] labels):
15871587
cdef:
1588-
Py_ssize_t i, j, N, K, lab
1588+
Py_ssize_t i, j, N, K, lab, ncounts = len(counts)
15891589
%(dest_type2)s val, count
15901590
ndarray[%(dest_type2)s, ndim=2] sumx, nobs
15911591
@@ -1597,39 +1597,40 @@ def group_mean_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
15971597
15981598
N, K = (<object> values).shape
15991599
1600-
if K > 1:
1601-
for i in range(N):
1602-
lab = labels[i]
1603-
if lab < 0:
1604-
continue
1600+
with nogil:
1601+
if K > 1:
1602+
for i in range(N):
1603+
lab = labels[i]
1604+
if lab < 0:
1605+
continue
16051606
1606-
counts[lab] += 1
1607-
for j in range(K):
1608-
val = values[i, j]
1607+
counts[lab] += 1
1608+
for j in range(K):
1609+
val = values[i, j]
1610+
# not nan
1611+
if val == val:
1612+
nobs[lab, j] += 1
1613+
sumx[lab, j] += val
1614+
else:
1615+
for i in range(N):
1616+
lab = labels[i]
1617+
if lab < 0:
1618+
continue
1619+
1620+
counts[lab] += 1
1621+
val = values[i, 0]
16091622
# not nan
16101623
if val == val:
1611-
nobs[lab, j] += 1
1612-
sumx[lab, j] += val
1613-
else:
1614-
for i in range(N):
1615-
lab = labels[i]
1616-
if lab < 0:
1617-
continue
1618-
1619-
counts[lab] += 1
1620-
val = values[i, 0]
1621-
# not nan
1622-
if val == val:
1623-
nobs[lab, 0] += 1
1624-
sumx[lab, 0] += val
1624+
nobs[lab, 0] += 1
1625+
sumx[lab, 0] += val
16251626
1626-
for i in range(len(counts)):
1627-
for j in range(K):
1628-
count = nobs[i, j]
1629-
if nobs[i, j] == 0:
1630-
out[i, j] = NAN
1631-
else:
1632-
out[i, j] = sumx[i, j] / count
1627+
for i in range(ncounts):
1628+
for j in range(K):
1629+
count = nobs[i, j]
1630+
if nobs[i, j] == 0:
1631+
out[i, j] = NAN
1632+
else:
1633+
out[i, j] = sumx[i, j] / count
16331634
"""
16341635

16351636
group_mean_bin_template = """
@@ -1651,40 +1652,41 @@ def group_mean_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
16511652
else:
16521653
ngroups = len(bins) + 1
16531654
1654-
b = 0
1655-
if K > 1:
1656-
for i in range(N):
1657-
while b < ngroups - 1 and i >= bins[b]:
1658-
b += 1
1655+
with nogil:
1656+
b = 0
1657+
if K > 1:
1658+
for i in range(N):
1659+
while b < ngroups - 1 and i >= bins[b]:
1660+
b += 1
16591661
1660-
counts[b] += 1
1661-
for j in range(K):
1662-
val = values[i, j]
1662+
counts[b] += 1
1663+
for j in range(K):
1664+
val = values[i, j]
16631665
1664-
# not nan
1665-
if val == val:
1666-
nobs[b, j] += 1
1667-
sumx[b, j] += val
1668-
else:
1669-
for i in range(N):
1670-
while b < ngroups - 1 and i >= bins[b]:
1671-
b += 1
1666+
# not nan
1667+
if val == val:
1668+
nobs[b, j] += 1
1669+
sumx[b, j] += val
1670+
else:
1671+
for i in range(N):
1672+
while b < ngroups - 1 and i >= bins[b]:
1673+
b += 1
16721674
1673-
counts[b] += 1
1674-
val = values[i, 0]
1675+
counts[b] += 1
1676+
val = values[i, 0]
16751677
1676-
# not nan
1677-
if val == val:
1678-
nobs[b, 0] += 1
1679-
sumx[b, 0] += val
1678+
# not nan
1679+
if val == val:
1680+
nobs[b, 0] += 1
1681+
sumx[b, 0] += val
16801682
1681-
for i in range(ngroups):
1682-
for j in range(K):
1683-
count = nobs[i, j]
1684-
if count == 0:
1685-
out[i, j] = NAN
1686-
else:
1687-
out[i, j] = sumx[i, j] / count
1683+
for i in range(ngroups):
1684+
for j in range(K):
1685+
count = nobs[i, j]
1686+
if count == 0:
1687+
out[i, j] = NAN
1688+
else:
1689+
out[i, j] = sumx[i, j] / count
16881690
"""
16891691

16901692
group_ohlc_template = """@cython.wraparound(False)

0 commit comments

Comments
 (0)