تیز ڈیٹا پری پروسیسنگ کے لیے نوٹ پیڈ-چیٹ شیٹ

اکثر لوگ جو ڈیٹا سائنس کے میدان میں داخل ہوتے ہیں ان کی حقیقت پسندانہ توقعات سے کم ہوتی ہے کہ ان کا کیا انتظار ہے۔ بہت سے لوگ سوچتے ہیں کہ اب وہ ٹھنڈے نیورل نیٹ ورکس لکھیں گے، آئرن مین سے وائس اسسٹنٹ بنائیں گے، یا مالیاتی منڈیوں میں سب کو مات دیں گے۔
لیکن کام ڈیٹا سائنسدان ڈیٹا سے چلنے والا ہے، اور سب سے اہم اور وقت طلب پہلوؤں میں سے ایک یہ ہے کہ ڈیٹا کو نیورل نیٹ ورک میں فیڈ کرنے یا کسی خاص طریقے سے اس کا تجزیہ کرنے سے پہلے اس پر کارروائی کرنا ہے۔

اس مضمون میں، ہماری ٹیم بیان کرے گی کہ آپ مرحلہ وار ہدایات اور کوڈ کے ساتھ ڈیٹا کو تیزی اور آسانی سے کیسے پروسیس کر سکتے ہیں۔ ہم نے کوڈ کو کافی لچکدار بنانے کی کوشش کی اور اسے مختلف ڈیٹا سیٹس کے لیے استعمال کیا جا سکتا ہے۔

ہوسکتا ہے کہ بہت سے پیشہ ور افراد کو اس مضمون میں کوئی غیر معمولی چیز نہ ملے، لیکن ابتدائی افراد کچھ نیا سیکھ سکیں گے، اور کوئی بھی جو طویل عرصے سے تیز اور سٹرکچرڈ ڈیٹا پروسیسنگ کے لیے علیحدہ نوٹ بک بنانے کا خواب دیکھتا ہے، کوڈ کو کاپی کرکے اسے اپنے لیے فارمیٹ کرسکتا ہے، یا Github سے تیار شدہ نوٹ بک ڈاؤن لوڈ کریں۔

ہمیں ڈیٹاسیٹ موصول ہوا۔ آگے کیا کرنا ہے؟

لہذا، معیار: ہمیں یہ سمجھنے کی ضرورت ہے کہ ہم کس چیز سے نمٹ رہے ہیں، مجموعی تصویر۔ ایسا کرنے کے لیے، ہم مختلف ڈیٹا کی اقسام کی وضاحت کے لیے پانڈوں کا استعمال کرتے ہیں۔

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() #Демонстрируем информацию о колонках

تیز ڈیٹا پری پروسیسنگ کے لیے نوٹ پیڈ-چیٹ شیٹ

آئیے کالم کی قدروں کو دیکھتے ہیں:

  1. کیا ہر کالم میں لائنوں کی تعداد لائنوں کی کل تعداد کے مساوی ہے؟
  2. ہر کالم میں ڈیٹا کا جوہر کیا ہے؟
  3. اس کی پیشین گوئی کرنے کے لیے ہم کس کالم کو نشانہ بنانا چاہتے ہیں؟

ان سوالات کے جوابات آپ کو ڈیٹاسیٹ کا تجزیہ کرنے اور اپنی اگلی کارروائیوں کے لیے تقریباً ایک منصوبہ تیار کرنے کی اجازت دیں گے۔

اس کے علاوہ، ہر کالم میں قدروں پر گہری نظر کے لیے، ہم pandas describe() فنکشن استعمال کر سکتے ہیں۔ تاہم، اس فنکشن کا نقصان یہ ہے کہ یہ سٹرنگ ویلیو والے کالم کے بارے میں معلومات فراہم نہیں کرتا ہے۔ ہم بعد میں ان سے نمٹ لیں گے۔

df.describe()

تیز ڈیٹا پری پروسیسنگ کے لیے نوٹ پیڈ-چیٹ شیٹ

جادوئی تصور

آئیے دیکھتے ہیں جہاں ہماری کوئی قدر نہیں ہے:

import seaborn as sns
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')

تیز ڈیٹا پری پروسیسنگ کے لیے نوٹ پیڈ-چیٹ شیٹ

یہ اوپر سے ایک مختصر نظر تھی، اب ہم مزید دلچسپ باتوں کی طرف بڑھیں گے۔

آئیے تلاش کرنے کی کوشش کریں اور، اگر ممکن ہو تو، ان کالموں کو ہٹا دیں جن کی تمام قطاروں میں صرف ایک قدر ہے (وہ کسی بھی طرح سے نتیجہ کو متاثر نہیں کریں گے):

df = df[[c for c
        in list(df)
        if len(df[c].unique()) > 1]] #Перезаписываем датасет, оставляя только те колонки, в которых больше одного уникального значения

اب ہم اپنے آپ کو اور اپنے پروجیکٹ کی کامیابی کو ڈپلیکیٹ لائنوں سے بچاتے ہیں (لائنیں جو موجودہ لائنوں میں سے ایک کے طور پر ایک ہی ترتیب میں ایک ہی معلومات پر مشتمل ہیں):

df.drop_duplicates(inplace=True) #Делаем это, если считаем нужным.
                                 #В некоторых проектах удалять такие данные с самого начала не стоит.

ہم ڈیٹاسیٹ کو دو حصوں میں تقسیم کرتے ہیں: ایک معیار کی قدروں کے ساتھ، اور دوسرا مقداری اقدار کے ساتھ

یہاں ہمیں ایک چھوٹی سی وضاحت کرنے کی ضرورت ہے: اگر قابلیت اور مقداری ڈیٹا میں گم شدہ ڈیٹا والی لائنیں ایک دوسرے کے ساتھ بہت زیادہ مربوط نہیں ہیں، تو ہمیں یہ فیصلہ کرنے کی ضرورت ہوگی کہ ہم کیا قربانی دیتے ہیں - گمشدہ ڈیٹا والی تمام لائنیں، ان کا صرف ایک حصہ، یا کچھ کالم۔ اگر لائنیں باہم مربوط ہیں، تو ہمیں ڈیٹاسیٹ کو دو حصوں میں تقسیم کرنے کا پورا حق حاصل ہے۔ بصورت دیگر، آپ کو پہلے ان لائنوں سے نمٹنے کی ضرورت ہوگی جو گمشدہ ڈیٹا کو کوالٹیٹیو اور مقداری میں آپس میں نہیں جوڑتی ہیں، اور تب ہی ڈیٹاسیٹ کو دو حصوں میں تقسیم کریں۔

df_numerical = df.select_dtypes(include = [np.number])
df_categorical = df.select_dtypes(exclude = [np.number])

ہم یہ اس لیے کرتے ہیں تاکہ ہمارے لیے ان دو مختلف قسم کے ڈیٹا پر کارروائی کرنا آسان ہو - بعد میں ہم سمجھیں گے کہ یہ ہماری زندگی کو کتنا آسان بنا دیتا ہے۔

ہم مقداری ڈیٹا کے ساتھ کام کرتے ہیں۔

سب سے پہلے ہمیں یہ طے کرنا چاہیے کہ آیا مقداری ڈیٹا میں "جاسوسی کالم" موجود ہیں۔ ہم ان کالموں کو کہتے ہیں کیونکہ وہ اپنے آپ کو مقداری ڈیٹا کے طور پر پیش کرتے ہیں، لیکن کوالٹیٹیو ڈیٹا کے طور پر کام کرتے ہیں۔

ہم ان کی شناخت کیسے کر سکتے ہیں؟ بلاشبہ، یہ سب اس ڈیٹا کی نوعیت پر منحصر ہے جس کا آپ تجزیہ کر رہے ہیں، لیکن عام طور پر ایسے کالموں میں بہت کم منفرد ڈیٹا ہو سکتا ہے (3-10 منفرد اقدار کے علاقے میں)۔

print(df_numerical.nunique())

ایک بار جب ہم جاسوسی کالموں کی شناخت کر لیتے ہیں، تو ہم انہیں مقداری ڈیٹا سے کوالٹی ڈیٹا میں منتقل کر دیں گے:

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']) #добавляем третью колонку-шпион в качественные данные

آخر میں، ہم نے مقداری ڈیٹا کو کوالٹیٹیو ڈیٹا سے مکمل طور پر الگ کر دیا ہے اور اب ہم اس کے ساتھ صحیح طریقے سے کام کر سکتے ہیں۔ پہلی چیز یہ سمجھنا ہے کہ ہمارے پاس خالی اقدار کہاں ہیں (NaN، اور کچھ معاملات میں 0 کو خالی اقدار کے طور پر قبول کیا جائے گا)۔

for i in df_numerical.columns:
    print(i, df[i][df[i]==0].count())

اس مقام پر، یہ سمجھنا ضروری ہے کہ کن کالموں میں زیرو گمشدہ اقدار کی نشاندہی کر سکتے ہیں: کیا یہ اس وجہ سے ہے کہ ڈیٹا کیسے اکٹھا کیا گیا؟ یا اس کا تعلق ڈیٹا ویلیوز سے ہو سکتا ہے؟ ان سوالوں کا جواب ہر صورت میں دیا جانا چاہیے۔

لہذا، اگر ہم اب بھی یہ فیصلہ کرتے ہیں کہ جہاں زیرو موجود ہیں وہاں ہمارے پاس ڈیٹا غائب ہو سکتا ہے، ہمیں بعد میں اس گمشدہ ڈیٹا کے ساتھ کام کرنا آسان بنانے کے لیے زیرو کو NaN سے تبدیل کرنا چاہیے:

df_numerical[["колонка 1", "колонка 2"]] = df_numerical[["колонка 1", "колонка 2"]].replace(0, nan)

اب دیکھتے ہیں کہ ہمارے پاس ڈیٹا کہاں غائب ہے:

sns.heatmap(df_numerical.isnull(),yticklabels=False,cbar=False,cmap='viridis') # Можно также воспользоваться df_numerical.info()

تیز ڈیٹا پری پروسیسنگ کے لیے نوٹ پیڈ-چیٹ شیٹ

یہاں کالم کے اندر جو قدریں غائب ہیں ان کو پیلے رنگ میں نشان زد کیا جانا چاہیے۔ اور اب مزہ شروع ہوتا ہے - ان اقدار سے کیسے نمٹا جائے؟ کیا مجھے ان اقدار یا کالموں والی قطاریں حذف کرنی چاہئیں؟ یا ان خالی اقدار کو کسی اور سے بھریں؟

یہاں ایک تخمینی خاکہ ہے جو آپ کو یہ فیصلہ کرنے میں مدد کر سکتا ہے کہ اصولی طور پر، خالی اقدار کے ساتھ کیا کیا جا سکتا ہے:

تیز ڈیٹا پری پروسیسنگ کے لیے نوٹ پیڈ-چیٹ شیٹ

0. غیر ضروری کالم ہٹا دیں۔

df_numerical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)

1. کیا اس کالم میں خالی اقدار کی تعداد 50% سے زیادہ ہے؟

print(df_numerical.isnull().sum() / df_numerical.shape[0] * 100)

df_numerical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)#Удаляем, если какая-то колонка имеет больше 50 пустых значений

2. خالی اقدار والی لائنوں کو حذف کریں۔

df_numerical.dropna(inplace=True)#Удаляем строчки с пустыми значениями, если потом останется достаточно данных для обучения

3.1 بے ترتیب قدر ڈالنا

import random #импортируем random
df_numerical["колонка"].fillna(lambda x: random.choice(df[df[column] != np.nan]["колонка"]), inplace=True) #вставляем рандомные значения в пустые клетки таблицы

3.2 ایک مستقل قدر ڈالنا

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 اوسط یا سب سے زیادہ متواتر قدر داخل کریں۔

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 کسی دوسرے ماڈل کی طرف سے شمار کردہ قدر داخل کریں۔

بعض اوقات سکلیرن لائبریری یا اسی طرح کی دیگر لائبریریوں کے ماڈلز کا استعمال کرتے ہوئے ریگریشن ماڈلز کا استعمال کرتے ہوئے اقدار کا حساب لگایا جا سکتا ہے۔ ہماری ٹیم اس بارے میں ایک علیحدہ مضمون مختص کرے گی کہ مستقبل قریب میں یہ کیسے کیا جا سکتا ہے۔

Итак, пока повествование о количественных данных прервется, потому что есть множество других нюансов о том, как лучше делать data preparation и preprocessing для разных задач, и базовые вещи для количественных данных были учтены в этой статье, и сейчас самое время вернуться в качественным данным, которые мы отделили несколько шагов назад от количественных. Вы же можете изменять этот notebook так, как Вам угодно, подстраивая его под разные задачи, чтобы data preprocessing проходил очень быстро!

کوالٹیٹو ڈیٹا

بنیادی طور پر، کوالٹیٹیو ڈیٹا کے لیے، ون ہاٹ انکوڈنگ کا طریقہ استعمال کیا جاتا ہے تاکہ اسے سٹرنگ (یا آبجیکٹ) سے نمبر میں فارمیٹ کیا جا سکے۔ اس مقام پر جانے سے پہلے، آئیے خالی اقدار سے نمٹنے کے لیے اوپر دیے گئے خاکہ اور کوڈ کا استعمال کریں۔

df_categorical.nunique()

sns.heatmap(df_categorical.isnull(),yticklabels=False,cbar=False,cmap='viridis')

تیز ڈیٹا پری پروسیسنگ کے لیے نوٹ پیڈ-چیٹ شیٹ

0. غیر ضروری کالم ہٹا دیں۔

df_categorical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)

1. کیا اس کالم میں خالی اقدار کی تعداد 50% سے زیادہ ہے؟

print(df_categorical.isnull().sum() / df_numerical.shape[0] * 100)

df_categorical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True) #Удаляем, если какая-то колонка 
                                                                          #имеет больше 50% пустых значений

2. خالی اقدار والی لائنوں کو حذف کریں۔

df_categorical.dropna(inplace=True)#Удаляем строчки с пустыми значениями, 
                                   #если потом останется достаточно данных для обучения

3.1 بے ترتیب قدر ڈالنا

import random
df_categorical["колонка"].fillna(lambda x: random.choice(df[df[column] != np.nan]["колонка"]), inplace=True)

3.2 ایک مستقل قدر ڈالنا

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)

لہذا، ہمیں آخر کار کوالٹیٹیو ڈیٹا میں nulls پر ایک ہینڈل مل گیا ہے۔ اب وقت آگیا ہے کہ آپ کے ڈیٹا بیس میں موجود اقدار پر ون ہاٹ انکوڈنگ کریں۔ یہ طریقہ اکثر اس بات کو یقینی بنانے کے لیے استعمال کیا جاتا ہے کہ آپ کا الگورتھم اعلیٰ معیار کے ڈیٹا سے سیکھ سکتا ہے۔

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))

لہذا، ہم نے آخر کار الگ الگ کوالیٹیٹیو اور مقداری ڈیٹا پر کارروائی مکمل کر لی ہے - انہیں دوبارہ یکجا کرنے کا وقت

new_df = pd.concat([df_numerical,df_categorical], axis=1)

ڈیٹا سیٹس کو ایک ساتھ جوڑنے کے بعد، ہم آخر کار اسکیلرن لائبریری سے MinMaxScaler کا استعمال کرتے ہوئے ڈیٹا ٹرانسفارمیشن کا استعمال کر سکتے ہیں۔ اس سے ہماری اقدار 0 اور 1 کے درمیان ہو جائیں گی، جو مستقبل میں ماڈل کو تربیت دینے میں مدد کرے گی۔

from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
new_df = min_max_scaler.fit_transform(new_df)

یہ ڈیٹا اب کسی بھی چیز کے لیے تیار ہے - نیورل نیٹ ورکس، معیاری ایم ایل الگورتھم، وغیرہ!

اس آرٹیکل میں، ہم نے ٹائم سیریز کے ڈیٹا کے ساتھ کام کرنے پر غور نہیں کیا، کیونکہ اس طرح کے ڈیٹا کے لیے آپ کو اپنے کام کے لحاظ سے، پروسیسنگ کی تھوڑی مختلف تکنیک استعمال کرنی چاہیے۔ مستقبل میں، ہماری ٹیم اس موضوع پر ایک علیحدہ مضمون مختص کرے گی، اور ہم امید کرتے ہیں کہ یہ آپ کی زندگی میں اس مضمون کی طرح کچھ دلچسپ، نیا اور مفید لانے کے قابل ہو گا۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں