Sedikit dimodifikasi dari: Python Pandas Dataframe: Normalisasi data antara 0,01 dan 0,99? tetapi dari beberapa komentar berpikir itu relevan (maaf jika dianggap sebagai repost ...)
Saya ingin normalisasi khusus dalam persentil reguler datum atau z-score tidak memadai. Kadang-kadang saya tahu apa yang layak dan minimum dari populasi itu, dan karena itu ingin mendefinisikannya selain sampel saya, atau titik tengah yang berbeda, atau apa pun! Ini sering berguna untuk menskalakan dan menormalkan data untuk jaring saraf di mana Anda mungkin ingin semua input antara 0 dan 1, tetapi beberapa data Anda mungkin perlu diskalakan dengan cara yang lebih khusus ... karena persentil dan stdev mengasumsikan sampul sampel Anda populasi, tetapi kadang-kadang kita tahu ini tidak benar. Itu juga sangat berguna bagi saya ketika memvisualisasikan data dalam heatmaps. Jadi saya membangun fungsi khusus (menggunakan langkah-langkah tambahan dalam kode di sini untuk membuatnya terbaca mungkin):
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
Ini akan mengambil seri panda, atau bahkan hanya daftar dan menormalkannya ke titik rendah, tengah, dan tinggi yang Anda tentukan. juga ada faktor menyusut! untuk memungkinkan Anda mengurangi data dari titik 0 dan 1 (saya harus melakukan ini ketika menggabungkan colormaps di matplotlib: PColormesh tunggal dengan lebih dari satu colormap menggunakan Matplotlib ) Jadi Anda mungkin dapat melihat bagaimana kode bekerja, tetapi pada dasarnya mengatakan Anda memiliki nilai [-5,1,10] dalam sampel, tetapi ingin menormalkan berdasarkan rentang -7 hingga 7 (jadi apa pun di atas 7, "10" kami diperlakukan sebagai 7 secara efektif) dengan titik tengah 2, tetapi menyusutkan agar sesuai dengan colormap 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]
Ini juga dapat mengubah data Anda ke dalam ... ini mungkin tampak aneh, tetapi saya menemukan itu berguna untuk memetakan. Katakanlah Anda menginginkan warna yang lebih gelap untuk nilai yang lebih dekat ke 0 daripada hi / rendah. Anda dapat memetakan berdasarkan data yang dinormalisasi di mana 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]
Jadi sekarang "2" yang paling dekat dengan pusat, didefinisikan sebagai "1" adalah nilai tertinggi.
Bagaimanapun, saya pikir aplikasi saya relevan jika Anda ingin mengubah skala data dengan cara lain yang bisa memiliki aplikasi yang berguna bagi Anda.
A
danB
merupakan bagian dari faktor pengelompokan yang lebih besar yang ingin Anda normalkan secara terpisah dariC
danD
.