Сравнение с Stata
Для потенциальных пользователей, переходящих с Stata, эта страница предназначена для демонстрации того, как различные операции Stata выполняются в pandas.
Если вы новичок в pandas, вы можете сначала ознакомиться с 10 минут с pandas, чтобы ознакомиться с библиотекой.
Как обычно, мы импортируем pandas и NumPy следующим образом. Это означает, что мы можем ссылаться на библиотеки как pd и np, соответственно, на остальной части документа.
In [1]: import pandas as pd In [2]: import numpy as np
Примечание
На протяжении всего этого учебника, pandas DataFrame будет отображаться, вызывая df.head(), который отображает первые N (по умолчанию 5) строк DataFrame. Это часто используется в интерактивной работе (например, в Jupyter notebook или терминале) – эквивалентом в Stata будет:
list in 1/5
Структуры данных
Перевод общей терминологии
| pandas | Stata |
|---|---|
DataFrame | набор данных |
| столбец | переменная |
| строка | наблюдение |
| groupby | bysort |
NaN | . |
DataFrame / Series
DataFrame в pandas аналогичен набору данных Stata – двумерному источнику данных с именованными столбцами, которые могут быть различных типов. Как будет показано в этом документе, почти любую операцию, которую можно применить к набору данных в Stata, также можно выполнить в pandas.
Series — это структура данных, которая представляет один столбец DataFrame. Stata не имеет отдельной структуры данных для одного столбца, но в целом работа с Series аналогична обращению к столбцу набора данных в Stata.
Index
У каждого DataFrame и Series есть Index — метки в строках данных. В Stata нет точно аналогичного понятия. В Stata строки набора данных по существу не имеют меток, кроме неявного целочисленного индекса, к которому можно получить доступ с помощью _n.
В pandas, если индекс не указан, по умолчанию используется целочисленный индекс (первая строка = 0, вторая строка = 1 и так далее). Хотя использование именованного Index или MultiIndex может обеспечить сложные анализы и в конечном итоге является важной частью pandas, для этого сравнения мы в основном проигнорируем Index и просто будем рассматривать DataFrame как набор столбцов. Более подробную информацию о том, как эффективно использовать Index, см. в документации по индексированию.
Ввод/вывод данных
Создание DataFrame из значений
Набор данных Stata можно создать из заданных значений, поместив данные после оператора input и указав имена столбцов.
input x y 1 2 3 4 5 6 end
DataFrame pandas можно создать многими различными способами, но для небольшого количества значений удобно указать его как словарь Python, где ключи — имена столбцов, а значения — данные.
In [3]: df = pd.DataFrame({'x': [1, 3, 5], 'y': [2, 4, 6]})
In [4]: df
Out[4]:
x y
0 1 2
1 3 4
2 5 6
Чтение внешних данных
Как и Stata, pandas предоставляет инструменты для чтения данных из многих форматов. Набор данных tips, который находится в тестах pandas (csv), будет использоваться во многих следующих примерах.
Stata предоставляет import delimited для чтения данных csv в набор данных в памяти. Если файл tips.csv находится в текущем рабочем каталоге, мы можем импортировать его следующим образом.
import delimited tips.csv
Метод pandas — read_csv(), который работает аналогичным образом. Кроме того, он автоматически загрузит набор данных, если ему будет представлен URL.
In [5]: url = ('https://raw.github.com/pandas-dev'
...: '/pandas/master/pandas/tests/data/tips.csv')
...:
In [6]: tips = pd.read_csv(url)
In [7]: tips.head()
Out[7]:
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
Как и import delimited, read_csv() может принимать ряд параметров для указания того, как должны быть обработаны данные. Например, если данные были бы разделяемыми табуляцией, не имели бы имен столбцов и находились в текущем рабочем каталоге, команда pandas была бы:
tips = pd.read_csv('tips.csv', sep='\t', header=None)
# alternatively, read_table is an alias to read_csv with tab delimiter
tips = pd.read_table('tips.csv', header=None)
Pandas также может читать наборы данных Stata в формате .dta с помощью функции read_stata().
df = pd.read_stata('data.dta')
Помимо текстовых/csv и файлов Stata, pandas поддерживает различные другие форматы данных, такие как Excel, SAS, HDF5, Parquet и базы данных SQL. Они все читаются с помощью функции pd.read_*. Дополнительные сведения см. в документации по вводу/выводу.
Экспорт данных
Обратной операцией import delimited в Stata является export delimited
export delimited tips2.csv
Аналогично, в pandas обратная операция read_csv — DataFrame.to_csv().
tips.to_csv('tips2.csv')
Pandas также может экспортировать данные в формат файла Stata с помощью метода DataFrame.to_stata().
tips.to_stata('tips2.dta')
Операции с данными
Операции со столбцами
В Stata произвольные математические выражения могут использоваться с командами generate и replace для создания новых или существующих столбцов. Команда drop удаляет столбец из набора данных.
replace total_bill = total_bill - 2 generate new_bill = total_bill / 2 drop new_bill
pandas предоставляет аналогичные векторизованные операции, указывая отдельные Series в DataFrame. Новые столбцы можно назначать аналогичным образом. Метод DataFrame.drop() удаляет столбец из DataFrame.
In [8]: tips['total_bill'] = tips['total_bill'] - 2
In [9]: tips['new_bill'] = tips['total_bill'] / 2
In [10]: tips.head()
Out[10]:
total_bill tip sex smoker day time size new_bill
0 14.99 1.01 Female No Sun Dinner 2 7.495
1 8.34 1.66 Male No Sun Dinner 3 4.170
2 19.01 3.50 Male No Sun Dinner 3 9.505
3 21.68 3.31 Male No Sun Dinner 2 10.840
4 22.59 3.61 Female No Sun Dinner 4 11.295
In [11]: tips = tips.drop('new_bill', axis=1)
Фильтрация
Фильтрация в Stata выполняется с помощью условия if по одному или нескольким столбцам.
list if total_bill > 10
DataFrame можно фильтровать различными способами; наиболее интуитивный из которых — использование булевой индексации.
In [12]: tips[tips['total_bill'] > 10].head() Out[12]: total_bill tip sex smoker day time size 0 14.99 1.01 Female No Sun Dinner 2 2 19.01 3.50 Male No Sun Dinner 3 3 21.68 3.31 Male No Sun Dinner 2 4 22.59 3.61 Female No Sun Dinner 4 5 23.29 4.71 Male No Sun Dinner 4
Логика «если/то»
В Stata условие if также можно использовать для создания новых столбцов.
generate bucket = "low" if total_bill < 10 replace bucket = "high" if total_bill >= 10
Такую же операцию в pandas можно выполнить, используя метод where из numpy.
In [13]: tips['bucket'] = np.where(tips['total_bill'] < 10, 'low', 'high') In [14]: tips.head() Out[14]: total_bill tip sex smoker day time size bucket 0 14.99 1.01 Female No Sun Dinner 2 high 1 8.34 1.66 Male No Sun Dinner 3 low 2 19.01 3.50 Male No Sun Dinner 3 high 3 21.68 3.31 Male No Sun Dinner 2 high 4 22.59 3.61 Female No Sun Dinner 4 high
Функциональность дат
Stata предоставляет различные функции для выполнения операций со столбцами дат/временных меток.
generate date1 = mdy(1, 15, 2013)
generate date2 = date("Feb152015", "MDY")
generate date1_year = year(date1)
generate date2_month = month(date2)
* shift date to beginning of next month
generate date1_next = mdy(month(date1) + 1, 1, year(date1)) if month(date1) != 12
replace date1_next = mdy(1, 1, year(date1) + 1) if month(date1) == 12
generate months_between = mofd(date2) - mofd(date1)
list date1 date2 date1_year date2_month date1_next months_between
Эквивалентные операции pandas показаны ниже. Кроме этих функций, pandas поддерживает другие функции временных рядов, отсутствующие в Stata (например, обработку часовых поясов и пользовательские интервалы) — см. документацию по временным рядам для получения более подробной информации.
In [15]: tips['date1'] = pd.Timestamp('2013-01-15')
In [16]: tips['date2'] = pd.Timestamp('2015-02-15')
In [17]: tips['date1_year'] = tips['date1'].dt.year
In [18]: tips['date2_month'] = tips['date2'].dt.month
In [19]: tips['date1_next'] = tips['date1'] + pd.offsets.MonthBegin()
In [20]: tips['months_between'] = (tips['date2'].dt.to_period('M')
....: - tips['date1'].dt.to_period('M'))
....:
In [21]: tips[['date1', 'date2', 'date1_year', 'date2_month', 'date1_next',
....: 'months_between']].head()
....:
Out[21]:
date1 date2 date1_year date2_month date1_next months_between
0 2013-01-15 2015-02-15 2013 2 2013-02-01 <25 * MonthEnds>
1 2013-01-15 2015-02-15 2013 2 2013-02-01 <25 * MonthEnds>
2 2013-01-15 2015-02-15 2013 2 2013-02-01 <25 * MonthEnds>
3 2013-01-15 2015-02-15 2013 2 2013-02-01 <25 * MonthEnds>
4 2013-01-15 2015-02-15 2013 2 2013-02-01 <25 * MonthEnds>
Выбор столбцов
Stata предоставляет ключевые слова для выбора, удаления и переименования столбцов.
keep sex total_bill tip drop sex rename total_bill total_bill_2
Те же операции выражены в pandas ниже. Обратите внимание, что в отличие от Stata, эти операции не происходят на месте. Чтобы эти изменения сохранились, присвойте операцию обратно переменной.
# keep
In [22]: tips[['sex', 'total_bill', 'tip']].head()
Out[22]:
sex total_bill tip
0 Female 14.99 1.01
1 Male 8.34 1.66
2 Male 19.01 3.50
3 Male 21.68 3.31
4 Female 22.59 3.61
# drop
In [23]: tips.drop('sex', axis=1).head()
© 2008–2012, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
Licensed under the 3-clause BSD License.
https://pandas.pydata.org/pandas-docs/version/0.25.0/getting_started/comparison/comparison_with_stata.html