Euclidean norm can have a value of 1, or some other value. Any norm can have a value of 1 or some other value.
If you divide the weights by the norm, then they should produce a vector with norm of 1. SAS is obviously not dividing the weights by the norm. Python must be dividing the weights by the norm. It's optional whether a PLS program does this or not, because it doesn't affect the predicted values or the model fit. SAS obviously applies the scaling factor later in the algorithm than Python does. So I conclude that SAS and Python are calculating the weights the exact same way (is that what you need to know?) and then Python scales them but SAS doesn't.
Here is simple data step code which finds the Euclidean norm of the weights, and then re-scales the weights by dividing by the norm, so that you can see the difference, and how after you do the division, the norm becomes 1.
DATA regress;
INPUT Y X1 X2 X3 X4 X5;
DATALINES;
7 0 23 3 4 1
8 2 7 2 3 2
2 0 8 8 3 3
6 0 9 2 5 4
5 0 1 5 2 5
;
RUN;
PROC PLS DATA=regress nfac = 1 details varss ;
ods output
XWeights = work.pls_xweights;
MODEL Y = X1 X2 X3 X4 X5;
RUN;
data ssq;
set pls_xweights;
norm_x=sqrt(uss(of x1-x5));
y1=x1/norm_x;
y2=x2/norm_x;
y3=x3/norm_x;
y4=x4/norm_x;
y5=x5/norm_x;
norm_y=sqrt(uss(of y1-y5));
run;
... View more