Версия 0.13.0 (3 января 2014)#

Это крупный релиз по сравнению с версией 0.12.0, включающий ряд изменений API, несколько новых функций и улучшений, а также большое количество исправлений ошибок.

Основные моменты включают:

  • поддержка нового типа индекса Float64Index, и другие улучшения индексирования

  • HDFStore имеет новый строковый синтаксис для спецификации запроса

  • поддержка новых методов интерполяции

  • обновлён timedelta операции

  • новый метод манипуляции строками extract

  • Поддержка наносекунд для Offsets

  • isin для DataFrames

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

  • новый eval/query методы для оценки выражений

  • поддержка для msgpack сериализация

  • интерфейс ввода-вывода к Google BigQuery

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

Предупреждение

В версии 0.13.0 Series был внутренне переработан, чтобы больше не наследовать от ndarray но вместо этого подкласс NDFrame, аналогично остальным контейнерам pandas. Это должно быть прозрачным изменением с очень ограниченными последствиями для API. См. Внутренний рефакторинг

Изменения API#

  • read_excel теперь поддерживает целое число в своем sheetname аргумент, указывающий индекс листа для чтения (GH 4301).

  • Текстовый парсер теперь рассматривает всё, что читается как inf (“inf”, “Inf”, “-Inf”, “iNf” и т.д.), как бесконечность. (GH 4220, GH 4219), влияя на read_table, read_csv, и т.д.

  • pandas теперь совместим с Python 2/3 без необходимости использования 2to3 благодаря @jtratner. В результате pandas теперь более широко использует итераторы. Это также привело к внедрению существенных частей six библиотеку в compat. (GH 4384, GH 4375, GH 4372)

  • pandas.util.compat и pandas.util.py3compat были объединены в pandas.compat. pandas.compat теперь включает множество функций, обеспечивающих совместимость 2/3. Содержит как списковые, так и итераторные версии range, filter, map и zip, а также другие необходимые элементы для совместимости с Python 3. lmap, lzip, lrange и lfilter все производят списки вместо итераторов, для совместимости с numpy, индексирование и pandas конструкторы.(GH 4384, GH 4375, GH 4372)

  • Series.get с отрицательными индексами теперь возвращает то же, что и [] (GH 4390)

  • Изменения в том, как Index и MultiIndex обрабатывать метаданные (levels, labels, и names) (GH 4039):

    # previously, you would have set levels or labels directly
    >>> pd.index.levels = [[1, 2, 3, 4], [1, 2, 4, 4]]
    
    # now, you use the set_levels or set_labels methods
    >>> index = pd.index.set_levels([[1, 2, 3, 4], [1, 2, 4, 4]])
    
    # similarly, for names, you can rename the object
    # but setting names is not deprecated
    >>> index = pd.index.set_names(["bob", "cranberry"])
    
    # and all methods take an inplace kwarg - but return None
    >>> pd.index.set_names(["bob", "cranberry"], inplace=True)
    
  • Все деление с NDFrame объекты теперь истинное деление, независимо от импорта future. Это означает, что операции с объектами pandas по умолчанию будут использовать с плавающей точкой деление и возврат типа данных с плавающей точкой. Вы можете использовать // и floordiv выполнять целочисленное деление.

    Целочисленное деление

    In [3]: arr = np.array([1, 2, 3, 4])
    
    In [4]: arr2 = np.array([5, 3, 2, 1])
    
    In [5]: arr / arr2
    Out[5]: array([0, 0, 1, 4])
    
    In [6]: pd.Series(arr) // pd.Series(arr2)
    Out[6]:
    0    0
    1    0
    2    1
    3    4
    dtype: int64
    

    Истинное деление

    In [7]: pd.Series(arr) / pd.Series(arr2)  # no future import required
    Out[7]:
    0    0.200000
    1    0.666667
    2    1.500000
    3    4.000000
    dtype: float64
    
  • Определить и понизить dtype, если downcast='infer' передаётся в fillna/ffill/bfill (GH 4604)

  • __nonzero__ для всех объектов NDFrame теперь будет вызывать ValueError, это возвращается к (GH 1073, GH 4633) поведение. См. подводные камни для более подробного обсуждения.

    Это предотвращает выполнение логического сравнения на весь объекты pandas, что по своей природе неоднозначно. Все они будут вызывать ValueError.

    >>> df = pd.DataFrame({'A': np.random.randn(10),
    ...                    'B': np.random.randn(10),
    ...                    'C': pd.date_range('20130101', periods=10)
    ...                    })
    ...
    >>> if df:
    ...     pass
    ...
    Traceback (most recent call last):
        ...
    ValueError: The truth value of a DataFrame is ambiguous.  Use a.empty,
    a.bool(), a.item(), a.any() or a.all().
    
    >>> df1 = df
    >>> df2 = df
    >>> df1 and df2
    Traceback (most recent call last):
        ...
    ValueError: The truth value of a DataFrame is ambiguous.  Use a.empty,
    a.bool(), a.item(), a.any() or a.all().
    
    >>> d = [1, 2, 3]
    >>> s1 = pd.Series(d)
    >>> s2 = pd.Series(d)
    >>> s1 and s2
    Traceback (most recent call last):
        ...
    ValueError: The truth value of a DataFrame is ambiguous.  Use a.empty,
    a.bool(), a.item(), a.any() or a.all().
    

    Добавлен .bool() метод для NDFrame объекты для облегчения оценки булевых Series с одним элементом:

    >>> pd.Series([True]).bool()
     True
    >>> pd.Series([False]).bool()
     False
    >>> pd.DataFrame([[True]]).bool()
     True
    >>> pd.DataFrame([[False]]).bool()
     False
    
  • Все не-Index NDFrames (Series, DataFrame, Panel, Panel4D, SparsePanel, и т.д.), теперь поддерживают полный набор арифметических операторов и гибких арифметических методов (add, sub, mul и т.д.). SparsePanel не поддерживает pow или mod с нескалярными значениями. (GH 3765)

  • Series и DataFrame теперь имеют mode() метод для вычисления статистической моды (мод) по оси/Series. (GH 5367)

  • Цепное присваивание теперь по умолчанию будет предупреждать, если пользователь присваивает копии. Это можно изменить с помощью опции mode.chained_assignment, допустимые варианты: raise/warn/None. См. документация.

    In [1]: dfc = pd.DataFrame({'A': ['aaa', 'bbb', 'ccc'], 'B': [1, 2, 3]})
    
    In [2]: pd.set_option('chained_assignment', 'warn')
    

    Следующее предупреждение / исключение будет показано, если это будет предпринято.

    In [3]: dfc.loc[0]['A'] = 1111
    
    Traceback (most recent call last)
       ...
    SettingWithCopyWarning:
       A value is trying to be set on a copy of a slice from a DataFrame.
       Try using .loc[row_index,col_indexer] = value instead
    

    Вот правильный метод присваивания.

    In [4]: dfc.loc[0, 'A'] = 11
    
    In [5]: dfc
    Out[5]: 
         A  B
    0   11  1
    1  bbb  2
    2  ccc  3
    
  • Panel.reindex имеет следующую сигнатуру вызова Panel.reindex(items=None, major_axis=None, minor_axis=None, **kwargs)

    чтобы соответствовать другим NDFrame объектов. См. Внутренний рефакторинг для получения дополнительной информации.

  • Series.argmin и Series.argmax теперь являются псевдонимами для Series.idxmin и Series.idxmax. Они возвращают index из

    минимальный или максимальный элемент соответственно. До версии 0.13.0 они возвращали позицию минимального / максимального элемента. (GH 6214)

Устаревшие функции/изменения в предыдущих версиях#

Это объявленные изменения в версии 0.12 или ранее, которые вступают в силу с версии 0.13.0

  • Удалить устаревшее Factor (GH 3650)

  • Удалить устаревшее set_printoptions/reset_printoptions (GH 3046)

  • Удалить устаревшее _verbose_info (GH 3215)

  • Удалить устаревшее read_clipboard/to_clipboard/ExcelFile/ExcelWriter из pandas.io.parsers (GH 3717) Они доступны как функции в основном пространстве имен pandas (например, pd.read_clipboard)

  • по умолчанию для tupleize_cols теперь False для обоих to_csv и read_csv. Предупреждение в версии 0.12 (GH 3604)

  • по умолчанию для display.max_seq_len теперь 100 вместо None. Это активирует усеченное отображение ("…") длинных последовательностей в различных местах. (GH 3391)

Устаревшие функции#

Устарело в 0.13.0

  • устаревший iterkv, который будет удален в будущем выпуске (это был псевдоним iteritems, использовавшийся для обхода 2to3’s changes). (GH 4384, GH 4375, GH 4372)

  • устарел строковый метод match, чья роль теперь выполняется более идиоматично с помощью extract. В будущем релизе поведение по умолчанию у match изменится, чтобы стать аналогичным contains, который возвращает логический индексатор. (Их различие в строгости: match основывается на re.match в то время как contains основывается на re.search.) В этом выпуске устаревшее поведение является стандартным, но новое поведение доступно через ключевой аргумент as_indexer=True.

Изменения в API индексирования#

До версии 0.13 было невозможно использовать индекс метки (.loc/.ix) для установки значения, которое не содержалось в индексе определенной оси. (GH 2578). См. документация

В Series в этом случае это фактически операция добавления

In [6]: s = pd.Series([1, 2, 3])

In [7]: s
Out[7]: 
0    1
1    2
2    3
dtype: int64

In [8]: s[5] = 5.

In [9]: s
Out[9]: 
0    1.0
1    2.0
2    3.0
5    5.0
dtype: float64
In [10]: dfi = pd.DataFrame(np.arange(6).reshape(3, 2),
   ....:                    columns=['A', 'B'])
   ....: 

In [11]: dfi
Out[11]: 
   A  B
0  0  1
1  2  3
2  4  5

Ранее это могло KeyError

In [12]: dfi.loc[:, 'C'] = dfi.loc[:, 'A']

In [13]: dfi
Out[13]: 
   A  B  C
0  0  1  0
1  2  3  2
2  4  5  4

Это похоже на append операция.

In [14]: dfi.loc[3] = 5

In [15]: dfi
Out[15]: 
   A  B  C
0  0  1  0
1  2  3  2
2  4  5  4
3  5  5  5

Операция установки Panel на произвольной оси выравнивает входные данные к Panel

In [20]: p = pd.Panel(np.arange(16).reshape(2, 4, 2),
   ....:              items=['Item1', 'Item2'],
   ....:              major_axis=pd.date_range('2001/1/12', periods=4),
   ....:              minor_axis=['A', 'B'], dtype='float64')
   ....:

In [21]: p
Out[21]:

Dimensions: 2 (items) x 4 (major_axis) x 2 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2001-01-12 00:00:00 to 2001-01-15 00:00:00
Minor_axis axis: A to B

In [22]: p.loc[:, :, 'C'] = pd.Series([30, 32], index=p.items)

In [23]: p
Out[23]:

Dimensions: 2 (items) x 4 (major_axis) x 3 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2001-01-12 00:00:00 to 2001-01-15 00:00:00
Minor_axis axis: A to C

In [24]: p.loc[:, :, 'C']
Out[24]:
            Item1  Item2
2001-01-12   30.0   32.0
2001-01-13   30.0   32.0
2001-01-14   30.0   32.0
2001-01-15   30.0   32.0

Изменение API Float64Index#

  • Добавлен новый тип индекса, Float64Index. Это будет автоматически создано при передаче значений с плавающей точкой при создании индекса. Это позволяет использовать чисто меточную парадигму срезов, которая делает [],ix,loc для скалярного индексирования и срезов работают точно так же. (GH 263)

    Конструкция по умолчанию предназначена для значений с плавающей точкой.

    In [16]: index = pd.Index([1.5, 2, 3, 4.5, 5])
    
    In [17]: index
    Out[17]: Index([1.5, 2.0, 3.0, 4.5, 5.0], dtype='float64')
    
    In [18]: s = pd.Series(range(5), index=index)
    
    In [19]: s
    Out[19]: 
    1.5    0
    2.0    1
    3.0    2
    4.5    3
    5.0    4
    dtype: int64
    

    Скалярный выбор для [],.ix,.loc всегда будет основано на метках. Целое число будет соответствовать равному индексу с плавающей точкой (например, 3 эквивалентно 3.0)

    In [20]: s[3]
    Out[20]: 2
    
    In [21]: s.loc[3]
    Out[21]: 2
    

    Единственная позиционная индексация осуществляется через iloc

    In [22]: s.iloc[3]
    Out[22]: 3
    

    Не найденный скалярный индекс вызовет исключение KeyError

    Срезы ВСЕГДА применяются к значениям индекса, для [],ix,loc и ВСЕГДА позиционный с iloc

    In [23]: s[2:4]
    Out[23]: 
    2.0    1
    3.0    2
    dtype: int64
    
    In [24]: s.loc[2:4]
    Out[24]: 
    2.0    1
    3.0    2
    dtype: int64
    
    In [25]: s.iloc[2:4]
    Out[25]: 
    3.0    2
    4.5    3
    dtype: int64
    

    В индексах с плавающей точкой разрешено срезы с использованием чисел с плавающей точкой

    In [26]: s[2.1:4.6]
    Out[26]: 
    3.0    2
    4.5    3
    dtype: int64
    
    In [27]: s.loc[2.1:4.6]
    Out[27]: 
    3.0    2
    4.5    3
    dtype: int64
    
  • Индексирование на других типах индексов сохраняется (и позиционный откат для [],ix), за исключением того, что срез с плавающей точкой по индексам на не Float64Index теперь вызовет TypeError.

    In [1]: pd.Series(range(5))[3.5]
    TypeError: the label [3.5] is not a proper indexer for this index type (Int64Index)
    
    In [1]: pd.Series(range(5))[3.5:4.5]
    TypeError: the slice start [3.5] is not a proper indexer for this index type (Int64Index)
    

    Использование скалярного индексатора с плавающей точкой будет устаревшим в будущей версии, но пока разрешено.

    In [3]: pd.Series(range(5))[3.0]
    Out[3]: 3
    

Изменения в API HDFStore#

  • Изменения формата запросов. Теперь поддерживается более строкоподобный формат запросов. См. документация.

    In [28]: path = 'test.h5'
    
    In [29]: dfq = pd.DataFrame(np.random.randn(10, 4),
       ....:                    columns=list('ABCD'),
       ....:                    index=pd.date_range('20130101', periods=10))
       ....: 
    
    In [30]: dfq.to_hdf(path, key='dfq', format='table', data_columns=True)
    

    Используйте логические выражения с встроенной оценкой функций.

    In [31]: pd.read_hdf(path, 'dfq',
       ....:             where="index>Timestamp('20130104') & columns=['A', 'B']")
       ....: 
    Out[31]: 
                       A         B
    2013-01-05 -0.424972  0.567020
    2013-01-06 -0.673690  0.113648
    2013-01-07  0.404705  0.577046
    2013-01-08 -0.370647 -1.157892
    2013-01-09  1.075770 -0.109050
    2013-01-10  0.357021 -0.674600
    

    Используйте встроенную ссылку на столбец

    In [32]: pd.read_hdf(path, 'dfq',
       ....:             where="A>0 or C>0")
       ....: 
    Out[32]: 
                       A         B         C         D
    2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236
    2013-01-04  0.721555 -0.706771 -1.039575  0.271860
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401
    2013-01-07  0.404705  0.577046 -1.715002 -1.039268
    2013-01-09  1.075770 -0.109050  1.643563 -1.469388
    2013-01-10  0.357021 -0.674600 -1.776904 -0.968914
    
  • the format ключевое слово теперь заменяет table ключевое слово; допустимые значения: fixed(f) или table(t) те же значения по умолчанию, что и до версии < 0.13.0, остаются, например, put подразумевает fixed формат и append подразумевает table формат. Этот формат по умолчанию можно установить как опцию, задав io.hdf.default_format.

    In [33]: path = 'test.h5'
    
    In [34]: df = pd.DataFrame(np.random.randn(10, 2))
    
    In [35]: df.to_hdf(path, key='df_table', format='table')
    
    In [36]: df.to_hdf(path, key='df_table2', append=True)
    
    In [37]: df.to_hdf(path, key='df_fixed')
    
    In [38]: with pd.HDFStore(path) as store:
       ....:     print(store)
       ....: 
    
    File path: test.h5
    
  • Значительные улучшения производительности записи таблиц

  • обрабатывать переданный Series в табличном формате (GH 4330)

  • теперь может сериализовать timedelta64[ns] тип данных в таблице (GH 3577), См. документация.

  • добавлен is_open свойство, указывающее, открыт ли базовый файловый дескриптор; закрытое хранилище теперь будет отображать 'CLOSED' при просмотре хранилища (вместо вызова ошибки) (GH 4409)

  • закрытие HDFStore теперь закроет этот экземпляр HDFStore но закроет фактический файл только если счетчик ссылок (по PyTables) относительно всех открытых дескрипторов равны 0. По сути, у вас есть локальный экземпляр HDFStore ссылается на переменную. После закрытия он будет отмечен как закрытый. Другие ссылки (на тот же файл) продолжат работать, пока они сами не будут закрыты. Выполнение действия с закрытым файлом вызовет ClosedFileError

    In [39]: path = 'test.h5'
    
    In [40]: df = pd.DataFrame(np.random.randn(10, 2))
    
    In [41]: store1 = pd.HDFStore(path)
    
    In [42]: store2 = pd.HDFStore(path)
    
    In [43]: store1.append('df', df)
    
    In [44]: store2.append('df2', df)
    
    In [45]: store1
    Out[45]: 
    
    File path: test.h5
    
    In [46]: store2
    Out[46]: 
    
    File path: test.h5
    
    In [47]: store1.close()
    
    In [48]: store2
    Out[48]: 
    
    File path: test.h5
    
    In [49]: store2.close()
    
    In [50]: store2
    Out[50]: 
    
    File path: test.h5
    
  • удалил _quiet атрибут, заменить на DuplicateWarning если извлечение дублирующихся строк из таблицы (GH 4367)

  • удалил warn аргумент из open. Вместо этого PossibleDataLossError будет вызвано исключение, если вы попытаетесь использовать mode='w' с ОТКРЫТЫМ файловым дескриптором (GH 4367)

  • разрешить переданный массив местоположений или маску как where условие (GH 4467). См. документация для примера.

  • добавить ключевое слово dropna=True to append чтобы изменить, записываются ли ВСЕ строки с nan в хранилище (по умолчанию True, ВСЕ строки с nan НЕ записываются), также настраивается через опцию io.hdf.dropna_table (GH 4625)

  • передать аргументы создания хранилища; может использоваться для поддержки хранилищ в памяти

Изменения в представлении DataFrame#

HTML и текстовые представления DataFrame теперь показывать усечённое представление таблицы при превышении определённого размера, вместо переключения на краткий информационный вид (GH 4886, GH 5550). Это делает представление более согласованным по мере увеличения небольших DataFrames.

Truncated HTML representation of a DataFrame

Чтобы получить представление info, вызовите DataFrame.info(). Если вы предпочитаете представление info в качестве repr для больших DataFrame, вы можете установить это, запустив set_option('display.large_repr', 'info').

Улучшения#

  • df.to_clipboard() изучил новый excel ключевое слово, которое позволяет вставлять данные df непосредственно в Excel (включено по умолчанию). (GH 5070).

  • read_html теперь вызывает URLError вместо перехвата и вызова ValueError (GH 4303, GH 4305)

  • Добавлен тест для read_clipboard() и to_clipboard() (GH 4282)

  • Функциональность буфера обмена теперь работает с PySide (GH 4282)

  • Добавлено более информативное сообщение об ошибке, когда аргументы графика содержат перекрывающиеся аргументы цвета и стиля (GH 4402)

  • to_dict теперь принимает records как возможный тип вывода. Возвращает массив словарей с ключами-столбцами. (GH 4936)

  • NaN передача в get_dummies (GH 4446) с dummy_na

    # previously, nan was erroneously counted as 2 here
    # now it is not counted at all
    In [51]: pd.get_dummies([1, 2, np.nan])
    Out[51]: 
         1.0    2.0
    0   True  False
    1  False   True
    2  False  False
    
    # unless requested
    In [52]: pd.get_dummies([1, 2, np.nan], dummy_na=True)
    Out[52]: 
         1.0    2.0    NaN
    0   True  False  False
    1  False   True  False
    2  False  False   True
    
  • timedelta64[ns] операции. См. документация.

    Предупреждение

    Большинство этих операций требуют numpy >= 1.7

    Используя новый верхнеуровневый to_timedelta, вы можете преобразовать скаляр или массив из стандартного формата timedelta (созданного to_csv) в тип timedelta (np.timedelta64 в nanoseconds).

    In [53]: pd.to_timedelta('1 days 06:05:01.00003')
    Out[53]: Timedelta('1 days 06:05:01.000030')
    
    In [54]: pd.to_timedelta('15.5us')
    Out[54]: Timedelta('0 days 00:00:00.000015500')
    
    In [55]: pd.to_timedelta(['1 days 06:05:01.00003', '15.5us', 'nan'])
    Out[55]: TimedeltaIndex(['1 days 06:05:01.000030', '0 days 00:00:00.000015500', NaT], dtype='timedelta64[ns]', freq=None)
    
    In [56]: pd.to_timedelta(np.arange(5), unit='s')
    Out[56]: 
    TimedeltaIndex(['0 days 00:00:00', '0 days 00:00:01', '0 days 00:00:02',
                    '0 days 00:00:03', '0 days 00:00:04'],
                   dtype='timedelta64[ns]', freq=None)
    
    In [57]: pd.to_timedelta(np.arange(5), unit='d')
    Out[57]: TimedeltaIndex(['0 days', '1 days', '2 days', '3 days', '4 days'], dtype='timedelta64[ns]', freq=None)
    

    Series типа данных timedelta64[ns] теперь можно разделить на другой timedelta64[ns] объект, или приведённый к типу для получения float64 Series с типом данных. Это преобразование частоты. См. документация для документации.

    In [58]: import datetime
    
    In [59]: td = pd.Series(pd.date_range('20130101', periods=4)) - pd.Series(
       ....:     pd.date_range('20121201', periods=4))
       ....: 
    
    In [60]: td[2] += np.timedelta64(datetime.timedelta(minutes=5, seconds=3))
    
    In [61]: td[3] = np.nan
    
    In [62]: td
    Out[62]: 
    0   31 days 00:00:00
    1   31 days 00:00:00
    2   31 days 00:05:03
    3                NaT
    dtype: timedelta64[ns]
    
    # to days
    In [63]: td / np.timedelta64(1, 'D')
    Out[63]:
    0    31.000000
    1    31.000000
    2    31.003507
    3          NaN
    dtype: float64
    
    In [64]: td.astype('timedelta64[D]')
    Out[64]:
    0    31.0
    1    31.0
    2    31.0
    3     NaN
    dtype: float64
    
    # to seconds
    In [65]: td / np.timedelta64(1, 's')
    Out[65]:
    0    2678400.0
    1    2678400.0
    2    2678703.0
    3          NaN
    dtype: float64
    
    In [66]: td.astype('timedelta64[s]')
    Out[66]:
    0    2678400.0
    1    2678400.0
    2    2678703.0
    3          NaN
    dtype: float64
    

    Деление или умножение timedelta64[ns] Series на целое число или целочисленный Series

    In [63]: td * -1
    Out[63]: 
    0   -31 days +00:00:00
    1   -31 days +00:00:00
    2   -32 days +23:54:57
    3                  NaT
    dtype: timedelta64[ns]
    
    In [64]: td * pd.Series([1, 2, 3, 4])
    Out[64]: 
    0   31 days 00:00:00
    1   62 days 00:00:00
    2   93 days 00:15:09
    3                NaT
    dtype: timedelta64[ns]
    

    Абсолютное DateOffset объекты могут действовать аналогично timedeltas

    In [65]: from pandas import offsets
    
    In [66]: td + offsets.Minute(5) + offsets.Milli(5)
    Out[66]: 
    0   31 days 00:05:00.005000
    1   31 days 00:05:00.005000
    2   31 days 00:10:03.005000
    3                       NaT
    dtype: timedelta64[ns]
    

    Fillna теперь поддерживается для временных интервалов

    In [67]: td.fillna(pd.Timedelta(0))
    Out[67]: 
    0   31 days 00:00:00
    1   31 days 00:00:00
    2   31 days 00:05:03
    3    0 days 00:00:00
    dtype: timedelta64[ns]
    
    In [68]: td.fillna(datetime.timedelta(days=1, seconds=5))
    Out[68]: 
    0   31 days 00:00:00
    1   31 days 00:00:00
    2   31 days 00:05:03
    3    1 days 00:00:05
    dtype: timedelta64[ns]
    

    Вы можете выполнять числовые операции сокращения над timedeltas.

    In [69]: td.mean()
    Out[69]: Timedelta('31 days 00:01:41')
    
    In [70]: td.quantile(.1)
    Out[70]: Timedelta('31 days 00:00:00')
    
  • plot(kind='kde') теперь принимает необязательные параметры bw_method и ind, переданные в scipy.stats.gaussian_kde() (для scipy >= 0.11.0) для установки полосы пропускания, и в gkde.evaluate() для указания индексов, по которым она оценивается, соответственно. См. документацию scipy. (GH 4298)

  • Конструктор DataFrame теперь принимает маскированный записной массив numpy (GH 3478)

  • Новый векторизованный строковый метод extract возвращает совпадения регулярных выражений более удобно.

    In [71]: pd.Series(['a1', 'b2', 'c3']).str.extract('[ab](\\d)')
    Out[71]: 
         0
    0    1
    1    2
    2  NaN
    

    Элементы, которые не совпадают, возвращают NaN. Извлечение регулярного выражения с более чем одной группой возвращает DataFrame с одним столбцом на группу.

    In [72]: pd.Series(['a1', 'b2', 'c3']).str.extract('([ab])(\\d)')
    Out[72]: 
         0    1
    0    a    1
    1    b    2
    2  NaN  NaN
    

    Элементы, которые не совпадают, возвращают строку NaN. Таким образом, Series из неупорядоченных строк может быть преобразовано в похожий по индексу Series или DataFrame очищенных или более полезных строк, без необходимости get() для доступа к кортежам или re.match объекты.

    Именованные группы, такие как

    In [73]: pd.Series(['a1', 'b2', 'c3']).str.extract(
       ....:     '(?P[ab])(?P\\d)')
       ....: 
    Out[73]: 
      letter digit
    0      a     1
    1      b     2
    2    NaN   NaN
    

    и необязательные группы также могут использоваться.

    In [74]: pd.Series(['a1', 'b2', '3']).str.extract(
       ....:      '(?P[ab])?(?P\\d)')
       ....: 
    Out[74]: 
      letter digit
    0      a     1
    1      b     2
    2    NaN     3
    
  • read_stata теперь принимает формат Stata 13 (GH 4291)

  • read_fwf теперь выводит спецификации столбцов из первых 100 строк файла, если данные имеют правильно разделенные и выровненные столбцы с использованием разделителя, предоставленного функции (GH 4488).

  • поддержка наносекундных времен как смещения

    Предупреждение

    Эти операции требуют numpy >= 1.7

    Преобразования периодов в диапазоне секунд и ниже были переработаны и расширены до наносекунд. Теперь доступны периоды в наносекундном диапазоне.

    In [79]: pd.date_range('2013-01-01', periods=5, freq='5N')
    Out[79]:
    DatetimeIndex([          '2013-01-01 00:00:00',
                   '2013-01-01 00:00:00.000000005',
                   '2013-01-01 00:00:00.000000010',
                   '2013-01-01 00:00:00.000000015',
                   '2013-01-01 00:00:00.000000020'],
                  dtype='datetime64[ns]', freq='5N')
    

    или с частотой как смещение

    In [75]: pd.date_range('2013-01-01', periods=5, freq=pd.offsets.Nano(5))
    Out[75]: 
    DatetimeIndex([          '2013-01-01 00:00:00',
                   '2013-01-01 00:00:00.000000005',
                   '2013-01-01 00:00:00.000000010',
                   '2013-01-01 00:00:00.000000015',
                   '2013-01-01 00:00:00.000000020'],
                  dtype='datetime64[ns]', freq='5ns')
    

    Метки времени могут быть изменены в наносекундном диапазоне

    In [76]: t = pd.Timestamp('20130101 09:01:02')
    
    In [77]: t + pd.tseries.offsets.Nano(123)
    Out[77]: Timestamp('2013-01-01 09:01:02.000000123')
    
  • Новый метод, isin для DataFrames, что хорошо сочетается с булевым индексированием. Аргумент для isin, с чем мы сравниваем DataFrame, может быть DataFrame, Series, dict или массив значений. См. документация подробнее.

    Чтобы получить строки, где выполнено любое из условий:

    In [78]: dfi = pd.DataFrame({'A': [1, 2, 3, 4], 'B': ['a', 'b', 'f', 'n']})
    
    In [79]: dfi
    Out[79]: 
       A  B
    0  1  a
    1  2  b
    2  3  f
    3  4  n
    
    In [80]: other = pd.DataFrame({'A': [1, 3, 3, 7], 'B': ['e', 'f', 'f', 'e']})
    
    In [81]: mask = dfi.isin(other)
    
    In [82]: mask
    Out[82]: 
           A      B
    0   True  False
    1  False  False
    2   True   True
    3  False  False
    
    In [83]: dfi[mask.any(axis=1)]
    Out[83]: 
       A  B
    0  1  a
    2  3  f
    
  • Series теперь поддерживает to_frame метод для преобразования в DataFrame с одним столбцом (GH 5164)

  • Все наборы данных R, перечисленные здесь http://stat.ethz.ch/R-manual/R-devel/library/datasets/html/00Index.html теперь можно загружать в объекты pandas

    # note that pandas.rpy was deprecated in v0.16.0
    import pandas.rpy.common as com
    com.load_data('Titanic')
    
  • tz_localize может определить переход на летнее время на основе структуры нелокализованных данных (GH 4230), см. документация

  • DatetimeIndex теперь находится в документации API, см. документация

  • json_normalize() это новый метод, позволяющий создавать плоскую таблицу из полуструктурированных JSON-данных. См. документация (GH 1067)

  • Добавлена поддержка PySide для qtpandas DataFrameModel и DataFrameWidget.

  • Парсер CSV Python теперь поддерживает usecols (GH 4335)

  • Частоты получили несколько новых смещений:

  • DataFrame имеет новый interpolate метод, аналогичный Series (GH 4434, GH 1892)

    In [84]: df = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6, 6.8],
       ....:                   'B': [.25, np.nan, np.nan, 4, 12.2, 14.4]})
       ....: 
    
    In [85]: df.interpolate()
    Out[85]: 
         A      B
    0  1.0   0.25
    1  2.1   1.50
    2  3.4   2.75
    3  4.7   4.00
    4  5.6  12.20
    5  6.8  14.40
    

    Кроме того, method аргумент для interpolate был расширен чтобы включить 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'krogh', 'piecewise_polynomial', 'pchip', 'polynomial', 'spline' Новые методы требуют scipy. Обратитесь к справочнику Scipy руководство и документация для получения дополнительной информации о том, когда различные методы уместны. См. документация.

    Interpolate теперь также принимает limit аргумент ключевого слова. Это работает аналогично fillnaограничение:

    In [86]: ser = pd.Series([1, 3, np.nan, np.nan, np.nan, 11])
    
    In [87]: ser.interpolate(limit=2)
    Out[87]: 
    0     1.0
    1     3.0
    2     5.0
    3     7.0
    4     NaN
    5    11.0
    dtype: float64
    
  • Добавлен wide_to_long удобная функция для панельных данных. См. документация.

    In [88]: np.random.seed(123)
    
    In [89]: df = pd.DataFrame({"A1970" : {0 : "a", 1 : "b", 2 : "c"},
       ....:                    "A1980" : {0 : "d", 1 : "e", 2 : "f"},
       ....:                    "B1970" : {0 : 2.5, 1 : 1.2, 2 : .7},
       ....:                    "B1980" : {0 : 3.2, 1 : 1.3, 2 : .1},
       ....:                    "X"     : dict(zip(range(3), np.random.randn(3)))
       ....:                   })
       ....: 
    
    In [90]: df["id"] = df.index
    
    In [91]: df
    Out[91]: 
      A1970 A1980  B1970  B1980         X  id
    0     a     d    2.5    3.2 -1.085631   0
    1     b     e    1.2    1.3  0.997345   1
    2     c     f    0.7    0.1  0.282978   2
    
    In [92]: pd.wide_to_long(df, ["A", "B"], i="id", j="year")
    Out[92]: 
                    X  A    B
    id year                  
    0  1970 -1.085631  a  2.5
    1  1970  0.997345  b  1.2
    2  1970  0.282978  c  0.7
    0  1980 -1.085631  d  3.2
    1  1980  0.997345  e  1.3
    2  1980  0.282978  f  0.1
    
  • to_csv теперь принимает date_format ключевой аргумент, который определяет, как должны форматироваться выходные объекты datetime. Форматирование будет применено ко всем объектам datetime, встречающимся в индексе, столбцах и значениях. (GH 4313)

  • DataFrame.plot будет строить диаграмму рассеяния x против y, передавая kind='scatter' (GH 2215)

  • Добавлена поддержка идентификаторов сегментов Google Analytics v3 API, которая также поддерживает идентификаторы v2. (GH 5271)

Экспериментальный#

  • Новый eval() функция реализует вычисление выражений с использованием numexpr за кулисами. Это приводит к значительному ускорению для сложных выражений, включающих большие DataFrames/Series. Например,

    In [93]: nrows, ncols = 20000, 100
    
    In [94]: df1, df2, df3, df4 = [pd.DataFrame(np.random.randn(nrows, ncols))
       ....:                       for _ in range(4)]
       ....: 
    
    # eval with NumExpr backend
    In [95]: %timeit pd.eval('df1 + df2 + df3 + df4')
    7.71 ms +- 273 us per loop (mean +- std. dev. of 7 runs, 100 loops each)
    
    # pure Python evaluation
    In [96]: %timeit df1 + df2 + df3 + df4
    7.19 ms +- 306 us per loop (mean +- std. dev. of 7 runs, 100 loops each)
    

    Для получения дополнительной информации см. документация

  • Аналогично pandas.eval, DataFrame имеет новый DataFrame.eval метод, который вычисляет выражение в контексте DataFrame. Например,

    In [97]: df = pd.DataFrame(np.random.randn(10, 2), columns=['a', 'b'])
    
    In [98]: df.eval('a + b')
    Out[98]: 
    0   -0.685204
    1    1.589745
    2    0.325441
    3   -1.784153
    4   -0.432893
    5    0.171850
    6    1.895919
    7    3.065587
    8   -0.092759
    9    1.391365
    dtype: float64
    
  • query() метод был добавлен, что позволяет выбирать элементы DataFrame используя естественный синтаксис запросов, почти идентичный синтаксису Python. Например,

    In [99]: n = 20
    
    In [100]: df = pd.DataFrame(np.random.randint(n, size=(n, 3)), columns=['a', 'b', 'c'])
    
    In [101]: df.query('a < b < c')
    Out[101]: 
        a   b   c
    11  1   5   8
    15  8  16  19
    

    выбирает все строки df где a < b < c вычисляется как True. Для получения дополнительных сведений см. документация.

  • pd.read_msgpack() и pd.to_msgpack() теперь являются поддерживаемым методом сериализации произвольных объектов pandas (и Python) в лёгкий переносимый двоичный формат. См. документация

    Предупреждение

    Поскольку это ЭКСПЕРИМЕНТАЛЬНАЯ БИБЛИОТЕКА, формат хранения может быть нестабильным до будущего выпуска.

    df = pd.DataFrame(np.random.rand(5, 2), columns=list('AB'))
    df.to_msgpack('foo.msg')
    pd.read_msgpack('foo.msg')
    
    s = pd.Series(np.random.rand(5), index=pd.date_range('20130101', periods=5))
    pd.to_msgpack('foo.msg', df, s)
    pd.read_msgpack('foo.msg')
    

    Вы можете передать iterator=True в итератор по распакованным результатам

    for o in pd.read_msgpack('foo.msg', iterator=True):
        print(o)
    
  • pandas.io.gbq предоставляет простой способ извлечения данных из и загрузки данных в наборы данных Google BigQuery с помощью pandas DataFrames. BigQuery — это высокопроизводительный сервис базы данных, похожий на SQL, полезный для выполнения специальных запросов к чрезвычайно большим наборам данных. См. документацию

    from pandas.io import gbq
    
    # A query to select the average monthly temperatures in the
    # in the year 2000 across the USA. The dataset,
    # publicata:samples.gsod, is available on all BigQuery accounts,
    # and is based on NOAA gsod data.
    
    query = """SELECT station_number as STATION,
    month as MONTH, AVG(mean_temp) as MEAN_TEMP
    FROM publicdata:samples.gsod
    WHERE YEAR = 2000
    GROUP BY STATION, MONTH
    ORDER BY STATION, MONTH ASC"""
    
    # Fetch the result set for this query
    
    # Your Google BigQuery Project ID
    # To find this, see your dashboard:
    # https://console.developers.google.com/iam-admin/projects?authuser=0
    projectid = 'xxxxxxxxx'
    df = gbq.read_gbq(query, project_id=projectid)
    
    # Use pandas to process and reshape the dataset
    
    df2 = df.pivot(index='STATION', columns='MONTH', values='MEAN_TEMP')
    df3 = pd.concat([df2.min(), df2.mean(), df2.max()],
                    axis=1, keys=["Min Tem", "Mean Temp", "Max Temp"])
    

    Результирующий DataFrame:

    > df3
                Min Tem  Mean Temp    Max Temp
     MONTH
     1     -53.336667  39.827892   89.770968
     2     -49.837500  43.685219   93.437932
     3     -77.926087  48.708355   96.099998
     4     -82.892858  55.070087   97.317240
     5     -92.378261  61.428117  102.042856
     6     -77.703334  65.858888  102.900000
     7     -87.821428  68.169663  106.510714
     8     -89.431999  68.614215  105.500000
     9     -86.611112  63.436935  107.142856
     10    -78.209677  56.880838   92.103333
     11    -50.125000  48.861228   94.996428
     12    -50.332258  42.286879   94.396774
    

    Предупреждение

    Для использования этого модуля вам понадобится аккаунт BigQuery. См. <https://cloud.google.com/products/big-query> для подробностей.

    По состоянию на 10/10/13, в API Google есть ошибка, не позволяющая наборам результатов превышать 100 000 строк. Исправление запланировано на неделю 10/14/13.

Внутренний рефакторинг#

В версии 0.13.0 проведён крупный рефакторинг, в основном для создания подкласса Series из NDFrame, который в настоящее время является базовым классом для DataFrame и Panel, чтобы унифицировать методы и поведение. Series ранее наследовались напрямую от ndarray. (GH 4080, GH 3862, GH 816)

Предупреждение

Есть две потенциальные несовместимости с версией < 0.13.0

  • Использование некоторых функций numpy ранее возвращало Series если передан Series в качестве аргумента. Это, кажется, влияет только на np.ones_like, np.empty_like, np.diff и np.where. Теперь они возвращают ndarrays.

    In [102]: s = pd.Series([1, 2, 3, 4])
    

    Использование Numpy

    In [103]: np.ones_like(s)
    Out[103]: array([1, 1, 1, 1])
    
    In [104]: np.diff(s)
    Out[104]: array([1, 1, 1])
    
    In [105]: np.where(s > 1, s, np.nan)
    Out[105]: array([nan,  2.,  3.,  4.])
    

    Идиоматическое использование pandas

    In [106]: pd.Series(1, index=s.index)
    Out[106]: 
    0    1
    1    1
    2    1
    3    1
    dtype: int64
    
    In [107]: s.diff()
    Out[107]: 
    0    NaN
    1    1.0
    2    1.0
    3    1.0
    dtype: float64
    
    In [108]: s.where(s > 1)
    Out[108]: 
    0    NaN
    1    2.0
    2    3.0
    3    4.0
    dtype: float64
    
  • Передача Series непосредственно в функцию cython, ожидающую ndarray тип больше не будет работать напрямую, вы должны передать Series.values, См. Улучшение производительности

  • Series(0.5) ранее возвращал скаляр 0.5, вместо этого вернется 1-элементный Series

  • Это изменение нарушает rpy2<=2.3.8. Была открыта проблема против rpy2, и обходное решение подробно описано в GH 5698. Спасибо @JanSchulz.

  • Совместимость с pickle сохраняется для pickle, созданных до версии 0.13. Они должны быть распакованы с помощью pd.read_pickle, см. Сериализация (Pickling).

  • Рефакторинг series.py/frame.py/panel.py для перемещения общего кода в generic.py

    • добавлен _setup_axes для создания общих структур NDFrame

    • перемещенные методы

      • from_axes,_wrap_array,axes,ix,loc,iloc,shape,empty,swapaxes,transpose,pop

      • __iter__,keys,__contains__,__len__,__neg__,__invert__

      • convert_objects,as_blocks,as_matrix,values

      • __getstate__,__setstate__ (совместимость остаётся в frame/panel)

      • __getattr__,__setattr__

      • _indexed_same,reindex_like,align,where,mask

      • fillna,replace (Series теперь согласован с DataFrame)

      • filter (также добавлен аргумент axis для выборочной фильтрации по другой оси)

      • reindex,reindex_axis,take

      • truncate (перемещено, чтобы стать частью NDFrame)

  • Это изменения в API, которые делают Panel более согласованно с DataFrame

    • swapaxes на Panel с теми же указанными осями теперь возвращает копию

    • поддержка доступа к атрибутам для установки

    • filter поддерживает тот же API, что и оригинальный DataFrame filter

  • Reindex, вызванный без аргументов, теперь вернет копию входного объекта

  • TimeSeries теперь является псевдонимом для Series. свойство is_time_series можно использовать для различения (при необходимости)

  • Рефакторинг Sparse объектов для использования BlockManager

    • Создан новый тип блока во внутренней структуре, SparseBlock, который может содержать несколько типов данных и не является консолидируемым. SparseSeries и SparseDataFrame теперь наследуют больше методов из своей иерархии (Series/DataFrame) и больше не наследуют от SparseArray (который вместо этого является объектом SparseBlock)

    • Набор Sparse теперь поддерживает интеграцию с неразреженными данными. Не-вещественные разреженные данные поддерживаются (частично реализовано)

    • Операции над разреженными структурами внутри DataFrame должны сохранять разреженность, операции слияния типов преобразуют в плотные (и обратно в разреженные), поэтому могут быть несколько неэффективными

    • включить setitem на SparseSeries для boolean/integer/slices

    • SparsePanels реализация не изменена (например, не использует BlockManager, требует доработки)

  • добавлен ftypes метод для Series/DataFrame, аналогичный dtypes, но указывает, является ли базовый объект разреженным/плотным (а также тип данных)

  • Все NDFrame объекты теперь могут использовать __finalize__() для указания различных значений, передаваемых новым объектам из существующего (например, name в Series теперь будет следовать более автоматически)

  • Внутренняя проверка типов теперь выполняется с помощью набора сгенерированных классов, позволяя isinstance(value, klass) без необходимости напрямую импортировать класс, благодаря @jtratner

  • Ошибка в обновлении Series, когда родительский фрейм не обновляет свой кэш на основе изменений (GH 4080) или типов (GH 3217), fillna (GH 3386)

  • Исправлено индексирование с преобразованием типов данных (GH 4463, GH 4204)

  • Рефакторинг Series.reindex в core/generic.py (GH 4604, GH 4618), разрешить method= при переиндексации в Series для работы

  • Series.copy больше не принимает order параметр и теперь согласован с NDFrame copy

  • Рефакторинг rename методы в core/generic.py; исправления Series.rename для (GH 4605), и добавляет rename с той же сигнатурой для Panel

  • Рефакторинг clip методы в core/generic.py (GH 4798)

  • Рефакторинг _get_numeric_data/_get_bool_data в core/generic.py, позволяя функциональность Series/Panel

  • Series (для индекса) / Panel (для элементов) теперь разрешают доступ к элементам через атрибуты (GH 1903)

    In [109]: s = pd.Series([1, 2, 3], index=list('abc'))
    
    In [110]: s.b
    Out[110]: 2
    
    In [111]: s.a = 5
    
    In [112]: s
    Out[112]: 
    a    5
    b    2
    c    3
    dtype: int64
    

Исправления ошибок#

  • HDFStore

    • вызов недопустимого TypeError вместо ValueError при добавлении с другим порядком блоков (GH 4096)

    • read_hdf не учитывался как переданный mode (GH 4504)

    • добавление таблицы нулевой длины будет работать корректно (GH 4273)

    • to_hdf вызывал ошибку при передаче обоих аргументов append и table (GH 4584)

    • чтение из хранилища с дублирующимися столбцами разных типов данных вызывало ошибку (GH 4767)

    • Исправлена ошибка, где ValueError неправильно вызывалось, когда имена столбцов не были строками (GH 4956)

    • Серия нулевой длины, записанная в формате Fixed, неправильно десериализуется. (GH 4708)

    • Исправлена проблема с производительностью декодирования на pyt3 (GH 5441)

    • Проверить уровни в MultiIndex перед сохранением (GH 5527)

    • Корректно обрабатывать data_columns с Panel (GH 5717)

  • Исправлена ошибка в tslib.tz_convert(vals, tz1, tz2): она могла вызывать исключение IndexError при попытке доступа к trans[pos + 1] (GH 4496)

  • The by аргумент теперь корректно работает с layout аргумент (GH 4102, GH 4014) в *.hist методы построения графиков

  • Исправлена ошибка в PeriodIndex.map где использование str вернет строковое представление индекса (GH 4136)

  • Исправлен сбой теста test_time_series_plot_color_with_empty_kwargs при использовании пользовательских цветов по умолчанию matplotlib (GH 4345)

  • Исправление запуска тестов ввода-вывода Stata. Теперь используются временные файлы для записи (GH 4353)

  • Исправлена проблема, где DataFrame.sum был медленнее, чем DataFrame.mean для целочисленных фреймов (GH 4365)

  • read_html тесты теперь работают с Python 2.6 (GH 4351)

  • Исправлена ошибка, где network тестирование выдавало NameError потому что локальная переменная была не определена (GH 4381)

  • В to_json, вызывает ошибку, если передан orient приведёт к потере данных из-за дублирующегося индекса (GH 4359)

  • В to_json, исправлена обработка дат, чтобы миллисекунды были временной меткой по умолчанию, как указано в документации (GH 4362).

  • as_index больше не игнорируется при выполнении groupby apply (GH 4648, GH 3417)

  • Исправлена обработка JSON NaT, NaT теперь сериализуются в null (GH 4498)

  • Исправлена обработка JSON экранируемых символов в ключах JSON-объектов (GH 4593)

  • Исправлена передача keep_default_na=False когда na_values=None (GH 4318)

  • Исправлена ошибка с values вызывая ошибку в DataFrame с дублирующимися столбцами и смешанными типами данных, обнаруженную в (GH 4377)

  • Исправлена ошибка с дублирующимися столбцами и преобразованием типов в read_json когда orient='split' (GH 4377)

  • Исправлена ошибка JSON, где локали с разделителями десятичных знаков, отличными от ‘.’, вызывали исключения при кодировании / декодировании определенных значений. (GH 4918)

  • Исправление .iat индексирование с помощью PeriodIndex (GH 4390)

  • Исправлена проблема, где PeriodIndex объединение с самим собой возвращало новый экземпляр вместо того же экземпляра (GH 4379); также добавляет тест для этого для других типов индексов

  • Исправлена ошибка, при которой все типы данных преобразовывались в object при использовании CSV cparser с параметром usecols (GH 3192)

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

  • Исправлена проблема, при которой гистограммы на подграфиках перезаписывались при их вызове с использованием API верхнего уровня matplotlib (GH 4408)

  • при попытке доступа к отсутствующему атрибуту ( Series.astype(str) обрезал строку (GH 4405, GH 4437)

  • Исправлена проблема совместимости с py3, где байты представлялись как кортежи (GH 4455)

  • Исправлен конфликт именования атрибутов Panel, если элемент назван 'a' (GH 3440)

  • Исправлена проблема, когда дублирующиеся индексы вызывали ошибку при построении графиков (GH 4486)

  • Исправлена проблема, где cumsum и cumprod не работали с булевыми типами данных (GH 4170, GH 4440)

  • Исправлена проблема срезов панелей в xs который возвращал некорректный затемненный объект (GH 4016)

  • Исправлена ошибка ресемплинга, когда пользовательская функция редукции не использовалась, если только одна группа (GH 3849, GH 4494)

  • Исправлено назначение панели с транспонированным фреймом (GH 3830)

  • Вызвать исключение при индексировании с помощью Panel и Panel в качестве значения, которое требует выравнивания (GH 3777)

  • объекты frozenset теперь вызывают ошибку в Series конструктор (GH 4482, GH 4480)

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

  • Исправлена ошибка в DataFrame.set_values что приводило к потере атрибутов имени при расширении индекса. (GH 3742, GH 4039)

  • Исправлена проблема, когда отдельные names, levels и labels может быть установлен на MultiIndex без проверки (pandas.tseries.offsets.CustomBusinessMonthEnd, GH 4039)

  • Исправлено (GH 3334) в pivot_table. Поля итогов не вычислялись, если значения являются индексом.

  • Исправление ошибки при наличии правой части np.timedelta64 или np.offsets.DateOffset при работе с датами и временем (GH 4532)

  • Исправление арифметики с series/datetimeindex и np.timedelta64 не работает так же (GH 4134) и ошибочный timedelta в NumPy 1.6 (GH 4135)

  • Исправлена ошибка в pd.read_clipboard на windows с PY3 (GH 4561); не декодируется правильно

  • tslib.get_period_field() и tslib.get_period_field_arr() теперь вызывает исключение если аргумент кода вне диапазона (GH 4519, GH 4520)

  • Исправлено: булева индексация на пустой серии теряет имена индексов (GH 4235), функция infer_dtype работает с пустыми массивами.

  • Исправление переиндексации с несколькими осями; если совпадение осей не заменяло текущие оси, что приводило к возможной проблеме ленивого вывода частоты (GH 3317)

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

  • Исправлен выбор с ix/loc и селекторы non_unique (GH 4619)

  • Исправлено присваивание с iloc/loc, связанное с изменением типа данных в существующем столбце (GH 4312, GH 5702) имеют внутренний setitem_with_indexer в core/indexing для использования Block.setitem

  • Исправлена ошибка, при которой оператор тысяч не обрабатывался корректно для чисел с плавающей точкой при импорте csv (GH 4322)

  • Исправлена проблема с CacheableOffset, который неправильно использовался многими DateOffset; это мешало кэшированию DateOffset (GH 4609)

  • Исправлено логическое сравнение с DataFrame слева и списком/кортежем справа (GH 4576)

  • Исправлена ошибка/преобразование типа данных при setitem для None на Series/DataFrame (GH 4667)

  • Исправлено декодирование на основе переданной нестандартной кодировки в pd.read_stata (GH 4626)

  • Исправление DataFrame.from_records с простым ndarray. (GH 4727)

  • Исправлены некоторые несоответствия с Index.rename и MultiIndex.rename, и т.д. (GH 4718, GH 4628)

  • Ошибка при использовании iloc/loc с перекрёстными и дублирующимися индексами (GH 4726)

  • Ошибка при использовании QUOTE_NONE с to_csv вызывая Exception. (GH 4328)

  • Ошибка с индексацией Series, не вызывающая ошибку, когда правая часть имеет неправильную длину (GH 2702)

  • Ошибка в MultiIndexing с частичным строковым выбором как частью MultiIndex (GH 4758)

  • Ошибка с переиндексацией по индексу с неуникальным индексом теперь вызовет ValueError (GH 4746)

  • Ошибка при установке с loc/ix один индексатор с осью MultiIndex и массивом NumPy, связанный с (GH 3777)

  • Ошибка в конкатенации с дублирующимися столбцами между разными dtypes, не объединяющимися с axis=0 (GH 4771, GH 4975)

  • Ошибка в iloc при срезе индекса возникает ошибка (GH 4771)

  • Некорректное сообщение об ошибке без colspecs или width в read_fwf. (GH 4774)

  • Исправлены ошибки индексации в Series с дублирующимся индексом (GH 4548, GH 4550)

  • Исправлена ошибка при чтении сжатых файлов с read_fwf в Python 3. (GH 3963)

  • Исправлена проблема с дублирующимся индексом и присваиванием с изменением типа данных (GH 4686)

  • Исправлена ошибка при чтении сжатых файлов в bytes вместо str в Python 3. Упрощает работу с файлами, производящими байты, в Python 3 (GH 3963, GH 4785).

  • Исправлена проблема, связанная с ticklocs/ticklabels для столбчатых диаграмм с логарифмической шкалой в разных версиях matplotlib (GH 4789)

  • Подавлено DeprecationWarning, связанное с внутренними вызовами, выдаваемыми repr() (GH 4391)

  • Исправлена проблема с дублирующимся индексом и дублирующимся селектором в .loc (GH 4825)

  • Исправлена проблема с DataFrame.sort_index где, при сортировке по одному столбцу и передаче списка для ascending, аргумент для ascending интерпретировался как True (GH 4839, GH 4846)

  • Исправлено Panel.tshift не работает. Добавлено freq поддержка для Panel.shift (GH 4853)

  • Исправлена проблема в TextFileReader с движком Python (т.е. PythonParser) при thousands != "," (GH 4596)

  • Ошибка в getitem с дублирующимся индексом при использовании where (GH 4879)

  • Исправление: код вывода типов преобразует столбец с плавающей точкой в дату и время (GH 4601)

  • Исправлено _ensure_numeric не проверяет наличие комплексных чисел (GH 4902)

  • Исправлена ошибка в Series.hist где создавались две фигуры, когда by аргумент был передан (GH 4112, GH 4113).

  • Исправлена ошибка в convert_objects для > 2 измерений (GH 4937)

  • Исправлена ошибка во вставке в кэш DataFrame/Panel и последующем индексировании (GH 4939, GH 5424)

  • Исправлены строковые методы для FrozenNDArray и FrozenList (GH 4929)

  • Исправлена ошибка при установке недопустимых или выходящих за пределы значений в сценариях увеличения индексации (GH 4940)

  • Тесты для fillna на пустом Series (GH 4346), спасибо @immerrr

  • Исправлено copy() поверхностно копировать оси/индексы и тем самым сохранять отдельные метаданные. (GH 4202, GH 4830)

  • Исправлена опция skiprows в Python парсере для read_csv (GH 4382)

  • Исправлена ошибка, препятствующая cut при работе с np.inf уровни без явной передачи меток (GH 3415)

  • Исправлена неправильная проверка перекрытия в DatetimeIndex.union (GH 4564)

  • Исправлен конфликт между разделителем тысяч и парсером дат в csv_parser (GH 4678)

  • Исправлено добавление, когда типы данных не совпадают (ошибка, показывающая смешение float/np.datetime64) (GH 4993)

  • Исправлено repr для DateOffset. Больше не показывает дублирующиеся записи в kwds. Удалены неиспользуемые поля смещения. (GH 4638)

  • Исправлено неправильное имя индекса при read_csv, если используется usecols. Применяется только к парсеру c (GH 4201)

  • Timestamp объекты теперь могут появляться в левой части операции сравнения с Series или DataFrame объект (GH 4982).

  • Исправлена ошибка при индексации с np.nan через iloc/loc (GH 5016)

  • Исправлена ошибка, при которой парсер с низким потреблением памяти мог создавать разные типы в разных частях одного файла. Теперь приводит к числовому типу или выдает предупреждение. (GH 3866)

  • Исправлена ошибка, при которой изменение формы Series в свою собственную форму возведен TypeError (GH 4554) и другие проблемы с преобразованием формы.

  • Ошибка при установке с ix/loc и смешанный индекс int/string (GH 4544)

  • Убедитесь, что булевы сравнения series-series основаны на метках (GH 4947)

  • Ошибка в многоуровневом индексировании с частичным индексатором Timestamp (GH 4294)

  • Тесты/исправление для построения MultiIndex из полностью NaN фрейма (GH 4078)

  • Исправлена ошибка, где read_html() неправильно определял значения таблиц с запятыми (GH 5029)

  • Исправлена ошибка, где read_html() не обеспечивал стабильный порядок возвращаемых таблиц (GH 4770, GH 5029).

  • Исправлена ошибка, где read_html() некорректно парсился при передаче index_col=0 (GH 5066).

  • Исправлена ошибка, где read_html() неправильно определял тип заголовков (GH 5048).

  • Исправлена ошибка, где DatetimeIndex объединения с PeriodIndex вызвало переполнение стека (GH 3899).

  • Исправлена ошибка, где groupby объекты не позволяли строить графики (GH 5102).

  • Исправлена ошибка, где groupby объекты не поддерживали автодополнение имён столбцов (GH 5102).

  • Исправлена ошибка, где groupby.plot() и аналогичные функции дублировали графики несколько раз (GH 5102).

  • Обеспечить автоматическое преобразование object типы данных при fillna, связанные (GH 5103)

  • Исправлена ошибка, когда параметры по умолчанию перезаписывались при очистке парсера опций (GH 5121).

  • Обрабатывать список/ndarray одинаково для iloc индексация с помощью подобного списку (GH 5006)

  • Исправление MultiIndex.get_level_values() с пропущенными значениями (GH 5074)

  • Исправление проверки границ для Timestamp() с входными данными datetime64 (GH 4065)

  • Исправлена ошибка, где TestReadHtml не вызывал правильный read_html() функция (GH 5150).

  • Исправлена ошибка с NDFrame.replace() что делало замену похожей на (неправильное) использование регулярных выражений (GH 5143).

  • Исправлено: лучшее сообщение об ошибке для to_datetime (GH 4928)

  • Убедились, что разные локали тестируются на travis-ci (GH 4918). Также добавляет несколько утилит для получения локалей и установки локалей с помощью контекстного менеджера.

  • Исправлен сбой сегментации на isnull(MultiIndex) (теперь вызывает ошибку вместо этого) (NaN, GH 5125)

  • Разрешить дублирующиеся индексы при выполнении операций, которые выравнивают (GH 5185, GH 5639)

  • Составные типы данных в конструкторе вызывают NotImplementedError (GH 5191)

  • Ошибка при сравнении дублирующихся фреймов (GH 4421) связанный

  • Ошибка в describe на дублирующихся фреймах

  • Ошибка в to_datetime с форматом и coerce=True не вызывает исключение (GH 5195)

  • Ошибка в loc установка с несколькими индексаторами и правой частью Series, которая требует широковещания (GH 5206)

  • Исправлена ошибка, при которой установка уровней или меток на месте в MultiIndex не очистит кэшированные values свойство и поэтому возвращают неверное values. (-nan)

  • Исправлена ошибка, при которой фильтрация сгруппированного DataFrame или Series не сохраняла исходный порядок (GH 4621).

  • Исправлено Period с бизнес-частотой даты для постоянного продвижения вперед, если на нерабочей дате. (GH 5203)

  • Исправлена ошибка в модулях записи Excel, где фреймы с повторяющимися именами столбцов не записывались корректно. (GH 5235)

  • Исправлена проблема с drop и не уникальный индекс на Series (GH 5248)

  • Исправлен сегфолт в C-парсере, вызванный передачей большего количества имен, чем столбцов в файле. (GH 5156)

  • Исправление Series.isin с типами данных, похожими на дату/время (GH 5021)

  • Парсеры C и Python теперь могут обрабатывать более распространенный формат столбцов MultiIndex, который не имеет строки для имен индексов (GH 4702)

  • Ошибка при попытке использовать дату вне диапазона как тип данных object (GH 5312)

  • Ошибка при попытке отобразить встроенный PandasObject (GH 5324)

  • Позволяет операциям с Timestamps возвращать datetime, если результат выходит за пределы допустимого диапазона связано (GH 5312)

  • Исправление возвращаемого значения/сигнатуры типа для initObjToJSON() чтобы быть совместимым с numpy import_array() (GH 5334, GH 5326)

  • Ошибка при переименовании, затем set_index на DataFrame (GH 5344)

  • Тестовый набор больше не оставляет временные файлы при тестировании графиков. (GH 5347) (спасибо, что заметили это @yarikoptic!)

  • Исправлены html-тесты на win32. (GH 4580)

  • Убедитесь, что head/tail являются iloc основанный, (GH 5370)

  • Исправлена ошибка для PeriodIndex строковое представление, если есть 1 или 2 элемента. (GH 5372)

  • Методы GroupBy transform и filter может использоваться на Series и DataFrames с повторяющимися (неуникальными) индексами. (GH 4620)

  • Исправлено: пустая серия не выводит имя в repr (GH 4651)

  • Сделать тесты создающими временные файлы во временном каталоге по умолчанию. (GH 5419)

  • pd.to_timedelta скаляра возвращает скаляр (GH 5410)

  • pd.to_timedelta принимает NaN и NaT, возвращая NaT вместо вызова исключения (GH 5437)

  • улучшения производительности в isnull на объектах pandas большего размера

  • Исправлены различные setitem с 1d ndarray, которые не имеют соответствующей длины индексатору (GH 5508)

  • Ошибка в getitem с MultiIndex и iloc (GH 5528)

  • Ошибка в delitem для Series (GH 5542)

  • Исправление ошибки в apply при использовании пользовательской функции и неизменяемых объектов (GH 5545)

  • Ошибка при выборе из неуникального индекса с loc (GH 5553)

  • Ошибка в groupby, возвращающая несовместимые типы, когда пользовательская функция возвращает None, (GH 5592)

  • Обход регрессии в numpy 1.7.0, которая ошибочно вызывает IndexError из ndarray.item (GH 5666)

  • Ошибка при повторном индексировании объекта с результирующим неуникальным индексом (GH 5678)

  • Ошибка в fillna с Series и переданным series/dict (GH 5703)

  • Ошибка в groupby transform с группировщиком типа datetime (GH 5712)

  • Ошибка в выборе MultiIndex в PY3 при использовании определенных ключей (GH 5725)

  • Построчное объединение различных типов данных, которое не работает в некоторых случаях (GH 5754)

Участники#

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

  • Agustín Herranz +

  • Alex Gaudio +

  • Alex Rothberg +

  • Andreas Klostermann +

  • Andreas Würl +

  • Andy Hayden

  • Ben Alex +

  • Benedikt Sauer +

  • Брэд Буран

  • Caleb Epstein +

  • Chang She

  • Кристофер Уилан

  • DSM +

  • Dale Jung +

  • Dan Birken

  • David Rasch +

  • Dieter Vandenbussche

  • Gabi Davar +

  • Garrett Drapala

  • Goyo +

  • Greg Reda +

  • Иван Смирнов +

  • Jack Kelly +

  • Jacob Schaer +

  • Jan Schulz +

  • Jeff Tratner

  • Джеффри Тратнер

  • John McNamara +

  • John W. O’Brien +

  • Joris Van den Bossche

  • Justin Bozonier +

  • Келси Джордал

  • Кевин Стоун

  • Kieran O’Mahony

  • Kyle Hausmann +

  • Kyle Kelley +

  • Кайл Мейер

  • Mike Kelly

  • Mortada Mehyar +

  • Nick Foti +

  • Olivier Harris +

  • Ondřej Čertík +

  • PKEuS

  • Филлип Клауд

  • Пьер Хессиг +

  • Richard T. Guy +

  • Roman Pekar +

  • Roy Hyunjin Han

  • Skipper Seabold

  • Sten +

  • Thomas A Caswell +

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

  • Тьяго Рекейхо +

  • TomAugspurger

  • Trent Hauck

  • Valentin Haenel +

  • Виктор Керкез +

  • Vincent Arel-Bundock

  • Wes McKinney

  • Wes Turner +

  • Weston Renoud +

  • Yaroslav Halchenko

  • Zach Dwiel +

  • chapman siu +

  • chappers +

  • d10genes +

  • danielballan

  • daydreamt +

  • engstrom +

  • jreback

  • monicaBee +

  • prossahl +

  • rockg +

  • unutbu +

  • westurner +

  • y-p

  • zach powers