Ko'pincha Data Science sohasiga kiruvchi odamlar ularni nima kutayotganiga nisbatan real umidlarga ega emaslar. Ko'pchilik endi ular ajoyib neyron tarmoqlarni yozadilar, Iron Man-dan ovozli yordamchini yaratadilar yoki moliyaviy bozorlarda hammani mag'lub etadilar deb o'ylashadi.
Lekin ish ma'lumotlar Olim ma'lumotlarga asoslangan va eng muhim va ko'p vaqt talab qiladigan jihatlardan biri ma'lumotlarni neyron tarmoqqa yuborishdan yoki ma'lum bir usulda tahlil qilishdan oldin qayta ishlashdir.
Ushbu maqolada bizning jamoamiz bosqichma-bosqich ko'rsatmalar va kod yordamida ma'lumotlarni qanday tez va oson qayta ishlashingiz mumkinligini tasvirlab beradi. Biz kodni juda moslashuvchan qilishga harakat qildik va uni turli ma'lumotlar to'plamlari uchun ishlatish mumkin edi.
Ko'pgina mutaxassislar ushbu maqolada g'ayrioddiy narsani topa olmasligi mumkin, ammo yangi boshlanuvchilar yangi narsalarni o'rganishlari mumkin va uzoq vaqtdan beri tez va tuzilgan ma'lumotlarni qayta ishlash uchun alohida daftar qilishni orzu qilgan har bir kishi kodni nusxalashi va uni o'zi uchun formatlashi mumkin yoki
Biz ma'lumotlar to'plamini oldik. Keyin nima qilish kerak?
Shunday qilib, standart: biz nima bilan shug'ullanayotganimizni, umumiy rasmni tushunishimiz kerak. Buning uchun biz turli xil ma'lumotlar turlarini aniqlash uchun pandalardan foydalanamiz.
import pandas as pd #ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ pandas
import numpy as np #ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ numpy
df = pd.read_csv("AB_NYC_2019.csv") #ΡΠΈΡΠ°Π΅ΠΌ Π΄Π°ΡΠ°ΡΠ΅Ρ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ df
df.head(3) #ΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΠΏΠ΅ΡΠ²ΡΠ΅ 3 ΡΡΡΠΎΡΠΊΠΈ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
df.info() #ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅ΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°Ρ
Keling, ustun qiymatlarini ko'rib chiqaylik:
- Har bir ustundagi satrlar soni satrlarning umumiy soniga mos keladimi?
- Har bir ustundagi ma'lumotlarning mohiyati nimada?
- Buni bashorat qilish uchun qaysi ustunni nishonlashni xohlaymiz?
Ushbu savollarga javoblar sizga ma'lumotlar to'plamini tahlil qilish va keyingi harakatlaringiz uchun taxminiy rejani tuzish imkonini beradi.
Bundan tashqari, har bir ustundagi qiymatlarni chuqurroq ko'rib chiqish uchun biz pandas describe() funktsiyasidan foydalanishimiz mumkin. Biroq, bu funksiyaning kamchiligi shundaki, u satr qiymatlari bo'lgan ustunlar haqida ma'lumot bermaydi. Biz ular bilan keyinroq shug'ullanamiz.
df.describe()
Sehrli vizualizatsiya
Keling, bizda umuman qadriyatlar yo'qligini ko'rib chiqaylik:
import seaborn as sns
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')
Bu yuqoridan qisqacha ko'rinish edi, endi biz qiziqarliroq narsalarga o'tamiz
Keling, barcha satrlarda faqat bitta qiymatga ega bo'lgan ustunlarni topishga va iloji bo'lsa, o'chirishga harakat qilaylik (ular natijaga hech qanday ta'sir qilmaydi):
df = df[[c for c
in list(df)
if len(df[c].unique()) > 1]] #ΠΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π΄Π°ΡΠ°ΡΠ΅Ρ, ΠΎΡΡΠ°Π²Π»ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ
Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
Endi biz o'zimizni va loyihamizning muvaffaqiyatini takroriy satrlardan himoya qilamiz (mavjud qatorlardan biri bilan bir xil tartibda bir xil ma'lumotlarni o'z ichiga olgan qatorlar):
df.drop_duplicates(inplace=True) #ΠΠ΅Π»Π°Π΅ΠΌ ΡΡΠΎ, Π΅ΡΠ»ΠΈ ΡΡΠΈΡΠ°Π΅ΠΌ Π½ΡΠΆΠ½ΡΠΌ.
#Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ
ΡΠ΄Π°Π»ΡΡΡ ΡΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π°ΡΠ°Π»Π° Π½Π΅ ΡΡΠΎΠΈΡ.
Biz ma'lumotlar to'plamini ikkiga ajratamiz: biri sifat qiymatlari bilan, ikkinchisi esa miqdoriy
Bu erda biz kichik bir aniqlik kiritishimiz kerak: agar sifat va miqdoriy ma'lumotlarda etishmayotgan ma'lumotlarga ega bo'lgan chiziqlar bir-biri bilan unchalik bog'liq bo'lmasa, biz nima qurbon qilishimizni hal qilishimiz kerak - etishmayotgan ma'lumotlarga ega barcha chiziqlar, ularning faqat bir qismi, yoki ma'lum ustunlar. Agar chiziqlar o'zaro bog'liq bo'lsa, biz ma'lumotlar to'plamini ikkiga bo'lish huquqiga egamiz. Aks holda, siz birinchi navbatda etishmayotgan ma'lumotlarni sifat va miqdoriy jihatdan bog'lamaydigan chiziqlar bilan shug'ullanishingiz kerak bo'ladi va shundan keyingina ma'lumotlar to'plamini ikkiga bo'ling.
df_numerical = df.select_dtypes(include = [np.number])
df_categorical = df.select_dtypes(exclude = [np.number])
Biz buni ushbu ikki xil turdagi ma'lumotlarni qayta ishlashni osonlashtirish uchun qilamiz - keyinchalik bu bizning hayotimizni qanchalik osonlashtirishini tushunamiz.
Biz miqdoriy ma'lumotlar bilan ishlaymiz
Biz qilishimiz kerak bo'lgan birinchi narsa, miqdoriy ma'lumotlarda "josus ustunlar" mavjudligini aniqlashdir. Biz bu ustunlarni shunday deb ataymiz, chunki ular o'zlarini miqdoriy ma'lumotlar sifatida taqdim etadilar, lekin sifatli ma'lumotlar sifatida ishlaydilar.
Ularni qanday aniqlashimiz mumkin? Albatta, barchasi siz tahlil qilayotgan ma'lumotlarning tabiatiga bog'liq, lekin umuman olganda, bunday ustunlar kam noyob ma'lumotlarga ega bo'lishi mumkin (3-10 noyob qiymatlar mintaqasida).
print(df_numerical.nunique())
Ayg'oqchi ustunlarni aniqlaganimizdan so'ng, biz ularni miqdoriy ma'lumotlardan sifatli ma'lumotlarga o'tkazamiz:
spy_columns = df_numerical[['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', 'ΠΊΠΎΠ»ΠΎΠΊΠ°2', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']]#Π²ΡΠ΄Π΅Π»ΡΠ΅ΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ-ΡΠΏΠΈΠΎΠ½Ρ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ dataframe
df_numerical.drop(labels=['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', 'ΠΊΠΎΠ»ΠΎΠΊΠ°2', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3'], axis=1, inplace = True)#Π²ΡΡΠ΅Π·Π°Π΅ΠΌ ΡΡΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ ΠΈΠ· ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
df_categorical.insert(1, 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', spy_columns['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1']) #Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΡΡ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡ-ΡΠΏΠΈΠΎΠ½ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
df_categorical.insert(1, 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2', spy_columns['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2']) #Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π²ΡΠΎΡΡΡ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡ-ΡΠΏΠΈΠΎΠ½ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
df_categorical.insert(1, 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3', spy_columns['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']) #Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΡΠ΅ΡΡΡ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡ-ΡΠΏΠΈΠΎΠ½ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
Nihoyat, biz miqdoriy ma'lumotlarni sifatli ma'lumotlardan butunlay ajratdik va endi biz u bilan to'g'ri ishlashimiz mumkin. Birinchi narsa, bizda bo'sh qiymatlar mavjudligini tushunish (NaN va ba'zi hollarda 0 bo'sh qiymatlar sifatida qabul qilinadi).
for i in df_numerical.columns:
print(i, df[i][df[i]==0].count())
Shu nuqtada, qaysi ustunlarda nol etishmayotgan qiymatlarni ko'rsatishi mumkinligini tushunish muhimdir: bu ma'lumotlar qanday to'planganligi bilan bog'liqmi? Yoki bu ma'lumotlar qiymatlari bilan bog'liq bo'lishi mumkinmi? Bu savollarga har bir holatda javob berish kerak.
Shunday qilib, agar biz hali ham nol bo'lgan joyda ma'lumotlar etishmayotgan deb qaror qilsak, keyinchalik yo'qolgan ma'lumotlar bilan ishlashni osonlashtirish uchun nollarni NaN bilan almashtirishimiz kerak:
df_numerical[["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 1", "ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 2"]] = df_numerical[["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 1", "ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 2"]].replace(0, nan)
Keling, qaerda ma'lumotlar etishmayotganini ko'rib chiqaylik:
sns.heatmap(df_numerical.isnull(),yticklabels=False,cbar=False,cmap='viridis') # ΠΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ df_numerical.info()
Bu erda ustunlar ichida etishmayotgan qiymatlar sariq rang bilan belgilanishi kerak. Va endi qiziqarli boshlanadi - bu qadriyatlar bilan qanday kurashish mumkin? Ushbu qiymatlar yoki ustunlar bilan qatorlarni o'chirishim kerakmi? Yoki bu bo'sh qiymatlarni boshqalari bilan to'ldiringmi?
Mana, bo'sh qiymatlar bilan nima qilish mumkinligini aniqlashga yordam beradigan taxminiy diagramma:
0. Keraksiz ustunlarni olib tashlang
df_numerical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)
1. Ushbu ustundagi bo'sh qiymatlar soni 50% dan ortiqmi?
print(df_numerical.isnull().sum() / df_numerical.shape[0] * 100)
df_numerical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)#Π£Π΄Π°Π»ΡΠ΅ΠΌ, Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅ 50 ΠΏΡΡΡΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ
2. Bo'sh qiymatlari bo'lgan satrlarni o'chirish
df_numerical.dropna(inplace=True)#Π£Π΄Π°Π»ΡΠ΅ΠΌ ΡΡΡΠΎΡΠΊΠΈ Ρ ΠΏΡΡΡΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, Π΅ΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΌ ΠΎΡΡΠ°Π½Π΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π°Π½Π½ΡΡ
Π΄Π»Ρ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ
3.1. Tasodifiy qiymat kiritish
import random #ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ random
df_numerical["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"].fillna(lambda x: random.choice(df[df[column] != np.nan]["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"]), inplace=True) #Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠ°Π½Π΄ΠΎΠΌΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΠΏΡΡΡΡΠ΅ ΠΊΠ»Π΅ΡΠΊΠΈ ΡΠ°Π±Π»ΠΈΡΡ
3.2. Doimiy qiymat kiritish
from sklearn.impute import SimpleImputer #ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ SimpleImputer, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π²ΡΡΠ°Π²ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
imputer = SimpleImputer(strategy='constant', fill_value="<ΠΠ°ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π·Π΄Π΅ΡΡ>") #Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ SimpleImputer
df_numerical[["Π½ΠΎΠ²Π°Ρ_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1",'Π½ΠΎΠ²Π°Ρ_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2','Π½ΠΎΠ²Π°Ρ_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']] = imputer.fit_transform(df_numerical[['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']]) #ΠΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΡΠΎ Π΄Π»Ρ Π½Π°ΡΠ΅ΠΉ ΡΠ°Π±Π»ΠΈΡΡ
df_numerical.drop(labels = ["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3"], axis = 1, inplace = True) #Π£Π±ΠΈΡΠ°Π΅ΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ ΡΠΎ ΡΡΠ°ΡΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ
3.3. O'rtacha yoki eng tez-tez uchraydigan qiymatni kiriting
from sklearn.impute import SimpleImputer #ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ SimpleImputer, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π²ΡΡΠ°Π²ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
imputer = SimpleImputer(strategy='mean', missing_values = np.nan) #Π²ΠΌΠ΅ΡΡΠΎ mean ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ most_frequent
df_numerical[["Π½ΠΎΠ²Π°Ρ_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1",'Π½ΠΎΠ²Π°Ρ_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2','Π½ΠΎΠ²Π°Ρ_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']] = imputer.fit_transform(df_numerical[['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']]) #ΠΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΡΠΎ Π΄Π»Ρ Π½Π°ΡΠ΅ΠΉ ΡΠ°Π±Π»ΠΈΡΡ
df_numerical.drop(labels = ["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3"], axis = 1, inplace = True) #Π£Π±ΠΈΡΠ°Π΅ΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ ΡΠΎ ΡΡΠ°ΡΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ
3.4. Boshqa model tomonidan hisoblangan qiymatni kiriting
Ba'zida qiymatlarni sklearn kutubxonasi yoki boshqa shunga o'xshash kutubxonalar modellari yordamida regressiya modellari yordamida hisoblash mumkin. Bizning jamoamiz buni yaqin kelajakda qanday qilish mumkinligi haqida alohida maqola ajratadi.
Shunday qilib, hozircha miqdoriy ma'lumotlar haqidagi hikoya to'xtatiladi, chunki turli xil vazifalar uchun ma'lumotlarni tayyorlash va oldindan qayta ishlashni qanday qilib yaxshiroq qilish haqida ko'plab boshqa nuanslar mavjud va miqdoriy ma'lumotlar uchun asosiy narsalar ushbu maqolada hisobga olingan va Endi sifat ma'lumotlariga qaytish vaqti keldi, biz miqdoriy ma'lumotlardan bir necha qadam orqaga ajratdik. Siz ushbu daftarni xohlaganingizcha o'zgartirishingiz mumkin, uni turli vazifalarga moslashtirasiz, shunda ma'lumotlarni oldindan qayta ishlash juda tez ketadi!
Sifatli ma'lumotlar
Asosan, sifatli ma'lumotlar uchun, uni satrdan (yoki ob'ektdan) raqamga formatlash uchun One-hot-kodlash usuli qo'llaniladi. Ushbu nuqtaga o'tishdan oldin, keling, bo'sh qiymatlar bilan ishlash uchun yuqoridagi diagramma va koddan foydalanamiz.
df_categorical.nunique()
sns.heatmap(df_categorical.isnull(),yticklabels=False,cbar=False,cmap='viridis')
0. Keraksiz ustunlarni olib tashlang
df_categorical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)
1. Ushbu ustundagi bo'sh qiymatlar soni 50% dan ortiqmi?
print(df_categorical.isnull().sum() / df_numerical.shape[0] * 100)
df_categorical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True) #Π£Π΄Π°Π»ΡΠ΅ΠΌ, Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°
#ΠΈΠΌΠ΅Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅ 50% ΠΏΡΡΡΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ
2. Bo'sh qiymatlari bo'lgan satrlarni o'chirish
df_categorical.dropna(inplace=True)#Π£Π΄Π°Π»ΡΠ΅ΠΌ ΡΡΡΠΎΡΠΊΠΈ Ρ ΠΏΡΡΡΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ,
#Π΅ΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΌ ΠΎΡΡΠ°Π½Π΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π°Π½Π½ΡΡ
Π΄Π»Ρ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ
3.1. Tasodifiy qiymat kiritish
import random
df_categorical["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"].fillna(lambda x: random.choice(df[df[column] != np.nan]["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"]), inplace=True)
3.2. Doimiy qiymat kiritish
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='constant', fill_value="<ΠΠ°ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π·Π΄Π΅ΡΡ>")
df_categorical[["Π½ΠΎΠ²Π°Ρ_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1",'Π½ΠΎΠ²Π°Ρ_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2','Π½ΠΎΠ²Π°Ρ_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']] = imputer.fit_transform(df_categorical[['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']])
df_categorical.drop(labels = ["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3"], axis = 1, inplace = True)
Shunday qilib, biz nihoyat sifat ma'lumotlaridagi nulllarni ko'rib chiqdik. Endi ma'lumotlar bazangizdagi qiymatlarni bir martalik kodlashni amalga oshirish vaqti keldi. Ushbu usul ko'pincha algoritmingiz yuqori sifatli ma'lumotlardan o'rganishini ta'minlash uchun ishlatiladi.
def encode_and_bind(original_dataframe, feature_to_encode):
dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
res = pd.concat([original_dataframe, dummies], axis=1)
res = res.drop([feature_to_encode], axis=1)
return(res)
features_to_encode = ["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3"]
for feature in features_to_encode:
df_categorical = encode_and_bind(df_categorical, feature))
Shunday qilib, biz nihoyat alohida sifat va miqdoriy ma'lumotlarni qayta ishlashni tugatdik - ularni qayta birlashtirish vaqti keldi
new_df = pd.concat([df_numerical,df_categorical], axis=1)
Ma'lumotlar to'plamini birlashtirgandan so'ng, biz nihoyat sklearn kutubxonasidan MinMaxScaler yordamida ma'lumotlarni o'zgartirishdan foydalanishimiz mumkin. Bu bizning qadriyatlarimizni 0 va 1 oralig'ida qiladi, bu kelajakda modelni o'rgatishda yordam beradi.
from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
new_df = min_max_scaler.fit_transform(new_df)
Bu ma'lumotlar endi hamma narsaga tayyor - neyron tarmoqlar, standart ML algoritmlari va boshqalar!
Ushbu maqolada biz vaqt seriyalari ma'lumotlari bilan ishlashni hisobga olmadik, chunki bunday ma'lumotlar uchun siz o'zingizning vazifangizga qarab biroz boshqacha ishlov berish usullaridan foydalanishingiz kerak. Kelajakda bizning jamoamiz ushbu mavzuga alohida maqola bag'ishlaydi va umid qilamizki, u sizning hayotingizga xuddi shu kabi qiziqarli, yangi va foydali narsalarni olib kirishi mumkin.
Manba: www.habr.com