@@ -1036,7 +1036,7 @@ def covariance(x, y, /):
1036
1036
raise StatisticsError ('covariance requires at least two data points' )
1037
1037
xbar = fsum (x ) / n
1038
1038
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 ))
1040
1040
return sxy / (n - 1 )
1041
1041
1042
1042
@@ -1074,11 +1074,14 @@ def correlation(x, y, /, *, method='linear'):
1074
1074
start = (n - 1 ) / - 2 # Center rankings around zero
1075
1075
x = _rank (x , start = start )
1076
1076
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 )
1082
1085
try :
1083
1086
return sxy / sqrt (sxx * syy )
1084
1087
except ZeroDivisionError :
@@ -1131,14 +1134,13 @@ def linear_regression(x, y, /, *, proportional=False):
1131
1134
raise StatisticsError ('linear regression requires that both inputs have same number of data points' )
1132
1135
if n < 2 :
1133
1136
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 :
1138
1138
xbar = fsum (x ) / n
1139
1139
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 )
1142
1144
try :
1143
1145
slope = sxy / sxx # equivalent to: covariance(x, y) / variance(x)
1144
1146
except ZeroDivisionError :
0 commit comments