Data Scientist's Notes: Берилиштерди суроо тилдерин жекелештирилген карап чыгуу

Data Scientist's Notes: Берилиштерди суроо тилдерин жекелештирилген карап чыгуу
Кайсы жерде жана качан пайдалуу болгонун жеке тажрыйбамдан айтып жатам. Бул сереп жана тезис, андан ары эмнени жана кайда казууга болорун түшүнүү үчүн - бирок бул жерде менде бир гана субъективдүү жеке тажрыйба бар, балким, сиз үчүн баары таптакыр башкача.

Эмне үчүн суроо тилдерин билүү жана колдоно билүү маанилүү? Негизинен, Data Science ишинин бир нече маанилүү этаптарын камтыйт жана эң биринчи жана эң маанилүүсү (ансыз эч нерсе иштебейт!) бул маалыматтарды алуу же алуу. Көбүнчө, маалыматтар кандайдыр бир формада бир жерде отурат жана ал жерден "чыгарылышы" керек. 

Сурам тилдери ушул маалыматтарды алууга мүмкүнчүлүк берет! Ал эми бүгүн мен сизге мен үчүн пайдалуу болгон суроо тилдери жөнүндө айтып берем жана мен сизге айтып берем жана кайда жана кантип так - эмне үчүн изилдөө керек экенин көрсөтөм.

Маалымат сурамдарынын түрлөрүнүн үч негизги блогу болот, аларды биз бул макалада талкуулайбыз:

  • "Стандарттык" суроо тилдери - бул реляциялык алгебра же SQL сыяктуу суроо тили жөнүндө сөз кылганда көбүнчө түшүнүктүү нерсе.
  • Скрипттик суроо тилдери: мисалы, Python нерселери пандалар, numpy же кабык сценарийлери.
  • Билим графиктери жана графиктер базасы үчүн тилдерди сураңыз.

Бул жерде жазылгандардын баары жөн гана жеке тажрыйба, пайдалуу болгон, жагдайлардын сыпаттамасы жана "эмне үчүн керек болгон" - ар бир адам ушул тилдерди түшүнүү менен сизге окшош жагдайлар кандайча пайда болоорун жана аларга алдын ала даярданууга аракет кыла алат бир долбоорго (шашылыш) кайрылууга же ал тургай, алар керек болгон долбоорго баруудан мурун.

"Стандарттык" суроо тилдери

Стандарттык суроо тилдери биз сурамдар жөнүндө сөз кылганда алар жөнүндө ойлонобуз деген мааниде.

Реляциялык алгебра

Реляциялык алгебра эмне үчүн керек? Суроо тилдери эмне үчүн белгилүү бир жол менен түзүлүп, аларды аң-сезимдүү колдонуу үчүн жакшы түшүнүү үчүн, алардын негизги өзөгүн түшүнүү керек.

Реляциялык алгебра деген эмне?

Формалдуу аныктамасы төмөнкүчө: реляциялык алгебра – реляциялык маалыматтар моделиндеги мамилелер боюнча операциялардын жабык системасы. Бир аз адамча айтканда, бул таблицалардагы операциялар системасы, натыйжада дайыма таблица болот.

Бардык реляциялык операцияларды караңыз бул Habr макаласы - бул жерде биз эмне үчүн билишиңиз керек экенин жана ал кайда жардам берерин сүрөттөп беребиз.

Эмне үчүн?

Суроо тилдери кандай экенин жана конкреттүү суроо тилдериндеги туюнтмалардын артында кандай операциялар турганын түшүнө баштоо көбүнчө суроо тилдеринде эмне жана кантип иштээрин тереңирээк түшүнүүгө жардам берет.

Data Scientist's Notes: Берилиштерди суроо тилдерин жекелештирилген карап чыгуу
тартып алынган бул макалалар. Операциянын мисалы: таблицаларды бириктирүүчү кошулуу.

Окуу үчүн материалдар:

Стэнфорддон жакшы киришүү курсу. Жалпысынан реляциялык алгебра жана теория боюнча көптөгөн материалдар бар - Coursera, Udacity. Интернетте көптөгөн материалдар бар, анын ичинде жакшы академиялык курстар. Менин жеке кеңешим: сиз реляциялык алгебраны жакшы түшүнүшүңүз керек - бул негиздердин негизи.

SQL

Data Scientist's Notes: Берилиштерди суроо тилдерин жекелештирилген карап чыгуу
тартып алынган бул макала.

SQL – бул реляциялык алгебраны ишке ашыруу - маанилүү эскертүү менен, SQL декларативдик! Башкача айтканда, реляциялык алгебранын тилинде суроо жазганда, сиз чындыгында кантип эсептөө керек деп айтасыз - бирок SQL менен сиз эмнени чыгаргыңыз келгенин белгилейсиз, андан кийин DBMS реляциялык алгебранын тилинде (эффективдүү) туюнтмаларды жаратат (алардын эквиваленттүүлүгү бизге белгилүү Коддун теоремасы).

Data Scientist's Notes: Берилиштерди суроо тилдерин жекелештирилген карап чыгуу
тартып алынган бул макала.

Эмне үчүн?

Реляциялык DBMS: Oracle, Postgres, SQL Server, ж. мүмкүн эмес).

Эмнени окуу жана изилдөө

Жогорудагы ошол эле шилтемелерге ылайык (реляциялык алгебра жөнүндө) укмуштуудай көлөмдөгү материал бар, мисалы, бул.

Айтмакчы, NoSQL деген эмне?

"NoSQL" термини таптакыр стихиялуу келип чыгышы жана анын артында жалпы кабыл алынган аныктама же илимий институт жок экенин дагы бир жолу баса белгилеп кетүү керек." Тиешелүү макала Хабр боюнча.

Чындыгында, адамдар көптөгөн маселелерди чечүү үчүн толук реляциялык моделдин кереги жок экенин түшүнүштү, айрыкча, мисалы, аткаруу критикалык жана топтоо менен кээ бир жөнөкөй сурамдар үстөмдүк кылгандар үчүн - бул жерде метрикаларды тез эсептөө жана аларды жазууга жазуу маанилүү. маалыматтар базасы, жана көпчүлүк функциялар реляциялык гана керексиз эмес, ошондой эле зыяндуу болуп чыкты - эгерде ал биз үчүн эң маанилүү нерсени (кандайдыр бир конкреттүү тапшырма үчүн) - өндүрүмдүүлүктү буза турган болсо, эмне үчүн бир нерсени нормалдаштыруу керек?

Ошондой эле, ийкемдүү схемалар классикалык реляциялык моделдин стационардык математикалык схемаларынын ордуна көп талап кылынат - бул системаны жайгаштыруу жана тез иштей баштоо, натыйжаларды иштетүү - же схема жана сакталган маалыматтардын түрлөрүн иштеп чыгууну укмуштуудай жөнөкөйлөтөт. анчалык маанилүү эмес.

Мисалы, биз эксперттик системаны түзүп жатабыз жана кээ бир мета маалымат менен бирге белгилүү бир доменде маалыматты сактагыбыз келет - биз бардык талааларды билбейбиз жана ар бир жазуу үчүн жөн гана JSON сактайбыз - бул бизге маалыматтарды кеңейтүү үчүн абдан ийкемдүү чөйрөнү берет. модель жана тез итерациялануучу - ошондуктан бул учурда, NoSQL дагы жакшыраак жана окула турган болот. Мисал киргизүү (NoSQL керектүү жерде болгон менин долбоорлорумдун биринен).

{"en_wikipedia_url":"https://en.wikipedia.org/wiki/Johnny_Cash",
"ru_wikipedia_url":"https://ru.wikipedia.org/wiki/?curid=301643",
"ru_wiki_pagecount":149616,
"entity":[42775,"Джонни Кэш","ru"],
"en_wiki_pagecount":2338861}

Көбүрөөк маалымат окуу бул жерде NoSQL жөнүндө.

Эмнени окуу керек?

Бул жерде, тескерисинче, сиз өз милдетиңизди кылдат талдап чыгышыңыз керек, анын кандай касиеттери бар жана ушул сүрөттөөгө дал келе турган кандай NoSQL системалары бар - анан бул системаны изилдеп баштаңыз.

Scripting Query Languages

Башында, Python менен жалпысынан кандай байланышы бар окшойт - бул программалоо тили жана такыр сурамдар жөнүндө эмес.

Data Scientist's Notes: Берилиштерди суроо тилдерин жекелештирилген карап чыгуу

  • Pandas түзмө-түз Швейцариянын армиясынын маалымат илиминин бычагы; анда чоң көлөмдөгү маалыматтарды трансформациялоо, топтоо ж.б.у.с. болот.
  • Numpy - вектордук эсептөөлөр, матрицалар жана сызыктуу алгебра.
  • Scipy - бул пакетте математика көп, өзгөчө статистика бар.
  • Jupyter лабораториясы - көптөгөн чалгындоо маалыматтарын талдоо ноутбуктарга туура келет - билүү үчүн пайдалуу.
  • Суроолор - тармак менен иштөө.
  • Pyspark маалымат инженерлери арасында абдан популярдуу, балким, сиз бул же Spark менен иштешүүгө туура келет, алардын популярдуулугунан улам.
  • *Selenium - сайттардан жана ресурстардан маалыматтарды чогултуу үчүн абдан пайдалуу, кээде маалыматтарды алуунун башка жолу жок.

Менин негизги кеңешим: Python үйрөн!

рттъ

Мисал катары төмөнкү кодду алалы:

import pandas as pd
df = pd.read_csv(“data/dataset.csv”)
# Calculate and rename aggregations
all_together = (df[df[‘trip_type’] == “return”]
    .groupby(['start_station_name','end_station_name'])
                  	    .agg({'trip_duration_seconds': [np.size, np.mean, np.min, np.max]})
                           .rename(columns={'size': 'num_trips', 
           'mean': 'avg_duration_seconds',    
           'amin': min_duration_seconds', 
           ‘amax': 'max_duration_seconds'}))

Негизи, биз код классикалык SQL үлгүсүнө туура келгенин көрөбүз.

SELECT start_station_name, end_station_name, count(trip_duration_seconds) as size, …..
FROM dataset
WHERE trip_type = ‘return’
GROUPBY start_station_name, end_station_name

Бирок маанилүү бөлүгү бул код скрипттин жана конвейердин бир бөлүгү болуп саналат; чындыгында, биз Python конвейерине сурамдарды киргизип жатабыз. Мындай кырдаалда, суроо тили бизге Pandas же pySpark сыяктуу китепканалардан келет.

Жалпысынан алганда, pySparkте биз сурам тили аркылуу маалыматтарды трансформациялоонун окшош түрүн көрөбүз:

df.filter(df.trip_type = “return”)
  .groupby(“day”)
  .agg({duration: 'mean'})
  .sort()

Кайда жана эмнени окуу керек

Жалпысынан Python өзүндө маселе эмес изилдөө үчүн материалдарды табуу. Интернетте көптөгөн окуу куралдары бар рттъ, pySpark жана курстар учкун (жана ошондой эле өзүнөн DS). Жалпысынан алганда, бул жерде мазмун Google үчүн сонун, жана мен басым үчүн бир пакетти тандап керек болсо, анда, албетте, панда болмок. DS + Python материалдарынын айкалышы жөнүндө да абдан көп.

Shell суроо тили катары

Мен иштеген бир нече маалыматтарды иштетүү жана талдоо долбоорлору, чындыгында, Python, Java тилдеринде кодду чакырган кабык скрипттери жана кабык командаларынын өздөрү. Ошондуктан, жалпысынан, сиз bash/zsh/etc ичиндеги түтүктөрдү кандайдыр бир жогорку деңгээлдеги суроо катары карасаңыз болот (албетте, ал жерде циклдерди толтурсаңыз болот, бирок бул кабык тилдериндеги DS коду үчүн мүнөздүү эмес), келгиле, берели. жөнөкөй мисал - мен викидаталардын QID картасын жана орус жана англис викилерине толук шилтемелерди жасашым керек болчу, бул үчүн мен bash ичиндеги буйруктардан жөнөкөй сурам жаздым жана жыйынтык үчүн Python тилинде жөнөкөй скрипт жаздым. мындайча бириктирүү:

pv “data/latest-all.json.gz” | 
unpigz -c  | 
jq --stream $JQ_QUERY | 
python3 scripts/post_process.py "output.csv"

кайда

JQ_QUERY = 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")' 

Бул, чынында эле, талап кылынган картаны түзүүчү бүт түтүк болчу; биз көрүп тургандай, баары агым режиминде иштеген:

  • pv filepath - файлдын өлчөмүнө негизделген прогресс тилкесин берет жана анын мазмунун андан ары өткөрүп берет
  • unpigz -c архивдин бир бөлүгүн окуп jq
  • jq ачкыч менен - ​​агым дароо натыйжаны чыгарды жана аны Pythonдогу постпроцессорго өткөрүп берди (биринчи мисалдагыдай эле)
  • ички, постпроцессор чыгарууну форматтаган жөнөкөй мамлекеттик машина болгон 

Жалпысынан алганда, чоң маалыматтар боюнча (0.5 ТБ) агым режиминде иштеген татаал түтүк, олуттуу ресурстарсыз жана жөнөкөй түтүк жана бир нече куралдардан жасалган.

Дагы бир маанилүү кеңеш: терминалда жакшы жана эффективдүү иштеп, bash/zsh/etc жаза билүү.

Кайда пайдалуу болот? Ооба, дээрлик бардык жерде - дагы бир жолу, Интернетте изилдөө үчүн көптөгөн материалдар бар. Атап айтканда, бул жерде бул менин мурунку макалам.

R скрипт

Дагы, окурман мындай деп айтышы мүмкүн - бул бүтүндөй программалоо тили! Анан, албетте, ал туура болот. Бирок, мен адатта R менен ушундай контекстте жолукчумун, чындыгында ал суроо тилине абдан окшош болчу.

R - статистикалык эсептөө чөйрөсү жана статикалык эсептөө жана визуалдаштыруу тили (болжол менен бул).

Data Scientist's Notes: Берилиштерди суроо тилдерин жекелештирилген карап чыгуу
алынган бул жерде. Баса, мен аны сунуштайм, жакшы материал.

Эмне үчүн маалымат таануучу R билиши керек? Жок дегенде, R-де маалыматтарды талдоочу IT эмес адамдардын эбегейсиз катмары болгондуктан, мен аны төмөнкү жерлерде көрдүм:

  • Фармацевтика сектору.
  • Биологдор.
  • Финансы сектору.
  • Статистика менен алектенген таза математикалык билими бар адамдар.
  • Адистештирилген статистикалык моделдер жана машина үйрөнүү моделдери (аларды көбүнчө R пакети катары автордун версиясында гана табууга болот).

Эмне үчүн бул чындыгында суроо тили? Ал көп кездешкен формада, бул чындыгында моделди түзүү өтүнүчү, анын ичинде маалыматтарды окуу жана суроонун (модель) параметрлерин бекитүү, ошондой эле ggplot2 сыяктуу пакеттерде маалыматтарды визуалдаштыруу - бул да суроо жазуунун бир түрү. .

Визуализация үчүн сурамдардын мисалдары

ggplot(data = beav, 
       aes(x = id, y = temp, 
           group = activ, color = activ)) +
  geom_line() + 
  geom_point() +
  scale_color_manual(values = c("red", "blue"))

Жалпысынан алганда, Rден көптөгөн идеялар пандалар, numpy же scipy сыяктуу python пакеттерине көчүп кеткен, мисалы, dataframe жана маалыматтарды векторизациялоо - ошондуктан жалпысынан Rдеги көп нерселер сизге тааныш жана ыңгайлуу көрүнөт.

Изилдөө үчүн көптөгөн булактар ​​бар, мисалы, бул.

Билим графиктери

Бул жерде менде бир аз адаттан тыш тажрыйба бар, анткени мен көп учурда билим графиктери менен иштөөгө туура келет жана графиктер үчүн тилдерди сурайм. Ошондуктан, келгиле, бул бөлүк бир аз экзотикалык болгондуктан, кыскача негиздерин карап көрөлү.

Классикалык реляциялык маалымат базаларында бизде туруктуу схема бар, бирок бул жерде схема ийкемдүү, ар бир предикат чындыгында "мамыча" жана андан да көп.

Элестеткиле, сиз бир адамды моделдеп жатканыңызды жана негизги нерселерди сүрөттөгүңүз келген, мисалы, белгилүү бир адамды, Дуглас Адамсты алалы жана бул сүрөттөлүштү негиз катары колдонолу.

Data Scientist's Notes: Берилиштерди суроо тилдерин жекелештирилген карап чыгуу
www.wikidata.org/wiki/Q42

Эгерде биз реляциялык маалымат базасын колдонсок, анда биз чоң таблицаны же таблицаларды көп сандагы мамычаларды түзүшүбүз керек болот, алардын көпчүлүгү NULL болот же кандайдыр бир демейки False мааниге толтурулат, мисалы, көбүбүздүн Кореянын улуттук китепканасына кирүү - албетте, биз аларды өзүнчө таблицаларга жайгаштырсак болот, бирок бул акырында туруктуу реляциялык схеманы колдонуу менен предикаттар менен ийкемдүү логикалык схеманы моделдөө аракети болмокчу.

Data Scientist's Notes: Берилиштерди суроо тилдерин жекелештирилген карап чыгуу
Ошентип, бардык маалыматтар график же экилик жана унардык логикалык туюнтмалар түрүндө сакталат деп элестетиңиз.

Сиз муну кайдан жолуктура аласыз? Биринчиден, менен иштөө маалыматтар вики, жана ар кандай графикалык маалымат базалары же туташтырылган маалыматтар менен.

Төмөндө мен колдонгон жана иштеген негизги суроо тилдери бар.

SPARQL

Wiki:
SPARQL (рекурсивдүү акроним от Англисче SPARQL протоколу жана RDF суроо тили) - маалымат суроо тили, модели менен көрсөтүлгөн RDF, дагы протокол бул суроо-талаптарды берүү жана аларга жооп берүү. SPARQL - бул сунуш W3C консорциуму жана технологиялардын бири семантикалык желе.

Бирок чындыгында бул логикалык унардык жана бинардык предикаттар үчүн суроо тили. Сиз жөн гана шарттуу түрдө логикалык туюнтмада эмне белгиленип, эмнеси жок экенин көрсөтүп жатасыз (өтө жөнөкөйлөштүрүлгөн).

SPARQL сурамдары аткарылган RDF (Ресурстарды сүрөттөмө алкактары) базанын өзү үч эселенген. object, predicate, subject - жана сурам рухта көрсөтүлгөн чектөөлөргө ылайык талап кылынган үч эселикти тандайт: p_55(X, q_33) чындык боло тургандай X табыңыз - мында, албетте, p_55 - ID 55 менен кандайдыр бир байланыш жана q_33 - бул ID 33 менен объект (бул жерде жана бүт окуя, дагы бир жолу бардык майда-чүйдөсүнө чейин).

Маалыматтарды көрсөтүүнүн мисалы:

Data Scientist's Notes: Берилиштерди суроо тилдерин жекелештирилген карап чыгуу
Бул жерде өлкөлөр менен сүрөттөр жана мисалдар бул жерде.

Негизги суроонун мисалы

Data Scientist's Notes: Берилиштерди суроо тилдерин жекелештирилген карап чыгуу

Чынында, биз предикат үчүн ?өлкө өзгөрмөнүн маанисин тапкыбыз келет
member_of, мүчө_of(?country,q458) жана q458 Европа Биримдигинин идентификатору экени чын.

Python кыймылдаткычынын ичиндеги чыныгы SPARQL суроосунун мисалы:

Data Scientist's Notes: Берилиштерди суроо тилдерин жекелештирилген карап чыгуу

Адатта, мен аны жазгандын ордуна SPARQLди окушум керек болчу - мындай кырдаалда, маалымат кантип алынарын так түшүнүү үчүн тилди жок дегенде базалык деңгээлде түшүнүү пайдалуу чеберчилик болмок. 

Интернетте окуу үчүн көптөгөн материалдар бар: мисалы, бул жерде бул и бул. Мен адатта Google'дун конкреттүү дизайнын жана мисалдарын издейм жана бул азыр жетиштүү.

Логикалык суроо тилдери

Тема боюнча кененирээк менин макаламдан окуй аласыз бул жерде. Бул жерде биз логикалык тилдер суроо жазууга эмне үчүн ылайыктуу экенин кыскача карап чыгабыз. Негизи, RDF бул p(X) жана h(X,Y) формасындагы логикалык билдирүүлөрдүн жыйындысы жана логикалык суроо төмөнкү формага ээ:

output(X) :- country(X), member_of(X,“EU”).

Бул жерде жаңы предикатты түзүү жөнүндө сөз болуп жатат/1 (/1 бирдиктүү дегенди билдирет), эгерде X үчүн өлкө(X) - б.а., X өлкө, ошондой эле(X,"ЕБ") мүчөсү экендиги чын болсо.

Башкача айтканда, бул учурда маалыматтар да, эрежелер да бирдей берилген, бул бизге көйгөйлөрдү абдан оңой жана жакшы моделдештирүүгө мүмкүндүк берет.

Сиз өнөр жайда кайдан тааныштыңыз?: суроо-талаптарды ушундай тилде жазган компания менен бүтүндөй чоң долбоор, ошондой эле системанын өзөгүндөгү учурдагы долбоор - бул экзотикалык нерседей сезилет, бирок кээде ушундай болот.

Логикалык тилди иштетүүчү викидатадагы код фрагментинин мисалы:

Data Scientist's Notes: Берилиштерди суроо тилдерин жекелештирилген карап чыгуу

Материалдар: Мен бул жерде заманбап логикалык программалоо тилине бир нече шилтеме берем Answer Set Programming - Мен аны изилдөөнү сунуштайм:

Data Scientist's Notes: Берилиштерди суроо тилдерин жекелештирилген карап чыгуу

Source: www.habr.com

Комментарий кошуу