Ligeramente modificado de: Python Pandas Dataframe: ¿Normalizar datos entre 0.01 y 0.99? pero de algunos de los comentarios pensé que era relevante (lo siento si se considera una nueva publicación ...)
Quería una normalización personalizada en ese percentil regular de referencia o la puntuación z no era adecuada. ¡A veces sabía cuáles eran los valores máximos y mínimos posibles de la población y, por lo tanto, quería definirlos aparte de mi muestra, o un punto medio diferente, o lo que sea! Esto a menudo puede ser útil para reescalar y normalizar datos para redes neuronales donde es posible que desee todas las entradas entre 0 y 1, pero es posible que algunos de sus datos necesiten escalarse de una manera más personalizada ... porque los percentiles y estándares asumen que su muestra cubre la población, pero a veces sabemos que esto no es cierto. También fue muy útil para mí al visualizar datos en mapas de calor. Así que construí una función personalizada (usé pasos adicionales en el código aquí para que sea lo más legible posible):
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
Esto incluirá una serie de pandas, o incluso solo una lista, y la normalizará a los puntos bajos, centrales y altos especificados. ¡También hay un factor de contracción! para permitirle reducir la escala de los datos de los puntos finales 0 y 1 (tuve que hacer esto al combinar mapas de color en matplotlib: pcolormesh único con más de un mapa de colores usando Matplotlib ) Entonces, probablemente pueda ver cómo funciona el código, pero básicamente diga que tener valores [-5,1,10] en una muestra, pero desea normalizar en función de un rango de -7 a 7 (por lo tanto, cualquier cosa por encima de 7, nuestro "10" se trata como un 7 efectivamente) con un punto medio de 2, pero encogerlo para que se ajuste a un mapa de color 256 RGB:
#In[1]
NormData([-5,2,10],low=-7,center=1,hi=7,shrinkfactor=2./256)
#Out[1]
[0.1279296875, 0.5826822916666667, 0.99609375]
También puede convertir sus datos al revés ... esto puede parecer extraño, pero lo encontré útil para el mapeo de calor. Supongamos que desea un color más oscuro para valores más cercanos a 0 en lugar de alto / bajo. Podría realizar un mapa de calor basado en datos normalizados donde 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]
Así que ahora "2", que está más cerca del centro, definido como "1" es el valor más alto.
De todos modos, pensé que mi aplicación era relevante si estaba buscando reescalar datos de otras maneras que podrían tener aplicaciones útiles para usted.
A
yB
forme parte de un factor de agrupación más grande que desea normalizar por separado deC
yD
.