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ê.
A
e façaB
parte de um fator de agrupamento maior que você deseja normalizar separadamente deC
eD
.