Как переписать ваши SQL-запросы и многое другое с помощью Pandas

задняя часть SQL Программа перевода самородков pandas

Пятнадцать лет назад у разработчика программного обеспечения было мало навыков, и он или она имели 95% шансов получить работу. Эти навыки включают в себя:

  • Объектно-ориентированное программирование
  • язык сценариев
  • JavaScript и другие
  • SQL

SQL — распространенный инструмент, когда нужно быстро просмотреть какие-то данные и сделать предварительные выводы, которые могут привести к аналитическому отчету или написанию приложения. это называетсяИсследовательский анализ.

Сегодня данные поступают в различных формах и больше не являются просто синонимом «реляционной базы данных». Ваши данные могут быть в файлах CSV, простом тексте, Parquet, HDF5 и т. д. это точноPandasГде сияет библиотека.

Что такое Панды?

Pandas, библиотека анализа данных Python, представляет собой библиотеку Python для анализа и обработки данных. Это открытый исходный код и поддерживается Anaconda. Он особенно подходит для структурированных (табличных) данных. Для получения дополнительной информации см.pandas.друзья попали на него.org/pandas-docs….

Что можно с ним сделать?

Данные запроса и различные другие операции, которые вы выполняли в SQL раньше, могут быть выполнены Pandas!

Очень хороший! С чего начать?

Это сложная часть для тех, кто привык решать проблемы с данными с помощью операторов SQL.

SQL — этодекларативный язык программирования:Итак, Wikipedia.org/wiki/list_oh....

В SQL вы объявляете то, что хотите, с помощью декларативных выражений, которые читаются почти так же плавно, как обычные английские фразы.

иPandasСинтаксис полностью отличается от SQL. существуетpandasВ , вы обрабатываете наборы данных и связываете их вместе, чтобы их можно было преобразовать и реконструировать так, как вы хотите.

нам нужноразговорник!

Анатомия SQL-запроса

SQL-запрос состоит из нескольких важных ключевых слов. Между этими ключевыми словами добавьте конкретные данные, которые вы хотите видеть. Ниже приведен скелет некоторых операторов запроса без конкретных данных:

ВЫБЕРИТЕ… ОТ… ГДЕ…

СГРУППИРОВАТЬ ПО… НАЛИЧИЕ…

СОРТИРОВАТЬ ПО…

ПРЕДЕЛ… СМЕЩЕНИЕ…

Конечно, есть и другие команды, но эти самые важные. Итак, как мы реализуем эти команды в Pandas?

Во-первых, нам нужно загрузить некоторые данные в Pandas, так как их еще нет в базе данных. Следующее:

import pandas as pd

airports = pd.read_csv('data/airports.csv')
airport_freq = pd.read_csv('data/airport-frequencies.csv')
runways = pd.read_csv('data/runways.csv')

мои данные взяты изourairports.com/data/.

SELECT, WHERE, DISTINCT, LIMIT

Вот несколько операторов SELECT. Мы используем LIMIT для усечения результатов, WHERE для фильтрации и DISTINCT для удаления дубликатов.

SQL Pandas
select * from airports airports
select * from airports limit 3 airports.head(3)
select id from airports where ident = 'KLAX' airports[airports.ident == 'KLAX'].id
select distinct type from airport airports.type.unique()

Операция SELECT с несколькими условиями

Мы объединяем несколько условий с помощью символа & . Если нам нужно только подмножество условий в столбце таблицы, это можно выразить, добавив еще одну пару квадратных скобок.

SQL Pandas
select * from airports where iso_region = 'US-CA' and type = 'seaplane_base' airports[(airports.iso_region == 'US-CA') & (airports.type == 'seaplane_base')]
select ident, name, municipality from airports where iso_region = 'US-CA' and type = 'large_airport' airports[(airports.iso_region == 'US-CA') & (airports.type == 'large_airport')][['ident', 'name', 'municipality']]

СОРТИРОВАТЬ ПО

По умолчанию Pandas сортирует в порядке возрастания. Если вы хотите использовать убывающий порядок, установите asending=False.

SQL Pandas
select * from airport_freq where airport_ident = 'KLAX' order by type airport_freq[airport_freq.airport_ident == 'KLAX'].sort_values('type')
select * from airport_freq where airport_ident = 'KLAX' order by type desc airport_freq[airport_freq.airport_ident == 'KLAX'].sort_values('type', ascending=False)

В… НЕ В (включает… не включает)

Мы знаем, как фильтровать значения, но как нам фильтровать список, например оператор IN в SQL? В пандах,.isin()Оператор работает так же, как SQL IN. Чтобы использовать отрицательные условия, используйте~.

SQL Pandas
select * from airports where type in ('heliport', 'balloonport') airports[airports.type.isin(['heliport', 'balloonport'])]
select * from airports where type not in ('heliport', 'balloonport') airports[~airports.type.isin(['heliport', 'balloonport'])]

СГРУППИРОВАТЬ ПО, СЧЕТЧИК, ЗАКАЗАТЬ ПО (группировка)

Группировка проста: используйте.groupby()оператор. в SQL и пандахCOUNTЕсть тонкие различия в предложениях. В пандах,.count()вернет ненулевое/не-NaN значение. Чтобы получить с SQLCOUNTтот же результат, используйте.size().

SQL Pandas
select iso_country, type, count(*) from airports group by iso_country, type order by iso_country, type airports.groupby(['iso_country', 'type']).size()
select iso_country, type, count(*) from airports group by iso_country, type order by iso_country, count(*) desc airports.groupby(['iso_country', 'type']).size().to_frame('size').reset_index().sort_values(['iso_country', 'size'], ascending=[True, False])

Ниже мы группируем по нескольким полям. Панды по умолчанию сортируют вещи в одном и том же поле в списке, поэтому в первом примере вам не нужно.sort_values(). Если мы хотим использовать другое поле для сортировки или хотим использоватьDESCвместоASC, как и во втором примере, то мы должны явно использовать.sort_values():

SQL Pandas
select iso_country, type, count(*) from airports group by iso_country, type order by iso_country, type airports.groupby(['iso_country', 'type']).size()
select iso_country, type, count(*) from airports group by iso_country, type order by iso_country, count(*) desc airports.groupby(['iso_country', 'type']).size().to_frame('size').reset_index().sort_values(['iso_country', 'size'], ascending=[True, False])

которые используют.to_frame()иreset_index()Почему? Поскольку мы хотим передать вычисляемое поле (size) для сортировки, поэтому это поле должно бытьDataFrameчасть. После группировки в Pandas получаемGroupByObjectНовый тип. Поэтому нам нужно использовать.to_frame()преобразовать его обратно вDataFrameтип. повторное использование.reset_index(), мы повторяем нумерацию строк фрейма данных.

НАЛИЧИЕ (включено)

В SQL вы можете использовать условный оператор HAVING для дополнительной фильтрации сгруппированных данных. В Пандах вы можете использовать.filter(), и дайте ему функцию Python (или лямбда-функцию), которая возвращает значение, если группа включена в результатTrue.

SQL Pandas
select type, count(*) from airports where iso_country = 'US' group by type having count(*) > 1000 order by count(*) desc airports[airports.iso_country == 'US'].groupby('type').filter(lambda g: len(g) > 1000).groupby('type').size().sort_values(ascending=False)

N лучших записей

Предположим, мы делаем некоторые предварительные запросы, и теперь у нас есть запрос с именемby_countryФрейм данных, который содержит количество аэропортов для каждой страны:

В первом следующем примере мы передаемairport_countдля сортировки и выбора только 10 лучших стран. Второй пример более сложный, нам нужны «остальные 10 после первых 10, то есть от 11 до 20»:

SQL Pandas
select iso_country from by_country order by size desc limit 10 by_country.nlargest(10, columns='airport_count')
select iso_country from by_country order by size desc limit 10 offset 10 by_country.nlargest(20, columns='airport_count').tail(10)

Агрегатные функции (MIN, MAX, MEAN)

Теперь задан набор кадров данных или набор данных взлетно-посадочной полосы:

Рассчитайте минимальную, максимальную, среднюю и медианную длину взлетно-посадочной полосы:

SQL Pandas
select max(length_ft), min(length_ft), mean(length_ft), median(length_ft) from runways runways.agg({'length_ft': ['min', 'max', 'mean', 'median']})

Вы заметите, что в SQL-запросе каждая статистика представляет собой столбец данных. Но с методом агрегации Pandas каждая статистика представляет собой строку данных:

Не волнуйтесь - просто передайте фрейм данных через.TПреобразование можно выполнить, чтобы получить данные в столбцах:

ПРИСОЕДИНЯЙТЕСЬ (присоединяйтесь)

использовать.merge()чтобы присоединиться к кадрам данных Pandas. Вам необходимо указать, какие столбцы объединять (left_on и right_on) и тип соединения:inner(дефолт),left(соответствует LEFT OUTER в SQL),right(ПРАВЫЙ ВНЕШНИЙ), илиOUTER(ПОЛНЫЙ ВНЕШНИЙ).

SQL Pandas
select airport_ident, type, description, frequency_mhz from airport_freq join airports on airport_freq.airport_ref = airports.id where airports.ident = 'KLAX' airport_freq.merge(airports[airports.ident == 'KLAX'][['id']], left_on='airport_ref', right_on='id', how='inner')[['airport_ident', 'type', 'description', 'frequency_mhz']]

СОЮЗ ВСЕХ и СОЮЗ

использоватьpd.concat()заменятьUNION ALLЧтобы объединить два фрейма данных:

SQL Pandas
select name, municipality from airports where ident = 'KLAX' union all select name, municipality from airports where ident = 'KLGB' pd.concat([airports[airports.ident == 'KLAX'][['name', 'municipality']], airports[airports.ident == 'KLGB'][['name', 'municipality']]])

хотите дедуплицировать данные во время процесса слияния (эквивалентноUNION), вам также необходимо добавить.drop_duplicates().

ВСТАВЛЯТЬ

До сих пор мы говорили о скрининге, но во время исследовательского анализа вам также может понадобиться изменить его. Что делать, если вы хотите добавить некоторые недостающие записи?

В пандах нет формыINSERTспособ высказывания. Вместо этого вы можете просто создать новый фрейм данных с новыми записями, а затем объединить два фрейма данных:

SQL Pandas
create table heroes (id integer, name text); df1 = pd.DataFrame({'id': [1, 2], 'name': ['Harry Potter', 'Ron Weasley']})
insert into heroes values (1, 'Harry Potter'); df2 = pd.DataFrame({'id': [3], 'name': ['Hermione Granger']})
insert into heroes values (2, 'Ron Weasley');
insert into heroes values (3, 'Hermione Granger'); pd.concat([df1, df2]).reset_index(drop=True)

ОБНОВИТЬ

Теперь нам нужно изменить некоторые неверные данные в исходном фрейме данных:

SQL Pandas
update airports set home_link = 'http://www.lawa.org/welcomelax.aspx' where ident == 'KLAX' airports.loc[airports['ident'] == 'KLAX', 'home_link'] = 'http://www.lawa.org/welcomelax.aspx'

УДАЛИТЬ (удалить)

Самый простой (и наиболее читаемый) способ «удалить» данные из фрейма данных Pandas — извлечь фрейм данных в подмножество, содержащее данные строки, которые вы хотите сохранить. Кроме того, вы можете удалить, получив индекс строки, используя.drop()метод для удаления строк с этими индексами:

SQL Pandas
delete from lax_freq where type = 'MISC' lax_freq = lax_freq[lax_freq.type != 'MISC']
lax_freq.drop(lax_freq[lax_freq.type == 'MISC'].index)

неизменность

Я должен упомянуть одну важную вещь — неизменность. По умолчанию большинство операторов, применяемых к фреймам данных Pandas, возвращают новый объект. Некоторые операторы могут приниматьinplace=Trueпараметр, чтобы вы могли продолжать использовать исходный фрейм данных. Например, вот метод, который сбрасывает индекс на место:

df.reset_index(drop=True, inplace=True)

Тем не менее, вышеизложенноеUPDATEв примере.locОператор только находит индексы записей, которые необходимо обновить, а значения меняются на месте. Также, если вы обновите все значения столбца:

df['url'] = 'http://google.com'

Или добавьте новый вычисляемый столбец:

df['total_cost'] = df['price'] * df['quantity']

Все это меняется на месте.

Более!

Отличительной особенностью Pandas является то, что это не просто механизм запросов. С вашими данными можно делать гораздо больше, например:

  • Вывод в нескольких форматах:
df.to_csv(...)  # csv file
df.to_hdf(...)  # HDF5 file
df.to_pickle(...)  # serialized object
df.to_sql(...)  # to SQL database
df.to_excel(...)  # to Excel sheet
df.to_json(...)  # to JSON string
df.to_html(...)  # render as HTML table
df.to_feather(...)  # binary feather-format
df.to_latex(...)  # tabular environment table
df.to_stata(...)  # Stata binary data files
df.to_msgpack(...)	# msgpack (serialize) object
df.to_gbq(...)  # to a Google BigQuery table.
df.to_string(...)  # console-friendly tabular output.
df.to_clipboard(...) # clipboard that can be pasted into Excel
  • Постройте график:
top_10.plot(
    x='iso_country', 
    y='airport_count',
    kind='barh',
    figsize=(10, 7),
    title='Top 10 countries with most airports')

Посмотрите несколько отличных графиков!

  • общий:

Лучшей средой для обмена результатами запросов Pandas, графиками и сопутствующим контентом являются блокноты Jupyter (jupyter.org/). На самом деле, некоторые люди (например, Джейк Вандерплас, он потрясающий) публикуют целые книги в блокнотах Jupyter:GitHub.com/Джейк в шортах/py тоже….

Новый блокнот легко создать:

pip install jupyter
jupyter notebook

после:

  • открыть локальный хост: 8888
  • Нажмите «Создать» и дайте блокноту имя.
  • запрашивать и отображать данные
  • Создайте репозиторий GitHub и добавьте свою записную книжку в репозиторий (с суффиксом.ipynbдокумент).

GitHub имеет отличный встроенный просмотрщик, который отображает содержимое блокнотов Jupyter в формате Markdown.

Теперь вы можете начать свое путешествие с пандами!

Надеюсь, теперь вы убедились, что библиотека Pandas может помочь вам в исследовательском анализе данных, как ваш старый друг SQL, а в некоторых случаях даже лучше. Пришло время запачкать руки и начать запрашивать данные в Pandas!

✉️Subscribe toCodeBurstonce-weekly Email Blast,🐦Follow CodeBurst on Twitter, view🗺️The 2018 Web Developer Roadmap, and🕸️Learn Full Stack Web Development.

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллекти другие поля, если вы хотите видеть больше качественных переводов, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.