So hatte ich ein ähnliches Problem, wo ich benutzerdefinierte Normalisierung wollte, in der ich regelmäßige Perzentil von Datum oder Z-Score war nicht ausreichend. Manchmal wusste ich, was das zulässige Maximum und Minimum der Population war, und wollte es daher anders definieren als meine Probe oder einen anderen Mittelpunkt oder was auch immer! Also baute ich eine benutzerdefinierte Funktion (zusätzliche Schritte in dem Code hier verwendet, um sie so lesbar wie möglich):
def NormData(s,low='min',center='mid',hi='max',insideout=False,shrinkfactor=0.):
if low=='min':
low=min(s)
elif low=='abs':
low=max(abs(min(s)),abs(max(s)))*-1.#sign(min(s))
if hi=='max':
hi=max(s)
elif hi=='abs':
hi=max(abs(min(s)),abs(max(s)))*1.#sign(max(s))
if center=='mid':
center=(max(s)+min(s))/2
elif center=='avg':
center=mean(s)
elif center=='median':
center=median(s)
s2=[x-center for x in s]
hi=hi-center
low=low-center
center=0.
r=[]
for x in s2:
if x<low:
r.append(0.)
elif x>hi:
r.append(1.)
else:
if x>=center:
r.append((x-center)/(hi-center)*0.5+0.5)
else:
r.append((x-low)/(center-low)*0.5+0.)
if insideout==True:
ir=[(1.-abs(z-0.5)*2.) for z in r]
r=ir
rr =[x-(x-0.5)*shrinkfactor for x in r]
return rr
Dies dauert in einer Pandas Serie, oder auch nur eine Liste und eine Normalisierung auf Ihren angegebenen niedrig , Mittelpunkt und Höhepunkte. auch da ist ein Schrumpfungsfaktor! Damit können Sie die Daten von 0 und 1 herunterskalieren (das musste ich tun, wenn ich Colormaps in Matplotlib kombiniere: Single pcolormesh with more than one colormap using Matplotlib). So können Sie wahrscheinlich sehen, wie der Code funktioniert, aber im Grunde sagen Sie, dass Sie Werte haben [-5,1,10 ] in einem Beispiel, aber möchten auf einem Bereich von -7 bis 7 normalisieren (also alles über 7, unsere "10" wird effektiv wie eine 7 behandelt) mit einem Mittelpunkt von 2, aber verkleinern Sie es, um eine 256 RGB-Farbtabelle zu passen :
#In[1]
NormData([-5,2,10],low=-7,center=1,hi=7,shrinkfactor=2./256)
#Out[1]
[0.1279296875, 0.5826822916666667, 0.99609375]
es Ihre Daten auch von innen nach außen drehen kann ... das mag seltsam erscheinen, aber ich fand es für heatmapping nützlich. Angenommen, Sie möchten eine dunklere Farbe für Werte, die näher bei 0 als bei hi/low liegen.Sie könnten Heatmap auf normalisierten Daten basieren, wo insideout = True:
#In[2]
NormData([-5,2,10],low=-7,center=1,hi=7,insideout=True,shrinkfactor=2./256)
#Out[2]
[0.251953125, 0.8307291666666666, 0.00390625]
So, jetzt „2“, die am nächsten zum Zentrum ist, definiert als „1“ ist der höchste Wert.
Wie auch immer, ich dachte mein Problem war sehr ähnlich zu deiner und diese Funktion könnte dir nützlich sein.