Сравнение с SAS
Для потенциальных пользователей, переходящих с SAS, эта страница предназначена для демонстрации того, как различные операции SAS выполняются в pandas.
Если вы новичок в pandas, вам может быть полезно сначала ознакомиться с 10 минут с pandas, чтобы ознакомиться с библиотекой.
Как обычно, мы импортируем pandas и NumPy следующим образом:
In [1]: import pandas as pd In [2]: import numpy as np
Примечание
На протяжении этого учебника, pandas DataFrame будет отображаться при вызове df.head(), который отображает первые N (по умолчанию 5) строк DataFrame. Это часто используется в интерактивной работе (например, Jupyter notebook или терминал) - эквивалент в SAS будет:
proc print data=df(obs=5); run;
Структуры данных
Перевод общей терминологии
| pandas | SAS |
|---|---|
DataFrame | набор данных |
| столбец | переменная |
| строка | наблюдение |
| groupby | BY-группа |
NaN | . |
DataFrame / Series
DataFrame в pandas аналогичен набору данных SAS - двумерному источнику данных с именованными столбцами, которые могут быть разных типов. Как будет показано в этом документе, почти любая операция, которая может быть применена к набору данных с использованием шага DATA SAS, также может быть выполнена в pandas.
Series - это структура данных, которая представляет один столбец DataFrame. SAS не имеет отдельной структуры данных для одного столбца, но в целом работа с Series аналогична ссылке на столбец в шаге DATA.
Index
Каждый DataFrame и Series имеет Index - метки строк данных. SAS не имеет точно аналогичного понятия. Строки набора данных по существу не имеют меток, кроме неявного целочисленного индекса, к которому можно получить доступ во время шага DATA (_N_).
В pandas, если индекс не указан, по умолчанию используется целочисленный индекс (первая строка = 0, вторая строка = 1 и так далее). Хотя использование маркированного Index или MultiIndex может позволить выполнять сложные анализы и в конечном итоге является важной частью pandas, для этого сравнения мы в основном будем игнорировать Index и просто будем рассматривать DataFrame как набор столбцов. Для получения более подробной информации о том, как эффективно использовать Index, обратитесь к документации по индексированию.
Ввод/вывод данных
Создание DataFrame из значений
Набор данных SAS можно создать из указанных значений, поместив данные после инструкции datalines и указав имена столбцов.
data df;
input x y;
datalines;
1 2
3 4
5 6
;
run;
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
Чтение внешних данных
Как и SAS, pandas предоставляет средства для чтения данных из многих форматов. Набор данных tips, который находится в тестах pandas (csv), будет использоваться во многих последующих примерах.
SAS предоставляет PROC IMPORT для чтения данных csv в набор данных.
proc import datafile='tips.csv' dbms=csv out=tips replace;
getnames=yes;
run;
Метод pandas - read_csv(), который работает аналогично.
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
Как и PROC IMPORT, 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)
Помимо текстовых/csv данных, pandas поддерживает множество других форматов данных, таких как Excel, HDF5 и базы данных SQL. Они все считываются через функцию pd.read_*. Дополнительные сведения см. в документации по вводу/выводу.
Экспорт данных
Обратное PROC IMPORT в SAS - это PROC EXPORT
proc export data=tips outfile='tips2.csv' dbms=csv; run;
Аналогично в pandas, обратное read_csv - это to_csv(), и другие форматы данных следуют аналогичному API.
tips.to_csv('tips2.csv')
Операции с данными
Операции со столбцами
В шаге DATA произвольные математические выражения могут использоваться с новыми или существующими столбцами.
data tips;
set tips;
total_bill = total_bill - 2;
new_bill = total_bill / 2;
run;
pandas предоставляет аналогичные векторизованные операции, указывая отдельные Series в DataFrame. Новые столбцы могут быть назначены аналогичным образом.
In [8]: tips['total_bill'] = tips['total_bill'] - 2 In [9]: tips['new_bill'] = tips['total_bill'] / 2.0 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
Фильтрация
Фильтрация в SAS выполняется с помощью инструкции if или where по одному или нескольким столбцам.
data tips;
set tips;
if total_bill > 10;
run;
data tips;
set tips;
where total_bill > 10;
/* equivalent in this case - where happens before the
DATA step begins and can also be used in PROC statements */
run;
DataFrames могут быть отфильтрованы несколькими способами; наиболее интуитивно понятным из которых является использование булевого индексирования
In [11]: tips[tips['total_bill'] > 10].head() Out[11]: 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
Условные инструкции
В SAS условные инструкции могут использоваться для создания новых столбцов.
data tips;
set tips;
format bucket $4.;
if total_bill < 10 then bucket = 'low';
else bucket = 'high';
run;
Такая же операция в pandas может быть выполнена с помощью метода where из numpy.
In [12]: tips['bucket'] = np.where(tips['total_bill'] < 10, 'low', 'high') In [13]: tips.head() Out[13]: 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
Функциональность дат
SAS предоставляет множество функций для выполнения операций со столбцами дат/временных меток.
data tips;
set tips;
format date1 date2 date1_plusmonth mmddyy10.;
date1 = mdy(1, 15, 2013);
date2 = mdy(2, 15, 2015);
date1_year = year(date1);
date2_month = month(date2);
* shift date to beginning of next interval;
date1_next = intnx('MONTH', date1, 1);
* count intervals between dates;
months_between = intck('MONTH', date1, date2);
run;
Эквивалентные операции pandas показаны ниже. Кроме этих функций, pandas поддерживает другие функции работы со временными рядами, отсутствующие в базовом SAS (например, пересборку и пользовательские интервалы) - см. документацию по временным рядам для получения более подробной информации.
In [14]: tips['date1'] = pd.Timestamp('2013-01-15')
In [15]: tips['date2'] = pd.Timestamp('2015-02-15')
In [16]: tips['date1_year'] = tips['date1'].dt.year
In [17]: tips['date2_month'] = tips['date2'].dt.month
In [18]: tips['date1_next'] = tips['date1'] + pd.offsets.MonthBegin()
In [19]: tips['months_between'] = (
....: tips['date2'].dt.to_period('M') - tips['date1'].dt.to_period('M'))
....:
In [20]: tips[['date1', 'date2', 'date1_year', 'date2_month',
....: 'date1_next', 'months_between']].head()
....:
Out[20]:
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>
Выбор столбцов
SAS предоставляет ключевые слова в шаге DATA для выбора, удаления и переименования столбцов.
data tips;
set tips;
keep sex total_bill tip;
run;
data tips;
set tips;
drop sex;
run;
data tips;
set tips;
rename total_bill=total_bill_2;
run;
Те же операции выражены в pandas ниже.
# keep
In [21]: tips[['sex', 'total_bill', 'tip']].head()
Out[21]:
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 [22]: 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_sas.html