@@ -1585,7 +1585,7 @@ def group_mean_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
1585
1585
ndarray[%(dest_type2)s, ndim=2] values,
1586
1586
ndarray[int64_t] labels):
1587
1587
cdef:
1588
- Py_ssize_t i, j, N, K, lab
1588
+ Py_ssize_t i, j, N, K, lab, ncounts = len(counts)
1589
1589
%(dest_type2)s val, count
1590
1590
ndarray[%(dest_type2)s, ndim=2] sumx, nobs
1591
1591
@@ -1597,39 +1597,40 @@ def group_mean_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
1597
1597
1598
1598
N, K = (<object> values).shape
1599
1599
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
1605
1606
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]
1609
1622
# not nan
1610
1623
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
1625
1626
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
1633
1634
"""
1634
1635
1635
1636
group_mean_bin_template = """
@@ -1651,40 +1652,41 @@ def group_mean_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out,
1651
1652
else:
1652
1653
ngroups = len(bins) + 1
1653
1654
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
1659
1661
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]
1663
1665
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
1672
1674
1673
- counts[b] += 1
1674
- val = values[i, 0]
1675
+ counts[b] += 1
1676
+ val = values[i, 0]
1675
1677
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
1680
1682
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
1688
1690
"""
1689
1691
1690
1692
group_ohlc_template = """@cython.wraparound(False)
0 commit comments