Ligeiramente modificado de: Python Pandas Dataframe: Normaliza dados entre 0,01 e 0,99? mas, de alguns dos comentários, isso foi relevante (desculpe se considerado um repost ...)
Eu queria que a normalização personalizada desse percentil regular de referência ou z-score não fosse adequada. Às vezes eu sabia quais eram os máximos e os mínimos possíveis da população e, portanto, queria defini-lo além da minha amostra, ou um ponto médio diferente, ou o que seja! Isso geralmente pode ser útil para redimensionar e normalizar dados para redes neurais, onde você pode querer todas as entradas entre 0 e 1, mas alguns dados podem precisar ser redimensionados de uma maneira mais personalizada ... porque os percentis e stdevs pressupõem que sua amostra cobre a população, mas às vezes sabemos que isso não é verdade. Também foi muito útil para visualizar dados em mapas de calor. Então, eu criei uma função personalizada (usei etapas extras no código aqui para torná-lo o mais legível possível):
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
Isso inclui uma série de pandas, ou mesmo apenas uma lista, e normaliza-a nos pontos baixo, central e alto especificados. Também há um fator de contração! para permitir que você reduza os dados dos pontos de extremidade 0 e 1 (eu tive que fazer isso ao combinar mapas de cores no matplotlib: pcolormesh único com mais de um mapa de cores usando o Matplotlib ). Portanto, você provavelmente pode ver como o código funciona, mas basicamente diz tem valores [-5,1,10] em uma amostra, mas deseja normalizar com base em um intervalo de -7 a 7 (portanto, acima de 7, nosso "10" é tratado como um 7 efetivamente) com um ponto médio de 2, mas reduza-o para caber em um mapa de cores de 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]
Ele também pode transformar seus dados de dentro para fora ... isso pode parecer estranho, mas achei útil para o mapeamento de calor. Digamos que você queira uma cor mais escura para valores próximos de 0, em vez de alto / baixo. Você poderia fazer um mapa de calor com base em dados normalizados, onde 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]
Então agora "2", que está mais próximo do centro, definido como "1", é o valor mais alto.
De qualquer forma, achei que meu aplicativo era relevante se você estivesse procurando redimensionar dados de outras maneiras que poderiam ter aplicativos úteis para você.
Ae façaBparte de um fator de agrupamento maior que você deseja normalizar separadamente deCeD.