Spec-Zone.ru › pandas 0.24

Сравнение с 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

Pandas DataFrame можно создавать различными способами, но для небольшого количества значений удобно задавать его в виде словаря 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.24.2/getting_started/comparison/comparison_with_stata.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API