@@ -1036,7 +1036,7 @@ def covariance(x, y, /):
10361036 raise StatisticsError ('covariance requires at least two data points' )
10371037 xbar = fsum (x ) / n
10381038 ybar = fsum (y ) / n
1039- sxy = fsum ((xi - xbar ) * (yi - ybar ) for xi , yi in zip ( x , y ))
1039+ sxy = sumprod ((xi - xbar for xi in x ), (yi - ybar for yi in y ))
10401040 return sxy / (n - 1 )
10411041
10421042
@@ -1074,11 +1074,14 @@ def correlation(x, y, /, *, method='linear'):
10741074 start = (n - 1 ) / - 2 # Center rankings around zero
10751075 x = _rank (x , start = start )
10761076 y = _rank (y , start = start )
1077- xbar = fsum (x ) / n
1078- ybar = fsum (y ) / n
1079- sxy = fsum ((xi - xbar ) * (yi - ybar ) for xi , yi in zip (x , y ))
1080- sxx = fsum ((d := xi - xbar ) * d for xi in x )
1081- syy = fsum ((d := yi - ybar ) * d for yi in y )
1077+ else :
1078+ xbar = fsum (x ) / n
1079+ ybar = fsum (y ) / n
1080+ x = [xi - xbar for xi in x ]
1081+ y = [yi - ybar for yi in y ]
1082+ sxy = sumprod (x , y )
1083+ sxx = sumprod (x , x )
1084+ syy = sumprod (y , y )
10821085 try :
10831086 return sxy / sqrt (sxx * syy )
10841087 except ZeroDivisionError :
@@ -1131,14 +1134,13 @@ def linear_regression(x, y, /, *, proportional=False):
11311134 raise StatisticsError ('linear regression requires that both inputs have same number of data points' )
11321135 if n < 2 :
11331136 raise StatisticsError ('linear regression requires at least two data points' )
1134- if proportional :
1135- sxy = fsum (xi * yi for xi , yi in zip (x , y ))
1136- sxx = fsum (xi * xi for xi in x )
1137- else :
1137+ if not proportional :
11381138 xbar = fsum (x ) / n
11391139 ybar = fsum (y ) / n
1140- sxy = fsum ((xi - xbar ) * (yi - ybar ) for xi , yi in zip (x , y ))
1141- sxx = fsum ((d := xi - xbar ) * d for xi in x )
1140+ x = [xi - xbar for xi in x ] # List because used three times below
1141+ y = (yi - ybar for yi in y ) # Generator because only used once below
1142+ sxy = sumprod (x , y ) + 0.0 # Add zero to coerce result to a float
1143+ sxx = sumprod (x , x )
11421144 try :
11431145 slope = sxy / sxx # equivalent to: covariance(x, y) / variance(x)
11441146 except ZeroDivisionError :
0 commit comments