For pure sine waves, pf = cos(phi), where phi is the phase angle.
No matter what combination of inductive and capacitive load you have, if you don’t generate any real power, you cannot get a phase angle that is not in the range <-pi/2; pi/2>. Thus, pf is in the range <0; 1>.
Pf can only be negative if real power is being generated. However, in that case, P is also negative.
The vector math wouldn’t work if PF was negative for an inductive load.
S = P + jQ
P is real power being consumed. Since this is a load and not a generator, P is a positive number.
Q is the reactive power. Either positive or negative, based on load type.
S is complex power.
|S| is apparent power.
P = pf * |S|
|S| is always positive. Thus, PF can only be negative if P is negative (i.e. if real power is being produced, which an inductive load cannot do).
I recommend that you read the wikipedia article. It clearly show the equations, as well as the graphical representation (power triangle).
What I was trying to explain in one of my previous comments was that you used the incorrect equation in your example.
P = 12.88 W
Q = -93.52 var (you thought this to be |S| = -93.52 VA, which cannot be true).
You are calculating PF = P / Q, which is not right. For example, Q = 0 for a purely resistive load. If your equation was correct, PF wouldn’t be defined for a purely resistive load (division by zero), yet it’s a well-known fact that it’s 1 (see the Wikipedia article).
I didn't want to start a flame war. I agree that Home Assistant shouldn't be returning the abs() of PF as this is removing a piece of information the device is sending.
What I don’t agree with is your explanation of why PF would be negative.
I also don’t think the device is returning the true power factor (which would have the same sign as P), but rather a value that also contains information about the PF being leading / lagging, which cannot normally be decided just based on the value of PF (again, see Wikipedia).