Pandas ilə SQLvari sorğuların yazılması

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.

Başlayaq!

İşə 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.

  • staff - İşçinin "unikal identifikatoru", "adı", "soyadı", "cinsi", "küçə", "şirkət", "vəzifəsi"
  • staff_add_info - "unikal identifikatoru", "email ünvanı", "aktivlik statusu", "istifadəçi adı", "MD5-də saxlanan şifrəsi", "mobil_nömrəsi"

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]:
guid first_name last_name gender street company job_title
0 6a9472d4-4949-4f98-8543-c6878d558422 Rhoda Halbert Female NaN Zooveo Registered Nurse
1 3e89c11d-fd66-427f-a294-029fde1a4e40 Nial Doggett Male Londonderry Demizz Account Executive
2 8c37f0ca-75c5-42f9-8f45-92f1fc2cb027 Valentina Stenners Female Tony Wikizz Safety Technician I

In [4]:
staff_add_info.head(3)


Out[4]:
guid email a_status username password phone_number
0 6a9472d4-4949-4f98-8543-c6878d558422 rhalbert0@mashable.com False rhalbert0 99a0837db38c3fb198371fc78336f1ec +62 (345) 865-9966
1 3e89c11d-fd66-427f-a294-029fde1a4e40 ndoggett1@odnoklassniki.ru True ndoggett1 e6cb5bfd91b8fe6f750837b5c669cb2a +7 (947) 890-1005
2 8c37f0ca-75c5-42f9-8f45-92f1fc2cb027 vstenners2@umn.edu True vstenners2 2c6ac4200d1e8efae067e35eb61ba349 +62 (373) 436-5895

Pandas modulu ilə işin nümaişi 2 hissədən ibarət olacaq:

  1. Real SQL əmr sorğusunun yazılması və icrası
  2. Yazılmış sorğunun analoqunun datafreymlər üzərində Pandas vasitəsi ilə hazırlanması

SELECT

SQL-də SELECT əmri məlumatın sorğulanması və əldə edilməsi üçün istifadə olunur.

Deyək ki biz staff_db cədvəlindən bütün sütun və sətrləri əldə etmək istəyirik. Bunun üçün yazılmış SQL sorğusu aşağıdaki kimidir:

SELECT * FROM staff_db

Pandas vasitəsi ilə bu komandanı sadəcə datafreymin adın yazmaq ilə icra edə bilərsiniz.


In [5]:
staff_df


Out[5]:
guid first_name last_name gender street company job_title
0 6a9472d4-4949-4f98-8543-c6878d558422 Rhoda Halbert Female NaN Zooveo Registered Nurse
1 3e89c11d-fd66-427f-a294-029fde1a4e40 Nial Doggett Male Londonderry Demizz Account Executive
2 8c37f0ca-75c5-42f9-8f45-92f1fc2cb027 Valentina Stenners Female Tony Wikizz Safety Technician I
3 0215a527-9df4-43fa-97ca-bc580ac56a70 Gamaliel Coggell Male Oak Devbug Senior Financial Analyst
4 056e35a8-46bf-4886-98ac-3a06b625d036 Pru Wretham NaN NaN Blogtag Research Assistant III
5 2764b956-a17b-4505-a70c-55e8112b2420 Franky Philipps Female Hallows Skyba Actuary
6 581aae0b-e53c-49a1-9d2b-d4b316a2a7bb Cammy Veltmann NaN Moulton Demizz Information Systems Manager
7 37a2bbe8-0e00-41e0-8661-579771028957 Tedd Delahunty Male 2nd Kare Associate Professor
8 8de537ba-c94e-40c2-bd00-fc51a80abdc7 Remy Greschke Female Derek BlogXS Senior Editor
9 806ebef0-6d82-4efb-9d8b-de8d86dbd29e Seward Lambeth Male Kensington Livetube Programmer III
10 ca744ca9-5746-49e6-9f33-8884cc651c73 Abagael Lyvon Female Elmside Realpoint Environmental Specialist
11 92566a03-0d23-4187-b4ae-fb2a5742c3ca Almeria Shird Female Nancy Topicstorm Quality Engineer
12 2f84bdae-bc5e-4028-9a13-40c38f79b8d3 Tamiko Le Guin Female Northview Yoveo Design Engineer
13 514d2017-01f1-43b8-8bcd-a221921abe0c Bradford Vero Male NaN Jabbersphere Physical Therapy Assistant
14 9edbc74a-5488-421d-a473-1fe3829f9cbe Collie Powe Female Corscot Brainbox Software Test Engineer II
15 10101cb4-ae13-4d43-b129-1f848f01c0f9 Darcy Kirgan Male Ryan Twitterbeat Accounting Assistant III
16 21f16dce-a318-4a0b-8508-d501c30cc70f Merwyn Ruperti Male Lunder Centizu Nurse Practicioner
17 b877cff4-e37c-4342-81e1-ca8c900c859e Conrado Lembcke Male Judy Fiveclub Help Desk Technician
18 670ed6c8-b8d4-42d0-998b-e97bc4f3cbe5 Martha Khilkov Female 3rd Jayo Engineer IV
19 0307ea21-d1a7-48dd-b14a-bb7f3bbb2f24 Auroora Reiner Female Lakeland Abata Actuary
20 4b8370a9-1e88-4d76-bfc4-4340a1df0bea Rainer Pozzo Male Mesta Skipfire Quality Engineer
21 c50d49cd-d65f-425d-8440-d9c1cd389fe0 Riley Oulett Male Parkside Browsecat Senior Financial Analyst
22 ff57bcb2-0482-4718-943a-d7f736b0972f Nowell Cattrell Male 7th Realmix Recruiter
23 cb521a69-9e69-4e34-a6bf-592438e20d81 Carlyle Patek Male Morning Zooveo Systems Administrator III
24 b573ed60-6627-4742-835d-dc90f69091d5 Dorena Gaskell Female Fordem Yambee Social Worker
25 b1bf35cb-5c7e-4271-837d-36c9b8340ee1 Griselda Lovstrom Female NaN Oyoloo Geological Engineer
26 79e68232-7a6c-46a0-bf61-3ef5fea5c260 Warner MacCambridge Male Express Dynabox Quality Engineer
27 263a894d-5f65-4de5-9b54-4c932fd333bd Sergei Le Grove Male Shopko Yotz Marketing Manager
28 ec1c3b25-61c2-4ff4-aadb-57cd5bba8f8f Marlin Snowding Male Ridge Oak Kwilith Nurse
29 d305f36a-abbb-489d-be62-791722ab3e62 Veda Eye Female Arizona Brightbean Tax Accountant
... ... ... ... ... ... ... ...
970 931676e5-1825-414b-b83f-20000225b8fe Emilee Gookey Female Buhler Livefish Sales Associate
971 5e13ca2f-7ac9-4a0d-921a-8c4c1d2e0ea5 Zerk Burree Male Macpherson Realfire Chemical Engineer
972 39c2587e-2b78-4889-a55e-26978217e2b7 Eartha Matthiesen Female NaN Demimbu Systems Administrator III
973 94785dd3-acb5-4c73-be9c-998e808d8d38 Serge Byham Male NaN Edgeblab Programmer I
974 0b5f1e70-916b-4e7f-b8b2-e07b31245e3b Zulema Cocklin Female NaN Yotz Media Manager II
975 3acdac9b-6ac5-4c94-a468-baf1f0ef9876 Candi Corselles Female Coolidge Gabcube Director of Sales
976 3e103939-9100-4f26-b268-7bf4f909b11a Mace Normanell Male Bashford Snaptags Biostatistician II
977 cb285487-49ce-4b85-ae84-979c0bb1d84e Duane Giacovetti Male Declaration Thoughtworks VP Marketing
978 edcf548d-8729-4649-bed3-55a965185a90 Dayle Walpole Female Dryden Yozio Financial Advisor
979 0f127a24-78e1-4d94-ba7c-cd255c75d512 Terrill Klewer Male NaN Photolist NaN
980 5181e049-594b-4e86-9d67-954cd29963e7 Ayn Marchington Female Kensington Mymm Marketing Assistant
981 a32cd3f6-ed97-4e72-8b9a-1148a61f1f8a Bobbe Skirling Female Melody Skippad Account Executive
982 60804ebd-b063-4cab-8f1b-4726a4c93aaa Nickolas Willatts Male Hayes Meejo Software Test Engineer III
983 63bb1d90-a81f-4642-ae56-a53edcc113e1 Tina Andrys Female Little Fleur Dabtype Health Coach III
984 e6df3096-77d2-4609-96af-559b46b558f0 Scarlett Remon Female Cardinal Fanoodle Nuclear Power Engineer
985 a36e559f-3f8b-4b21-998a-c42580c7c809 Clarissa Halversen Female Crownhardt Mymm Sales Representative
986 d0ff22c6-a9ea-472b-9f7c-cb543478388e Luca Tattersall Male Hovde Voonix Director of Sales
987 8619cc8b-5297-46f8-9801-963c1ee74a99 Alma MacCrachen Female Little Fleur Jayo Administrative Officer
988 faa9bed5-d042-4d12-a88e-e387618d4746 Cirstoforo Ferrierio Male Carey Brainbox Business Systems Development Analyst
989 e215824e-4fd2-4436-9eaa-eb6da9943393 Hedi Buesden Female Hazelcrest Yakijo Sales Associate
990 f25d69cd-5cba-4483-9c8b-097fc9ba32cc Kellie Jowling Female Sachtjen Trudeo Compensation Analyst
991 5a2b37e0-3091-4c6f-ac28-fe8ab46d78f7 Thorny Lightbourne Male Thierer Oodoo Operator
992 020cf729-3891-4c82-a78d-9956ae09d44c Taite Di Meo Male Emmet Cogilith Administrative Assistant III
993 a851d9f0-f62a-411b-a206-89fffb2ba9a4 Lexie Sansam Female NaN Podcat Web Designer IV
994 351753c6-b08a-4336-9b16-ea3264d2d8ef Evey Elphick Female Golden Leaf Abata Paralegal
995 f8620851-1114-4003-b7f6-74380b1963c9 Connor Bartleman Male NaN Browsezoom Quality Engineer
996 ab20f0b1-228b-44ab-9552-996354614d25 Nissy Cossins Female Portage Roodel Account Representative IV
997 31d88f81-976c-4dc2-a656-f21de7129ef7 Chandler Watchorn Male Huxley Skimia Cost Accountant
998 30a8515e-92ff-4e6f-9d59-8e941bb1cf46 Lemuel Cardoe Male Corben Topicware VP Sales
999 c616bbaf-32b8-4942-ab23-e16e002cf08b Jo Brewis Female Old Shore Npath Physical Therapy Assistant

1000 rows × 7 columns

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:

SELECT TOP(3) first_name, last_name, gender, job_title FROM staff_db

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]:
first_name last_name gender job_title
0 Rhoda Halbert Female Registered Nurse
1 Nial Doggett Male Account Executive
2 Valentina Stenners Female Safety Technician I

İlkin sorğu etməyə öyrəndik, növbə gəldi filterlərin əlavə olunmasına.

SQL versiya:

SELECT TOP(3) first_name, last_name, gender, job_title FROM staff_db WHERE gender = 'Male'

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]:
0    False
1     True
2    False
3     True
4    False
Name: gender, dtype: bool

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]:
first_name last_name gender job_title
1 Nial Doggett Male Account Executive
3 Gamaliel Coggell Male Senior Financial Analyst
7 Tedd Delahunty Male Associate Professor

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əzifəsi 'Account Executive' olan VƏ YA adı 'Valentina' olan işçilər siyahısı çıxsın.

SQL versiya:

SELECT TOP(3) first_name, last_name, gender, job_title FROM staff_db WHERE (gender = 'Male' AND job_title = 'Account Executive') OR (first_name = 'Valentina')

Pandas-da 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]:
first_name last_name gender job_title
1 Nial Doggett Male Account Executive
2 Valentina Stenners Female Safety Technician I
115 Brok Anderer Male Account Executive

UPDATE

SQL-də UPDATE əmri məlumatın dəyişdirilməsi və yenilənməsi üçün istifadə olunur.

SQL versiyası:

UPDATE staff_df SET gender = 'Male' WHERE (gender = 'Male' AND job_title = 'Account Executive') OR (first_name = 'Valentina')

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]:
guid first_name last_name gender street company job_title
0 6a9472d4-4949-4f98-8543-c6878d558422 Rhoda Halbert Female NaN Zooveo Registered Nurse
1 3e89c11d-fd66-427f-a294-029fde1a4e40 Nial Doggett Male Londonderry Demizz Account Executive
2 8c37f0ca-75c5-42f9-8f45-92f1fc2cb027 Valentina Stenners Male Tony Wikizz Safety Technician I

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]:
first_name last_name gender job_title
1 Nial Doggett Male Account Executive
2 Valentina Stenners Male Safety Technician I
115 Brok Anderer Male Account Executive

2-ci indeksdə 'Valentina' adlı istifadəçi sorğulanan parameterlərə uyğun gəldi və "Female"-dən "Male"-yə dəyişdi.

INSERT

SQL-də INSERT əmri məlumatın əlavə olunması üçün istifadə olunur.

Nümaiş üçün staff_df-də yeni işçi əlavə edək:

SQL variantı:

INSERT INTO staff_df ('guid', 'first_name', 'last_name', 'gender', 'street', 'company', 'job_title') VALUES ('6a9472d4-4949-4f98-8543-c6878d558422', 'Omar', 'Bayramov', 'Male', NULL, 'Limpapud', NULL)

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]:
1000

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]:
guid first_name last_name gender street company job_title
998 30a8515e-92ff-4e6f-9d59-8e941bb1cf46 Lemuel Cardoe Male Corben Topicware VP Sales
999 c616bbaf-32b8-4942-ab23-e16e002cf08b Jo Brewis Female Old Shore Npath Physical Therapy Assistant
1000 6a9472d4-4949-4f98-8543-c6878d558422 Omar Bayramov Male NaN Limpapud NaN

DELETE

SQL-də DELETE əmri məlumatın silinməsi üçün istifadə olunur.

Hər-hansı bir məlumatı datafreymdən silmək istədikdə SQL-a əks məntiqdən istifadə etməliyik. Nümaiş üçün az əvvəl əlavə etdiyimiz "Ömər" və ayrı "Ömər" işçilərin silək.

SQL variantı:

DELETE FROM staff_db WHERE first_name = 'Omar'

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]:
guid first_name last_name gender street company job_title
997 31d88f81-976c-4dc2-a656-f21de7129ef7 Chandler Watchorn Male Huxley Skimia Cost Accountant
998 30a8515e-92ff-4e6f-9d59-8e941bb1cf46 Lemuel Cardoe Male Corben Topicware VP Sales
999 c616bbaf-32b8-4942-ab23-e16e002cf08b Jo Brewis Female Old Shore Npath Physical Therapy Assistant

Hazırdır! Məlumat pozuldu.

Jurnalın sonu

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.

Əlaqə

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