- Оригинальный адрес:How to rewrite your SQL queries in Pandas, and more
- Оригинальный автор:Irina Truong
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:geniusq1981
- Корректор:DAA233
Пятнадцать лет назад у разработчика программного обеспечения было мало навыков, и он или она имели 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,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллекти другие поля, если вы хотите видеть больше качественных переводов, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.