Spec-Zone.ru › pandas 0.24

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

Spec-Zone.ru

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