Версия 0.7.0 (9 февраля 2012)#

Новые возможности#

  • Новый унифицированный функцию merge для эффективного выполнения полного набора операций базы данных / реляционной алгебры. Рефакторинг существующих методов соединения для использования новой инфраструктуры привел к значительному повышению производительности (GH 220, GH 249, GH 267)

  • Новый унифицированная функция конкатенации для объединения объектов Series, DataFrame или Panel вдоль оси. Может формировать объединение или пересечение других осей. Улучшает производительность Series.append и DataFrame.append (GH 468, GH 479, GH 273)

  • Можно передать несколько DataFrame в DataFrame.append для объединения (стэкинга) и нескольких Series для Series.append тоже

  • Может передать список словарей (например, список объектов JSON) в конструктор DataFrame (GH 526)

  • Теперь вы можете установить несколько столбцов в DataFrame через __getitem__, полезно для преобразования (GH 342)

  • Обрабатывать выходные значения с разными индексами в DataFrame.apply (GH 498)

In [1]: df = pd.DataFrame(np.random.randn(10, 4))
In [2]: df.apply(lambda x: x.describe())
Out[2]:
               0          1          2          3
count  10.000000  10.000000  10.000000  10.000000
mean    0.190912  -0.395125  -0.731920  -0.403130
std     0.730951   0.813266   1.112016   0.961912
min    -0.861849  -2.104569  -1.776904  -1.469388
25%    -0.411391  -0.698728  -1.501401  -1.076610
50%     0.380863  -0.228039  -1.191943  -1.004091
75%     0.658444   0.057974  -0.034326   0.461706
max     1.212112   0.577046   1.643563   1.071804

[8 rows x 4 columns]
  • Добавить reorder_levels метод для Series и DataFrame (GH 534)

  • Добавить словареподобный get функцию в DataFrame и Panel (GH 521)

  • Добавить DataFrame.iterrows метод для эффективного перебора строк DataFrame

  • Добавить DataFrame.to_panel с кодом, адаптированным из LongPanel.to_long

  • Добавить reindex_axis метод добавлен в DataFrame

  • Добавить level опция для бинарных арифметических функций на DataFrame и Series

  • Добавить level опция для reindex и align методы Series и DataFrame для трансляции значений по уровню (GH 542, GH 552, другие)

  • Добавить доступ к элементам по атрибутам в Panel и добавить автодополнение IPython (GH 563)

  • Добавить logy опция для Series.plot для логарифмического масштабирования на оси Y

  • Добавить index и header опции для DataFrame.to_string

  • Может передавать несколько DataFrame в DataFrame.join для соединения по индексу (GH 115)

  • Может передать несколько панелей в Panel.join (GH 115)

  • Добавлен justify аргумент для DataFrame.to_string для разрешения различного выравнивания заголовков столбцов

  • Добавить sort опция для GroupBy, позволяющая отключить сортировку ключей групп для потенциального ускорения (GH 595)

  • Может передать MaskedArray в конструктор Series (GH 563)

  • Добавлен доступ к элементам Panel через атрибуты и завершение IPython (GH 554)

  • Реализовать DataFrame.lookup, аналог fancy-индексирования для получения значений по заданной последовательности меток строк и столбцов (GH 338)

  • Можно передать список функций для агрегации с помощью groupby на DataFrame, получая агрегированный результат с иерархическими столбцами (GH 166)

  • Можно вызвать cummin и cummax на Series и DataFrame для получения кумулятивного минимума и максимума соответственно (GH 647)

  • value_range добавлена как служебная функция для получения минимума и максимума датафрейма (GH 288)

  • Добавлен encoding аргумент для read_csv, read_table, to_csv и from_csv для не-ASCII текста (GH 717)

  • Добавлен abs метод для объектов pandas

  • Добавлен crosstab функция для простого вычисления частотных таблиц

  • Добавлен isin метод для индексации объектов

  • Добавлен level аргумент для xs метод DataFrame.

Изменения API для целочисленной индексации#

Одно из потенциально самых рискованных изменений API в 0.7.0, но также одно из самых важных, было полным пересмотром того, как целочисленные индексы обрабатываются с учетом индексации по меткам. Вот пример:

In [3]: s = pd.Series(np.random.randn(10), index=range(0, 20, 2))
In [4]: s
Out[4]:
0    -1.294524
2     0.413738
4     0.276662
6    -0.472035
8    -0.013960
10   -0.362543
12   -0.006154
14   -0.923061
16    0.895717
18    0.805244
Length: 10, dtype: float64

In [5]: s[0]
Out[5]: -1.2945235902555294

In [6]: s[2]
Out[6]: 0.41373810535784006

In [7]: s[4]
Out[7]: 0.2766617129497566

Это полностью идентично поведению до изменений. Однако, если вы запросите ключ не содержащиеся в Series, в версиях 0.6.1 и ранее, Series бы возвращаться к при поиске на основе местоположения. Теперь это вызывает KeyError:

In [2]: s[1]
KeyError: 1

Это изменение также имеет такое же влияние на DataFrame:

In [3]: df = pd.DataFrame(np.random.randn(8, 4), index=range(0, 16, 2))

In [4]: df
    0        1       2       3
0   0.88427  0.3363 -0.1787  0.03162
2   0.14451 -0.1415  0.2504  0.58374
4  -1.44779 -0.9186 -1.4996  0.27163
6  -0.26598 -2.4184 -0.2658  0.11503
8  -0.58776  0.3144 -0.8566  0.61941
10  0.10940 -0.7175 -1.0108  0.47990
12 -1.16919 -0.3087 -0.6049 -0.43544
14 -0.07337  0.3410  0.0424 -0.16037

In [5]: df.ix[3]
KeyError: 3

Для поддержки индексации, основанной исключительно на целых числах, были добавлены следующие методы:

Метод

Описание

Series.iget_value(i)

Получить значение, хранящееся в местоположении i

Series.iget(i)

Псевдоним для iget_value

DataFrame.irow(i)

Получить i-я строка

DataFrame.icol(j)

Получить j-й столбец

DataFrame.iget_value(i, j)

Извлечь значение в строке i и столбец j

Настройки API, касающиеся среза по меткам#

Срез на основе меток с использованием ix теперь требует, чтобы индекс был отсортирован (монотонным) если только оба начальная и конечная точки содержатся в индексе:

In [1]: s = pd.Series(np.random.randn(6), index=list('gmkaec'))

In [2]: s
Out[2]:
g   -1.182230
m   -0.276183
k   -0.243550
a    1.628992
e    0.073308
c   -0.539890
dtype: float64

Тогда это допустимо:

In [3]: s.ix['k':'e']
Out[3]:
k   -0.243550
a    1.628992
e    0.073308
dtype: float64

Но это не так:

In [12]: s.ix['b':'h']
KeyError 'b'

Если бы индекс был отсортирован, «выбор диапазона» был бы возможен:

In [4]: s2 = s.sort_index()

In [5]: s2
Out[5]:
a    1.628992
c   -0.539890
e    0.073308
g   -1.182230
k   -0.243550
m   -0.276183
dtype: float64

In [6]: s2.ix['b':'h']
Out[6]:
c   -0.539890
e    0.073308
g   -1.182230
dtype: float64

Изменения в Series [] operator#

В качестве нотационного удобства, вы можете передать последовательность меток или срез меток в Series при получении и установке значений через [] (т.е. __getitem__ и __setitem__ методы). Поведение будет таким же, как при передаче аналогичного ввода в ix за исключением случая целочисленного индексирования:

In [8]: s = pd.Series(np.random.randn(6), index=list('acegkm'))

In [9]: s
Out[9]:
a   -1.206412
c    2.565646
e    1.431256
g    1.340309
k   -1.170299
m   -0.226169
Length: 6, dtype: float64

In [10]: s[['m', 'a', 'c', 'e']]
Out[10]:
m   -0.226169
a   -1.206412
c    2.565646
e    1.431256
Length: 4, dtype: float64

In [11]: s['b':'l']
Out[11]:
c    2.565646
e    1.431256
g    1.340309
k   -1.170299
Length: 4, dtype: float64

In [12]: s['c':'k']
Out[12]:
c    2.565646
e    1.431256
g    1.340309
k   -1.170299
Length: 4, dtype: float64

В случае целочисленных индексов поведение будет точно таким же, как и раньше (затенение ndarray):

In [13]: s = pd.Series(np.random.randn(6), index=range(0, 12, 2))

In [14]: s[[4, 0, 2]]
Out[14]:
4    0.132003
0    0.410835
2    0.813850
Length: 3, dtype: float64

In [15]: s[1:5]
Out[15]:
2    0.813850
4    0.132003
6   -0.827317
8   -0.076467
Length: 4, dtype: float64

Если вы хотите выполнять индексацию с последовательностями и срезы на целочисленном индексе с семантикой меток, используйте ix.

Другие изменения API#

  • Устаревший LongPanel класс был полностью удален

  • Если Series.sort вызывается на столбце DataFrame, теперь будет вызываться исключение. Ранее можно было случайно изменить столбец DataFrame, выполнив df[col].sort() вместо метода без побочных эффектов df[col].order() (GH 316)

  • Различные переименования и устаревания, которые (безвредно) вызовут FutureWarning

  • drop добавлен как необязательный параметр в DataFrame.reset_index (GH 699)

Улучшения производительности#

  • Сайтонизированные агрегации GroupBy больше не предварительно сортируют данные, достигая значительного ускорения (GH 93). Групповые агрегации с функциями Python значительно ускорены за счет умного манипулирования типом данных ndarray в Cython (GH 496).

  • Улучшенное сообщение об ошибке в конструкторе DataFrame, когда переданные метки столбцов не соответствуют данным (GH 497)

  • Значительно улучшена производительность многогрупповой агрегации, когда передается функция Python, повторное использование объекта ndarray в Cython (GH 496)

  • Может хранить объекты, индексированные кортежами и числами с плавающей точкой, в HDFStore (GH 492)

  • Не печатать длину по умолчанию в Series.to_string, добавить length опция (GH 489)

  • Улучшение кода Cython для многократного группирования для агрегации без необходимости сортировки данных (GH 93)

  • Улучшить скорость переиндексации MultiIndex, сохраняя кортежи в MultiIndex, проверить обратную совместимость распаковки

  • Улучшение производительности переиндексации столбцов с использованием специализированной функции take на Cython

  • Дальнейшая оптимизация производительности Series.__getitem__ для стандартных случаев использования

  • Избегать создания словаря индекса в некоторых случаях (например, при получении срезов и т.д.), регрессия по сравнению с предыдущими версиями

  • Более дружелюбное сообщение об ошибке в setup.py, если NumPy не установлен

  • Использовать общий набор операций обработки NA (sum, mean и т.д.) в классе Panel также (GH 536)

  • Присвоение имени по умолчанию при вызове reset_index на DataFrame с обычным (неиерархическим) индексом (GH 476)

  • Используйте цитонизированные группировщики, когда возможно, в статистических операциях Series/DataFrame с level переданный параметр (GH 545)

  • Перенос структуры данных skiplist на C для ускорения rolling_median примерно на 5-10 раз в большинстве типичных случаев использования (GH 374)

Участники#

Всего 18 человек внесли патчи в этот релиз. Люди с «+» рядом с именами внесли патч впервые.

  • Adam Klein

  • Bayle Shanks +

  • Chris Billington +

  • Dieter Vandenbussche

  • Фабрицио Полластри +

  • Graham Taylor +

  • Gregg Lind +

  • Josh Klein +

  • Luca Beltrame

  • Olivier Grisel +

  • Skipper Seabold

  • Томас Клуйвер

  • Thomas Wiecki +

  • Wes McKinney

  • Wouter Overmeire

  • Yaroslav Halchenko

  • fabriziop +

  • theandygross +