SQL ilə heç olmasa qismən tanışlığı olan adam "SQL-in əsasların bir neçə saat ərzində öyrənib ilk sorğuları yazmaq olar" cümləsi ilə razılaşar (hər halda mən bu cür fikirləşirəm). Python ilə də eynən, bu dil ən sadə və proqramlaşdırmanı öyrənməyə başlayanlar üçün ideal dil sayılır. İndi, verilənlər elmi və məlumat analizi ən trend mövzu olan vaxtda Python-un Pandas modulu vasitəsi ilə SQL kimi məlumat emal etmə məqaləsi elə lap yerinə düşərdi, və budur o!
Jurnalda SQL-da DML (Məlumat Manipulyasiyası Dili) vasitəsi ilə icra olunan məlumatın sorğulanması (SELECT), məlumatın daxil olunması (INSERT), məlumat pozulması (DELETE) və məlumat yeniləməsi (UPDATE) komandalarının Pandas analoqları təqdim olunacaq. Hər iki variantda sorğular icra olunacaq və göstəriləcək.
İşə Pandasın importundan başlayırıq:
In [1]:
import pandas as pd
Jurnalın daxilində 2 cədvəldən istifadə olunacaq və onlar mənim GitHub repositoriyamda yerləşən dummy_data.xlsx Excel faylının ayrı-ayrı səhifələrinə yerləşir.
Cədvəllərin ortaq identifikatoru - "guid" sütunudur, tutuşdurma baş verdikdə bu sütundan istifadə edəcəyik
İşləyəcəyimiz cədvəllər haqqında ümumi məlumat aldıq, datafreymlərə keçirmək olar: Hər sütuna uyğun eyni adlı datafreymlər yaratmaqdan başlayırıq. Bunun üçün pd.read_excel funksiyası vasitəsi ilə excel faylın müxtəlif səhifələrin "oxuyub" yaradırıq.
In [2]:
# ilk öncə açacağımız fayla link, sonra isə səhifənin adın qeyd edirik
staff_df = pd.read_excel('https://raw.githubusercontent.com/limpapud/datasets/master/Tutorial_datasets/SQL_Pandas.xlsx',sheet_name='staff')
staff_add_info = pd.read_excel("https://raw.githubusercontent.com/limpapud/datasets/master/Tutorial_datasets/SQL_Pandas.xlsx",sheet_name='staff_add_info')
In [3]:
staff_df.head(3) # head(3) Məlumatın ilk 3 sətrin əks etdirir
Out[3]:
In [4]:
staff_add_info.head(3)
Out[4]:
Pandas modulu ilə işin nümaişi 2 hissədən ibarət olacaq:
Pandas vasitəsi ilə bu komandanı sadəcə datafreymin adın yazmaq ilə icra edə bilərsiniz.
In [5]:
staff_df
Out[5]:
Ups! Nədənsə (əslində əlbəttə ki Pandasın standart ayarlarına uyğun, perfomans və praktiklik baxımından) məlumat öyrəşdiyimiz SQL sorğulama zamanı kimi tam olaraq yox, hissə-hissə olaraq çıxdı, yəni yalnız ilk 30 və son 30 sətr əks olundu.
Bu məqamı nəzərə alaraq ayarlarda maksimal sətr və sütun sayın dəyişək və limitsiz edək. (Diqqət! Real həyatda böyük həcmli verilənlər ilə iş zamanı bunu etməyin!!!)
Maksimal sütun və sətr sayın None qeyd edib limitləri aradan qaldırırıq.
In [6]:
pd.set_option('display.max_columns',7) # sütün sayı üzərindən limit qaldıran əmr
pd.set_option('display.max_rows',60) # sətr sayı üzərindən limit qaldıran əmr
Yenidən yoxlayaq ...
In [ ]:
staff_df
Əla. Davam etmək olar.
Növbəti məqsədimiz yalnız tələb olunan sütunları sorğulayıb 3 sətri əks etdirməkdir
SQL versiya:
Pandas versiyasında sorğunun məntiqi datafreym adından sonra tələb olunan sütun adların siyahı vasitəsi ilə təmin edərək .head() funksiyası köməkliyi ilə ilk 3 yazını əks etdirməkdir.
In [7]:
staff_df[['first_name','last_name','gender','job_title']].head(3)
Out[7]:
İlkin sorğu etməyə öyrəndik, növbə gəldi filterlərin əlavə olunmasına.
SQL versiya:
Pandas-da datafreym daxili filter əlavə etmək üçün binar "maska"-dan istifadə etməliyik. Amma nədir binar maska? O filterlənən sütun üzrə keçərək sütundakı hər bir sətr üzrə dəyərin tələb olunan dəyərə bərabər olub olmadığını yoxlayıb müvafiq olaraq True/False (Doğru\Yalnız) dəyəri verir. Sonra isə bu maska üzrə sütun üzrə əks olunan dəyərləri filterləmək mümkün olur.
Məsəl üçün Kişi cinsi üzrə maska yaradaq və əks etdirək:
In [8]:
binar_maska = staff_df['gender']=='Male'
binar_maska.head(5)
Out[8]:
Gördüyümüz kimi binar_maska 1 ölçülü datafreym yarandı və realda "Male" dəyəri olan sətrdə "True", digər dəyərlər olan sətrlərdə isə "False" dəyərin saxlayır. İndi isə bu maskanı tətbiq edək və cavabları yoxlayaq:
In [9]:
staff_df[['first_name','last_name','gender','job_title']][staff_df['gender']=='Male'].head(3)
Out[9]:
Növbəti addım - istifadə olunan filterləri artıraq və zənqinləşdirməkdir. Elə sorğu yazaq ki yalnız cinsi 'Kişi' VƏ vəzifəsi 'Account Executive' olan VƏ YA adı 'Valentina' olan işçilər siyahısı çıxsın.
SQL versiya:
Pandas-da VƏ məntiqi ampersand ("&") vasitəsi ilə, VƏ YA məntiqi isə vertikal xətt ("|") vasitəsi ilə tənzimlənir.
In [10]:
staff_df[['first_name','last_name','gender','job_title']][((staff_df['gender']=='Male') & (staff_df['job_title']=='Account Executive')) | (staff_df['first_name']=='Valentina')].head(3)
Out[10]:
Pandas ilə sətrləri yeniləmək üçün index ilə işləmək üçün .loc və yenə binar maskalardan istifadə edəcəyik.
Məntiq aşağıdaki kimidir: DataFreym_adı.loc[binar maska, dəyişməli sütun] = 'hədəf dəyər'
In [11]:
staff_df.loc[((staff_df['gender']=='Male') & (staff_df['job_title']=='Account Executive')) | (staff_df['first_name']=='Valentina'),'gender']='Male'
In [12]:
staff_df.head(3)
Out[12]:
Dəyişiklikləri yoxlayaq. Bunun üçün filtr üzrə yazılmış yazılarda 'gender' sütunun yoxlayaq.
In [13]:
staff_df[['first_name','last_name','gender','job_title']][((staff_df['gender']=='Male') & (staff_df['job_title']=='Account Executive')) | (staff_df['first_name']=='Valentina')].head(3)
Out[13]:
2-ci indeksdə 'Valentina' adlı istifadəçi sorğulanan parameterlərə uyğun gəldi və "Female"-dən "Male"-yə dəyişdi.
Pandas vasitəsi ilə isə eyni nəticə almaq üçün artıq tanış olan .loc indeks köməkçisindən istifadə edərək sətr əlavə edirik.
Pandas variantı: DatafreymAdı.loc[ indeks ] = ['vergül', 'ilə', 'ayrılmış', 'dəyərlər']
İndeksi əldə etmək üçün datafreymin uzunluğun ölçüb uzunluğunu dəyər kimi ".loc"-a ötürək.
In [14]:
len(staff_df)
Out[14]:
In [15]:
staff_df.loc[len(staff_df)] = ['6a9472d4-4949-4f98-8543-c6878d558422','Omar','Bayramov','Male','NaN','Limpapud','NaN']
In [16]:
staff_df.tail(3) # son yazıları yoxlayaq
Out[16]:
Yəni əgər SQL sorğu "staff_db-dən 'Ömər' adlı işçiləri poz" əmrin verirsə Pandas sorğusu "staff_db-də "Ömər" adlı işçilərdən başqa hamısın saxla məntiqi istifadə edir.
In [17]:
staff_df = staff_df.loc[staff_df['first_name'] != 'Omar']
staff_df.tail(3)
Out[17]:
Hazırdır! Məlumat pozuldu.
Jurnalın sonuna çatdınız. Oxuduğunuz üçün təşəkkürlər. Bu məqalə periodik olaraq yenilənəcək və əlavələr qəbul edəcək. Sizin əlavəniz, təklifiniz, iradınız olduğu halda GitHub vasitəsi ilə "İssue" yaradaraq və ya aşağıda qeyd olunmuş əlaqə vasitələri ilə fikrinizi bildirə bilərsiniz.
Müəllif ilə əlaqə omarbayramov@hotmail.com elektron ünvan üzərindən aparıla bilər. Əlavə olaraq sosial şəbəkə və digər saytlara linklər əlavə olunur. Facebook Wordpress Blog LinkedIn