@@ -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
16351636group_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
16901692group_ohlc_template = """@cython.wraparound(False)
0 commit comments