Версия 0.17.0 (9 октября 2015)#

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

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

pandas >= 0.17.0 больше не будет поддерживать совместимость с версией Python 3.2 (GH 9118)

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

The pandas.io.data пакет устарел и будет заменен на пакет pandas-datareader. Это позволит независимо обновлять модули данных в вашей установке pandas. API для pandas-datareader v0.1.1 точно такой же как в pandas v0.17.0 (GH 8961, GH 10861).

После установки pandas-datareader вы можете легко изменить импорты:

from pandas.io import data, wb

становится

from pandas_datareader import data, wb

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

  • Освободить глобальную блокировку интерпретатора (GIL) для некоторых операций cython, см. здесь

  • Методы построения графиков теперь доступны как атрибуты .plot аксессор, см. здесь

  • API сортировки был переработан, чтобы устранить некоторые давние несоответствия, см. здесь

  • Поддержка datetime64[ns] с часовыми поясами как dtype первого класса, см. здесь

  • Значение по умолчанию для to_datetime теперь будет raise при представлении неразбираемых форматов, ранее это возвращало исходный ввод. Также функции разбора дат теперь возвращают согласованные результаты. См. здесь

  • Значение по умолчанию для dropna в HDFStore изменилось на False, чтобы по умолчанию сохранять все строки, даже если они все NaN, см. здесь

  • Доступ к дате и времени (dt) теперь поддерживает Series.dt.strftime для генерации форматированных строк для datetime-подобных объектов, и Series.dt.total_seconds для генерации каждой длительности timedelta в секундах. Смотрите здесь

  • Period и PeriodIndex может обрабатывать умноженную частоту, такую как 3D, что соответствует промежутку в 3 дня. См. здесь

  • Установленные версии pandas для разработки теперь будут иметь PEP440 совместимые версии строк (GH 9518)

  • Поддержка разработки для бенчмаркинга с Библиотека Air Speed Velocity (GH 8361)

  • Поддержка чтения файлов SAS xport, см. здесь

  • Документация, сравнивающая SAS с pandas, см. здесь

  • Удаление автоматического вещания TimeSeries, устаревшего с версии 0.8.0, см. здесь

  • Формат отображения с простым текстом может дополнительно выравниваться по ширине символов Восточной Азии, см. здесь

  • Совместимость с Python 3.5 (GH 11097)

  • Совместимость с matplotlib 1.5.0 (GH 11111)

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

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

Дата-время с часовым поясом#

Мы добавляем реализацию, которая изначально поддерживает datetime с часовыми поясами. Series или DataFrame столбец ранее мог будет присвоена дата-время с часовыми поясами и будет работать как object dtype. Это вызывало проблемы с производительностью при большом количестве строк. См. документация для получения дополнительных сведений. (GH 8260, GH 10763, GH 11034).

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

In [1]: df = pd.DataFrame(
   ...:     {
   ...:         "A": pd.date_range("20130101", periods=3),
   ...:         "B": pd.date_range("20130101", periods=3, tz="US/Eastern"),
   ...:         "C": pd.date_range("20130101", periods=3, tz="CET"),
   ...:     }
   ...: )
   ...: 

In [2]: df
Out[2]: 
           A                         B                         C
0 2013-01-01 2013-01-01 00:00:00-05:00 2013-01-01 00:00:00+01:00
1 2013-01-02 2013-01-02 00:00:00-05:00 2013-01-02 00:00:00+01:00
2 2013-01-03 2013-01-03 00:00:00-05:00 2013-01-03 00:00:00+01:00

[3 rows x 3 columns]

In [3]: df.dtypes
Out[3]: 
A                datetime64[ns]
B    datetime64[ns, US/Eastern]
C           datetime64[ns, CET]
Length: 3, dtype: object
In [4]: df.B
Out[4]: 
0   2013-01-01 00:00:00-05:00
1   2013-01-02 00:00:00-05:00
2   2013-01-03 00:00:00-05:00
Name: B, Length: 3, dtype: datetime64[ns, US/Eastern]

In [5]: df.B.dt.tz_localize(None)
Out[5]: 
0   2013-01-01
1   2013-01-02
2   2013-01-03
Name: B, Length: 3, dtype: datetime64[ns]

Это использует новое представление типа данных, которое очень похоже по внешнему виду и ощущениям на его аналог в numpy datetime64[ns]

In [6]: df["B"].dtype
Out[6]: datetime64[ns, US/Eastern]

In [7]: type(df["B"].dtype)
Out[7]: pandas.core.dtypes.dtypes.DatetimeTZDtype

Примечание

Существует немного другое строковое представление для базового DatetimeIndex в результате изменения типа данных, но функционально они одинаковы.

Предыдущее поведение:

In [1]: pd.date_range('20130101', periods=3, tz='US/Eastern')
Out[1]: DatetimeIndex(['2013-01-01 00:00:00-05:00', '2013-01-02 00:00:00-05:00',
                       '2013-01-03 00:00:00-05:00'],
                      dtype='datetime64[ns]', freq='D', tz='US/Eastern')

In [2]: pd.date_range('20130101', periods=3, tz='US/Eastern').dtype
Out[2]: dtype('

Новое поведение:

In [8]: pd.date_range("20130101", periods=3, tz="US/Eastern")
Out[8]: 
DatetimeIndex(['2013-01-01 00:00:00-05:00', '2013-01-02 00:00:00-05:00',
               '2013-01-03 00:00:00-05:00'],
              dtype='datetime64[ns, US/Eastern]', freq='D')

In [9]: pd.date_range("20130101", periods=3, tz="US/Eastern").dtype
Out[9]: datetime64[ns, US/Eastern]

Освобождение GIL#

Мы освобождаем глобальную блокировку интерпретатора (GIL) в некоторых операциях на Cython. Это позволит другим потокам выполняться одновременно во время вычислений, потенциально улучшая производительность за счёт многопоточности. В частности groupby, nsmallest, value_counts и некоторые операции индексации выигрывают от этого. (GH 8882)

Например, группировка в следующем коде освободит GIL на этапе факторизации, например. df.groupby('key') а также .sum() операция.

N = 1000000
ngroups = 10
df = DataFrame(
    {"key": np.random.randint(0, ngroups, size=N), "data": np.random.randn(N)}
)
df.groupby("key")["data"].sum()

Освобождение GIL может быть полезно для приложений, использующих потоки для взаимодействия с пользователем (например, QT), или выполнение многопоточных вычислений. Хорошим примером библиотеки, которая может обрабатывать такие типы параллельных вычислений, является dask библиотека.

Подметоды построения графиков#

Series и DataFrame .plot() метод позволяет настраивать типы графиков путем указания kind Ключевые аргументы. К сожалению, многие из таких графиков используют разные обязательные и необязательные ключевые аргументы, что затрудняет определение, какие из десятков возможных аргументов использует конкретный тип графика.

Чтобы смягчить эту проблему, мы добавили новый, опциональный интерфейс построения графиков, который предоставляет каждый тип графика как метод .plot атрибут. Вместо записи series.plot(kind=, ...), теперь вы также можете использовать series.plot.(...):

In [10]: df = pd.DataFrame(np.random.rand(10, 2), columns=['a', 'b'])

In [11]: df.plot.bar()
../_images/whatsnew_plot_submethods.png

В результате этого изменения, эти методы теперь все доступны через автодополнение по табуляции:

In [12]: df.plot.<TAB>  # noqa: E225, E999
df.plot.area     df.plot.barh     df.plot.density  df.plot.hist     df.plot.line     df.plot.scatter
df.plot.bar      df.plot.box      df.plot.hexbin   df.plot.kde      df.plot.pie

Каждая сигнатура метода включает только соответствующие аргументы. В настоящее время они ограничены обязательными аргументами, но в будущем будут включать и необязательные аргументы. Для обзора см. новый Построение графиков Документация API.

Дополнительные методы для dt аксессор#

Series.dt.strftime#

Теперь мы поддерживаем Series.dt.strftime метода для datetime-подобных объектов для генерации форматированной строки (GH 10110). Примеры:

# DatetimeIndex
In [13]: s = pd.Series(pd.date_range("20130101", periods=4))

In [14]: s
Out[14]: 
0   2013-01-01
1   2013-01-02
2   2013-01-03
3   2013-01-04
Length: 4, dtype: datetime64[ns]

In [15]: s.dt.strftime("%Y/%m/%d")
Out[15]: 
0    2013/01/01
1    2013/01/02
2    2013/01/03
3    2013/01/04
Length: 4, dtype: object
# PeriodIndex
In [16]: s = pd.Series(pd.period_range("20130101", periods=4))

In [17]: s
Out[17]: 
0    2013-01-01
1    2013-01-02
2    2013-01-03
3    2013-01-04
Length: 4, dtype: period[D]

In [18]: s.dt.strftime("%Y/%m/%d")
Out[18]: 
0    2013/01/01
1    2013/01/02
2    2013/01/03
3    2013/01/04
Length: 4, dtype: object

Строковый формат соответствует стандартной библиотеке Python, подробности можно найти здесь

Series.dt.total_seconds#

pd.Series типа timedelta64 имеет новый метод .dt.total_seconds() возвращая длительность timedelta в секундах (GH 10817)

# TimedeltaIndex
In [19]: s = pd.Series(pd.timedelta_range("1 minutes", periods=4))

In [20]: s
Out[20]: 
0   0 days 00:01:00
1   1 days 00:01:00
2   2 days 00:01:00
3   3 days 00:01:00
Length: 4, dtype: timedelta64[ns]

In [21]: s.dt.total_seconds()
Out[21]: 
0        60.0
1     86460.0
2    172860.0
3    259260.0
Length: 4, dtype: float64

Улучшение частоты периодов#

Period, PeriodIndex и period_range теперь может принимать умноженную частоту. Также, Period.freq и PeriodIndex.freq теперь хранятся как DateOffset экземпляр, как DatetimeIndex, а не как str (GH 7811)

Умноженная частота представляет промежуток соответствующей длины. Пример ниже создает период в 3 дня. Сложение и вычитание сдвинут период на его промежуток.

In [22]: p = pd.Period("2015-08-01", freq="3D")

In [23]: p
Out[23]: Period('2015-08-01', '3D')

In [24]: p + 1
Out[24]: Period('2015-08-04', '3D')

In [25]: p - 2
Out[25]: Period('2015-07-26', '3D')

In [26]: p.to_timestamp()
Out[26]: Timestamp('2015-08-01 00:00:00')

In [27]: p.to_timestamp(how="E")
Out[27]: Timestamp('2015-08-03 23:59:59.999999999')

Вы можете использовать умноженную частоту в PeriodIndex и period_range.

In [28]: idx = pd.period_range("2015-08-01", periods=4, freq="2D")

In [29]: idx
Out[29]: PeriodIndex(['2015-08-01', '2015-08-03', '2015-08-05', '2015-08-07'], dtype='period[2D]')

In [30]: idx + 1
Out[30]: PeriodIndex(['2015-08-03', '2015-08-05', '2015-08-07', '2015-08-09'], dtype='period[2D]')

Поддержка файлов SAS XPORT#

read_sas() предоставляет поддержку чтения SAS XPORT форматные файлы. (GH 4052).

df = pd.read_sas("sas_xport.xpt")

Также возможно получить итератор и читать файл XPORT постепенно.

for df in pd.read_sas("sas_xport.xpt", chunksize=10000):
    do_something(df)

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

Поддержка математических функций в .eval()#

eval() теперь поддерживает вызов математических функций (GH 4893)

df = pd.DataFrame({"a": np.random.randn(10)})
df.eval("b = sin(a)")

Поддерживаемые математические функции: sin, cos, exp, log, expm1, log1p, sqrt, sinh, cosh, tanh, arcsin, arccos, arctan, arccosh, arcsinh, arctanh, abs и arctan2.

Эти функции соответствуют встроенным функциям для NumExpr движок. Для Python движка они сопоставляются с NumPy вызовы.

Изменения в Excel с MultiIndex#

В версии 0.16.2 DataFrame с MultiIndex столбцы не могли быть записаны в Excel через to_excel. Эта функциональность была добавлена (GH 10564), вместе с обновлением read_excel чтобы данные можно было прочитать обратно без потери информации, указав, какие столбцы/строки составляют MultiIndex в header и index_col параметры (GH 4679)

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

In [31]: df = pd.DataFrame(
   ....:     [[1, 2, 3, 4], [5, 6, 7, 8]],
   ....:     columns=pd.MultiIndex.from_product(
   ....:         [["foo", "bar"], ["a", "b"]], names=["col1", "col2"]
   ....:     ),
   ....:     index=pd.MultiIndex.from_product([["j"], ["l", "k"]], names=["i1", "i2"]),
   ....: )
   ....: 

In [32]: df
Out[32]: 
col1  foo    bar   
col2    a  b   a  b
i1 i2              
j  l    1  2   3  4
   k    5  6   7  8

[2 rows x 4 columns]

In [33]: df.to_excel("test.xlsx")

In [34]: df = pd.read_excel("test.xlsx", header=[0, 1], index_col=[0, 1])

In [35]: df
Out[35]: 
col1  foo    bar   
col2    a  b   a  b
i1 i2              
j  l    1  2   3  4
   k    5  6   7  8

[2 rows x 4 columns]

Ранее было необходимо указать has_index_names аргумент в read_excel, если сериализованные данные имели имена индекса. Для версии 0.17.0 выходной формат to_excel был изменен, чтобы сделать этот ключевое слово ненужным - изменение показано ниже.

Старый

../_images/old-excel-index.png

Новый

../_images/new-excel-index.png

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

Файлы Excel, сохранённые в версии 0.16.2 или ранее, которые содержали имена индексов, всё ещё можно будет читать, но has_index_names аргумент должен быть указан для True.

Улучшения Google BigQuery#

  • Добавлена возможность автоматического создания таблицы/набора данных с использованием pandas.io.gbq.to_gbq() функция, если целевая таблица/набор данных не существует. (GH 8325, GH 11121).

  • Добавлена возможность замены существующей таблицы и схемы при вызове pandas.io.gbq.to_gbq() функцию через if_exists аргумент. См. документация для дополнительных деталей (GH 8325).

  • InvalidColumnOrder и InvalidPageToken в модуле gbq вызовет ValueError вместо IOError.

  • The generate_bq_schema() функция теперь устарела и будет удалена в будущей версии (GH 11121)

  • Модуль gbq теперь будет поддерживать Python 3 (GH 11094).

Выравнивание отображения с шириной восточноазиатских символов Юникода#

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

Включение этой опции повлияет на производительность при выводе DataFrame и Series (примерно в 2 раза медленнее). Используйте только тогда, когда это действительно необходимо.

Некоторые восточноазиатские страны используют символы Юникода, ширина которых соответствует 2 алфавитам. Если DataFrame или Series содержит эти символы, вывод по умолчанию не может быть правильно выровнен. Добавлены следующие опции для точной обработки этих символов.

  • display.unicode.east_asian_width: Использовать ли ширину East Asian Width в Unicode для расчета ширины отображаемого текста. (GH 2612)

  • display.unicode.ambiguous_as_wide: Обрабатывать ли символы Юникода, принадлежащие к неоднозначным, как широкие. (GH 11102)

In [36]: df = pd.DataFrame({u"国籍": ["UK", u"日本"], u"名前": ["Alice", u"しのぶ"]})

In [37]: df
Out[37]: 
   国籍     名前
0  UK  Alice
1  日本    しのぶ

[2 rows x 2 columns]
In [38]: pd.set_option("display.unicode.east_asian_width", True)

In [39]: df
Out[39]: 
   国籍    名前
0    UK   Alice
1  日本  しのぶ

[2 rows x 2 columns]

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

Другие улучшения#

  • Поддержка openpyxl >= 2.2. API для поддержки стилей теперь стабилен (GH 10125)

  • merge теперь принимает аргумент indicator который добавляет столбец типа Categorical (по умолчанию называется _merge) к выходному объекту, который принимает значения (GH 8790)

    Источник наблюдения

    _merge значение

    Ключ слияния только в 'left' фрейм

    left_only

    Ключ слияния только в 'right' фрейм

    right_only

    Ключ слияния в обоих фреймах

    both

    In [40]: df1 = pd.DataFrame({"col1": [0, 1], "col_left": ["a", "b"]})
    
    In [41]: df2 = pd.DataFrame({"col1": [1, 2, 2], "col_right": [2, 2, 2]})
    
    In [42]: pd.merge(df1, df2, on="col1", how="outer", indicator=True)
    Out[42]: 
       col1 col_left  col_right      _merge
    0     0        a        NaN   left_only
    1     1        b        2.0        both
    2     2      NaN        2.0  right_only
    3     2      NaN        2.0  right_only
    
    [4 rows x 4 columns]
    

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

  • pd.to_numeric это новая функция для приведения строк к числам (возможно с принудительным преобразованием) (GH 11133)

  • pd.merge теперь разрешит повторяющиеся имена столбцов, если они не участвуют в слиянии (GH 10639).

  • pd.pivot теперь разрешит передачу index как None (GH 3962).

  • pd.concat теперь будет использовать существующие имена Series, если они предоставлены (GH 10698).

    In [43]: foo = pd.Series([1, 2], name="foo")
    
    In [44]: bar = pd.Series([1, 2])
    
    In [45]: baz = pd.Series([4, 5])
    

    Предыдущее поведение:

    In [1]: pd.concat([foo, bar, baz], axis=1)
    Out[1]:
          0  1  2
       0  1  1  4
       1  2  2  5
    

    Новое поведение:

    In [46]: pd.concat([foo, bar, baz], axis=1)
    Out[46]: 
       foo  0  1
    0    1  1  4
    1    2  2  5
    
    [2 rows x 3 columns]
    
  • DataFrame получил nlargest и nsmallest методы (GH 10393)

  • Добавить limit_direction аргумент, позволяющий пользователям указать, использовать ли устаревший SQL BigQuery или стандартный SQL BigQuery. См. limit включить interpolate для заполнения NaN значения вперед, назад или в обоих направлениях (GH 9218, GH 10420, GH 11115)

    In [47]: ser = pd.Series([np.nan, np.nan, 5, np.nan, np.nan, np.nan, 13])
    
    In [48]: ser.interpolate(limit=1, limit_direction="both")
    Out[48]: 
    0     NaN
    1     5.0
    2     5.0
    3     7.0
    4     NaN
    5    11.0
    6    13.0
    Length: 7, dtype: float64
    
  • Добавлен DataFrame.round метод для округления значений до переменного количества десятичных знаков (GH 10568).

    In [49]: df = pd.DataFrame(
       ....:     np.random.random([3, 3]),
       ....:     columns=["A", "B", "C"],
       ....:     index=["first", "second", "third"],
       ....: )
       ....: 
    
    In [50]: df
    Out[50]: 
                   A         B         C
    first   0.126970  0.966718  0.260476
    second  0.897237  0.376750  0.336222
    third   0.451376  0.840255  0.123102
    
    [3 rows x 3 columns]
    
    In [51]: df.round(2)
    Out[51]: 
               A     B     C
    first   0.13  0.97  0.26
    second  0.90  0.38  0.34
    third   0.45  0.84  0.12
    
    [3 rows x 3 columns]
    
    In [52]: df.round({"A": 0, "C": 2})
    Out[52]: 
              A         B     C
    first   0.0  0.966718  0.26
    second  1.0  0.376750  0.34
    third   0.0  0.840255  0.12
    
    [3 rows x 3 columns]
    
  • drop_duplicates и duplicated теперь принимает keep ключевое слово для нацеливания на первые, последние и все дубликаты. Ключевое слово take_last ключевое слово устарело, см. здесь (GH 6511, GH 8505)

    In [53]: s = pd.Series(["A", "B", "C", "A", "B", "D"])
    
    In [54]: s.drop_duplicates()
    Out[54]: 
    0    A
    1    B
    2    C
    5    D
    Length: 4, dtype: object
    
    In [55]: s.drop_duplicates(keep="last")
    Out[55]: 
    2    C
    3    A
    4    B
    5    D
    Length: 4, dtype: object
    
    In [56]: s.drop_duplicates(keep=False)
    Out[56]: 
    2    C
    5    D
    Length: 2, dtype: object
    
  • Reindex теперь имеет tolerance аргумент, который позволяет более точно контролировать Ограничения на заполнение при переиндексации (GH 10411):

    In [57]: df = pd.DataFrame({"x": range(5), "t": pd.date_range("2000-01-01", periods=5)})
    
    In [58]: df.reindex([0.1, 1.9, 3.5], method="nearest", tolerance=0.2)
    Out[58]: 
           x          t
    0.1  0.0 2000-01-01
    1.9  2.0 2000-01-03
    3.5  NaN        NaT
    
    [3 rows x 2 columns]
    

    При использовании на DatetimeIndex, TimedeltaIndex или PeriodIndex, tolerance будет преобразовано в Timedelta если возможно. Это позволяет указать допуск строкой:

    In [59]: df = df.set_index("t")
    
    In [60]: df.reindex(pd.to_datetime(["1999-12-31"]), method="nearest", tolerance="1 day")
    Out[60]: 
                x
    1999-12-31  0
    
    [1 rows x 1 columns]
    

    tolerance также доступен на более низком уровне Index.get_indexer и Index.get_loc методы.

  • Добавлена функциональность для использования base аргумент при передискретизации TimeDeltaIndex (GH 10530)

  • DatetimeIndex может быть создан с использованием строк, содержащих NaT (GH 7599)

  • to_datetime теперь может принимать yearfirst ключевое слово (GH 7599)

  • pandas.tseries.offsets больше, чем Day смещение теперь можно использовать с Series для сложения/вычитания (GH 10699). См. документация для получения дополнительной информации.

  • pd.Timedelta.total_seconds() теперь возвращает длительность Timedelta с точностью до наносекунд (ранее микросекундная точность) (GH 10939)

  • PeriodIndex теперь поддерживает арифметические операции с np.ndarray (GH 10638)

  • Поддержка сериализации Period объекты (GH 10439)

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

  • regex аргумент для DataFrame.filter теперь обрабатывает числовые имена столбцов вместо вызова исключения ValueError (GH 10384).

  • Включить чтение файлов, сжатых gzip, через URL, либо явно установив параметр сжатия, либо определив по наличию заголовка HTTP Content-Encoding в ответе (GH 8685)

  • Включение записи файлов Excel в память используя StringIO/BytesIO (GH 7074)

  • Включить сериализацию списков и словарей в строки в ExcelWriter (GH 8188)

  • Функции ввода-вывода SQL теперь принимают SQLAlchemy connectable. (GH 7877)

  • pd.read_sql и to_sql может принимать URI базы данных как con параметр (подклассы. Это повлияет на порядок сортировки при сортировке DataFrame по нескольким столбцам, сортировке с ключевой функцией, создающей дубликаты, или запросе индекса сортировки при использовании)

  • read_sql_table теперь позволяет чтение из представлений (GH 10750).

  • Разрешить запись комплексных значений в HDFStores при использовании table формат (GH 10447)

  • Включить pd.read_hdf для использования без указания ключа, когда HDF-файл содержит один набор данных (GH 10443)

  • pd.read_stata теперь будет читать файлы типа Stata 118. (GH 9882)

  • msgpack подмодуль обновлен до версии 0.4.6 с обратной совместимостью (GH 10581)

  • DataFrame.to_dict теперь принимает orient='index' именованный аргумент (GH 10844).

  • DataFrame.apply вернет Series словарей, если переданная функция возвращает словарь, и reduce=True (GH 8735).

  • Разрешить передачу kwargs к методам интерполяции (GH 10378).

  • Улучшено сообщение об ошибке при конкатенации пустого итерируемого объекта Dataframe объекты (GH 9157)

  • pd.read_csv теперь может читать bz2-сжатые файлы инкрементально, а C-парсер может читать bz2-сжатые файлы из AWS S3 (GH 11070, GH 11072).

  • В pd.read_csv, распознавать s3n:// и s3a:// URL-адреса как обозначающие хранилище файлов S3 (GH 11070, GH 11071).

  • Чтение CSV-файлов из AWS S3 инкрементально, вместо предварительной загрузки всего файла. (Полная загрузка файла все еще требуется для сжатых файлов в Python 2.) (GH 11070, GH 11073)

  • pd.read_csv теперь может определять тип сжатия для файлов, читаемых из хранилища AWS S3 (GH 11070, GH 11074).

Обратно несовместимые изменения API#

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

API сортировки имел некоторые давние несоответствия. (GH 9816, GH 8239).

Вот сводка API PRIOR до 0.17.0:

  • Series.sort является INPLACE в то время как DataFrame.sort возвращает новый объект.

  • Series.order возвращает новый объект

  • Было возможно использовать Series/DataFrame.sort_index для сортировки по values передав by ключевое слово.

  • Series/DataFrame.sortlevel работал только на MultiIndex для сортировки по индексу.

Для решения этих проблем мы переработали API:

  • Мы представили новый метод, DataFrame.sort_values(), что является объединением DataFrame.sort(), Series.sort(), и Series.order(), для обработки сортировки values.

  • Существующие методы Series.sort(), Series.order(), и DataFrame.sort() были устаревшими и будут удалены в будущей версии.

  • The by аргумент DataFrame.sort_index() был объявлен устаревшим и будет удален в будущей версии.

  • Существующий метод .sort_index() получит level ключевое слово для включения сортировки по уровням.

Теперь у нас есть два различных и непересекающихся метода сортировки. * помечает элементы, которые будут отображать FutureWarning.

Для сортировки по values:

Предыдущий

Замена

* Series.order()

Series.sort_values()

* Series.sort()

Series.sort_values(inplace=True)

* DataFrame.sort(columns=...)

DataFrame.sort_values(by=...)

Для сортировки по index:

Предыдущий

Замена

Series.sort_index()

Series.sort_index()

Series.sortlevel(level=...)

Series.sort_index(level=...)

DataFrame.sort_index()

DataFrame.sort_index()

DataFrame.sortlevel(level=...)

DataFrame.sort_index(level=...)

* DataFrame.sort()

DataFrame.sort_index()

Мы также устарели и изменили аналогичные методы в двух классах, подобных Series, Index и Categorical.

Предыдущий

Замена

* Index.order()

Index.sort_values()

* Categorical.order()

Categorical.sort_values()

Изменения в to_datetime и to_timedelta#

Обработка ошибок#

Значение по умолчанию для pd.to_datetime обработка ошибок изменилась на errors='raise'. В предыдущих версиях это было errors='ignore'Кроме того, coerce аргумент был устаревшим в пользу errors='coerce'. Это означает, что некорректный разбор вызовет ошибку, а не вернёт исходные данные, как в предыдущих версиях. (GH 10636)

Предыдущее поведение:

In [2]: pd.to_datetime(['2009-07-31', 'asd'])
Out[2]: array(['2009-07-31', 'asd'], dtype=object)

Новое поведение:

In [3]: pd.to_datetime(['2009-07-31', 'asd'])
ValueError: Unknown string format

Конечно, вы также можете принудительно преобразовать это.

In [61]: pd.to_datetime(["2009-07-31", "asd"], errors="coerce")
Out[61]: DatetimeIndex(['2009-07-31', 'NaT'], dtype='datetime64[ns]', freq=None)

Чтобы сохранить предыдущее поведение, можно использовать errors='ignore':

In [4]: pd.to_datetime(["2009-07-31", "asd"], errors="ignore")
Out[4]: Index(['2009-07-31', 'asd'], dtype='object')

Кроме того, pd.to_timedelta получил аналогичный API, errors='raise'|'ignore'|'coerce'должны быть включены в старые категории. Значения, которые были в удаленных категориях, будут установлены в NaN coerce ключевое слово было объявлено устаревшим в пользу errors='coerce'.

Согласованный парсинг#

Строковый разбор to_datetime, Timestamp и DatetimeIndex было сделано согласованным. (GH 7599)

До версии 0.17.0, Timestamp и to_datetime может некорректно разобрать строку даты-времени только с годом, используя сегодняшнюю дату, в противном случае DatetimeIndex использует начало года. Timestamp и to_datetime может вызывать ValueError в некоторых типах строк даты-времени, которые DatetimeIndex может разбирать, например, квартальную строку.

Предыдущее поведение:

In [1]: pd.Timestamp('2012Q2')
Traceback
   ...
ValueError: Unable to parse 2012Q2

# Results in today's date.
In [2]: pd.Timestamp('2014')
Out [2]: 2014-08-12 00:00:00

v0.17.0 может анализировать их, как показано ниже. Работает на DatetimeIndex также.

Новое поведение:

In [62]: pd.Timestamp("2012Q2")
Out[62]: Timestamp('2012-04-01 00:00:00')

In [63]: pd.Timestamp("2014")
Out[63]: Timestamp('2014-01-01 00:00:00')

In [64]: pd.DatetimeIndex(["2012Q2", "2014"])
Out[64]: DatetimeIndex(['2012-04-01', '2014-01-01'], dtype='datetime64[ns]', freq=None)

Примечание

Если вы хотите выполнить вычисления на основе сегодняшней даты, используйте Timestamp.now() и pandas.tseries.offsets.

In [65]: import pandas.tseries.offsets as offsets

In [66]: pd.Timestamp.now()
Out[66]: Timestamp('2025-09-29 22:21:01.322703')

In [67]: pd.Timestamp.now() + offsets.DateOffset(years=1)
Out[67]: Timestamp('2026-09-29 22:21:01.323808')

Изменения в сравнениях Index#

Оператор равенства на Index должен вести себя аналогично Series (GH 9947, GH 10637)

Начиная с v0.17.0, сравнение Index объекты разной длины вызовут ValueError. Это необходимо для согласованности с поведением Series.

Предыдущее поведение:

In [2]: pd.Index([1, 2, 3]) == pd.Index([1, 4, 5])
Out[2]: array([ True, False, False], dtype=bool)

In [3]: pd.Index([1, 2, 3]) == pd.Index([2])
Out[3]: array([False,  True, False], dtype=bool)

In [4]: pd.Index([1, 2, 3]) == pd.Index([1, 2])
Out[4]: False

Новое поведение:

In [8]: pd.Index([1, 2, 3]) == pd.Index([1, 4, 5])
Out[8]: array([ True, False, False], dtype=bool)

In [9]: pd.Index([1, 2, 3]) == pd.Index([2])
ValueError: Lengths must match to compare

In [10]: pd.Index([1, 2, 3]) == pd.Index([1, 2])
ValueError: Lengths must match to compare

Обратите внимание, что это отличается от numpy поведение, при котором сравнение может распространяться:

In [68]: np.array([1, 2, 3]) == np.array([1])
Out[68]: array([ True, False, False])

или он может вернуть False, если трансляция не может быть выполнена:

In [11]: np.array([1, 2, 3]) == np.array([1, 2])
Out[11]: False

Изменения в булевых сравнениях с None#

Булевы сравнения a Series против None теперь будет эквивалентно сравнению с np.nan, а не вызывать TypeError. (GH 1079).

In [69]: s = pd.Series(range(3), dtype="float")

In [70]: s.iloc[1] = None

In [71]: s
Out[71]: 
0    0.0
1    NaN
2    2.0
Length: 3, dtype: float64

Предыдущее поведение:

In [5]: s == None
TypeError: Could not compare  type with Series

Новое поведение:

In [72]: s == None
Out[72]: 
0    False
1    False
2    False
Length: 3, dtype: bool

Обычно вы просто хотите знать, какие значения являются null.

In [73]: s.isnull()
Out[73]: 
0    False
1     True
2    False
Length: 3, dtype: bool

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

Обычно вы захотите использовать isnull/notnull для таких типов сравнений, как isnull/notnull показывает, какие элементы являются нулевыми. Необходимо учитывать, что nan's не равны при сравнении, но None's делает. Обратите внимание, что pandas/numpy использует тот факт, что np.nan != np.nan, и обрабатывает None как np.nan.

In [74]: None == None
Out[74]: True

In [75]: np.nan == np.nan
Out[75]: False

поведение HDFStore dropna#

Поведение по умолчанию для функций записи HDFStore с format='table' теперь сохранять строки, которые полностью отсутствуют. Ранее поведение заключалось в удалении строк, которые полностью отсутствовали, кроме индекса. Предыдущее поведение можно воспроизвести с помощью dropna=True опция. (GH 9382)

Предыдущее поведение:

In [76]: df_with_missing = pd.DataFrame(
   ....:     {"col1": [0, np.nan, 2], "col2": [1, np.nan, np.nan]}
   ....: )
   ....: 

In [77]: df_with_missing
Out[77]: 
   col1  col2
0   0.0   1.0
1   NaN   NaN
2   2.0   NaN

[3 rows x 2 columns]
In [27]:
df_with_missing.to_hdf('file.h5',
                       key='df_with_missing',
                       format='table',
                       mode='w')

In [28]: pd.read_hdf('file.h5', 'df_with_missing')

Out [28]:
      col1  col2
  0     0     1
  2     2   NaN

Новое поведение:

In [78]: df_with_missing.to_hdf("file.h5", key="df_with_missing", format="table", mode="w")

In [79]: pd.read_hdf("file.h5", "df_with_missing")
Out[79]: 
   col1  col2
0   0.0   1.0
1   NaN   NaN
2   2.0   NaN

[3 rows x 2 columns]

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

Изменения в display.precision опция#

The display.precision опция была уточнена для обозначения десятичных знаков (GH 10451).

Более ранние версии pandas форматировали числа с плавающей точкой, чтобы иметь на один десятичный знак меньше, чем значение в display.precision.

In [1]: pd.set_option('display.precision', 2)

In [2]: pd.DataFrame({'x': [123.456789]})
Out[2]:
       x
0  123.5

Если интерпретировать точность как «значащие цифры», это работало для научной записи, но та же интерпретация не работала для значений со стандартным форматированием. Это также не соответствовало тому, как numpy обрабатывает форматирование.

В дальнейшем значение display.precision будет напрямую контролировать количество знаков после запятой, как для обычного форматирования, так и для научной нотации, аналогично тому, как numpy precision опция print работает.

In [80]: pd.set_option("display.precision", 2)

In [81]: pd.DataFrame({"x": [123.456789]})
Out[81]: 
        x
0  123.46

[1 rows x 1 columns]

Для сохранения поведения вывода с предыдущими версиями значение по умолчанию display.precision было сокращено до 6 из 7.

Изменения в Categorical.unique#

Categorical.unique теперь возвращает новый Categoricals с categories и codes которые уникальны, а не возвращают np.array (GH 10508)

  • неупорядоченная категория: значения и категории сортируются по порядку появления.

  • упорядоченная категория: значения сортируются по порядку появления, категории сохраняют существующий порядок.

In [82]: cat = pd.Categorical(["C", "A", "B", "C"], categories=["A", "B", "C"], ordered=True)

In [83]: cat
Out[83]: 
['C', 'A', 'B', 'C']
Categories (3, object): ['A' < 'B' < 'C']

In [84]: cat.unique()
Out[84]: 
['C', 'A', 'B']
Categories (3, object): ['A' < 'B' < 'C']

In [85]: cat = pd.Categorical(["C", "A", "B", "C"], categories=["A", "B", "C"])

In [86]: cat
Out[86]: 
['C', 'A', 'B', 'C']
Categories (3, object): ['A', 'B', 'C']

In [87]: cat.unique()
Out[87]: 
['C', 'A', 'B']
Categories (3, object): ['A', 'B', 'C']

Изменения в bool передан как header в парсерах#

В более ранних версиях pandas, если передавалось булево значение header аргумент read_csv, read_excel, или read_html он был неявно преобразован в целое число, что привело к header=0 для False и header=1 для True (GH 6113)

A bool входные данные для header теперь вызовет TypeError

In [29]: df = pd.read_csv('data.csv', header=False)
TypeError: Passing a bool to header is invalid. Use header=None for no header or
header=int or list-like of ints to specify the row(s) making up the column names

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

  • Линейный и kde график с subplots=True теперь использует цвета по умолчанию, а не все черные. Укажите color='k' чтобы рисовать все линии черным цветом (GH 9894)

  • Вызов .value_counts() метод на Series с categorical dtype теперь возвращает Series с CategoricalIndex (GH 10704)

  • Свойства метаданных подклассов объектов pandas теперь будут сериализованы (GH 10553).

  • groupby используя Categorical следует тому же правилу, что и Categorical.unique описанный выше (GH 10508)

  • При создании DataFrame с массивом complex64 dtype ранее означал, что соответствующий столбец автоматически повышался до complex128 dtype. pandas теперь будет сохранять размер элементов входных данных для комплексных данных (GH 10952)

  • некоторые операторы числовой редукции вернут ValueError, а не TypeError для объектных типов, включающих строки и числа (GH 11131)

  • Передача в настоящее время неподдерживаемых chunksize аргумент для read_excel или ExcelFile.parse теперь будет вызывать NotImplementedError (GH 8011)

  • Разрешить ExcelFile объект для передачи в read_excel (GH 11198)

  • DatetimeIndex.union не выводит freq if self и входные данные имеют None как freq (GH 11086)

  • NaTметоды теперь либо вызывают исключение ValueError, или возвращает np.nan или NaT (GH 9513)

    Поведение

    Методы

    возвращает np.nan

    weekday, isoweekday

    возвращает NaT

    date, now, replace, to_datetime, today

    возвращает np.datetime64('NaT')

    to_datetime64 (без изменений)

    raise ValueError

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

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

  • Для Series следующие функции индексирования устарели (GH 10177).

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

    Замена

    .irow(i)

    .iloc[i] или .iat[i]

    .iget(i)

    .iloc[i] или .iat[i]

    .iget_value(i)

    .iloc[i] или .iat[i]

  • Для DataFrame следующие функции индексирования устарели (GH 10177).

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

    Замена

    .irow(i)

    .iloc[i]

    .iget_value(i, j)

    .iloc[i, j] или .iat[i, j]

    .icol(j)

    .iloc[:, j]

Примечание

Эти функции индексирования устарели в документации с версии 0.11.0.

  • Categorical.name был устаревшим, чтобы сделать Categorical больше numpy.ndarray нравится. Используйте Series(cat, name="whatever") вместо (GH 10482).

  • Установка пропущенных значений (NaN) в Categorical’s categories выдаст предупреждение (GH 10748). Вы все еще можете иметь пропущенные значения в values.

  • drop_duplicates и duplicated’s take_last ключевое слово было устаревшим в пользу keep. (GH 6511, GH 8505)

  • Series.nsmallest и nlargest’s take_last ключевое слово было устаревшим в пользу keep. (GH 10792)

  • DataFrame.combineAdd и DataFrame.combineMult устарели. Их можно легко заменить, используя add и mul методы: DataFrame.add(other, fill_value=0) и DataFrame.mul(other, fill_value=1.) (GH 10735).

  • TimeSeries устарело в пользу Series (обратите внимание, что это было псевдонимом с версии 0.13.0), (GH 10890)

  • SparsePanel устарел и будет удалён в будущей версии (GH 11157).

  • Series.is_time_series устарело в пользу Series.index.is_all_dates (GH 11135)

  • Устаревшие смещения (как 'A@JAN') устарели (обратите внимание, что это было псевдонимом с версии 0.8.0) (GH 10878)

  • WidePanel устарело в пользу Panel, LongPanel в пользу DataFrame (обратите внимание, что это были псевдонимы с версии < 0.11.0), (GH 10892)

  • DataFrame.convert_objects был устаревшим в пользу функций для конкретных типов pd.to_datetime, pd.to_timestamp и pd.to_numeric (новое в 0.17.0) (GH 11133).

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

  • Удаление na_last параметры из Series.order() и Series.sort(), в пользу na_position. (GH 5231)

  • Удаление percentile_width из .describe(), в пользу percentiles. (GH 7088)

  • Удаление colSpace параметр из DataFrame.to_string(), в пользу col_space, примерно версия 0.8.0.

  • Удаление автоматического вещания временных рядов (GH 2304)

    In [88]: np.random.seed(1234)
    
    In [89]: df = pd.DataFrame(
       ....:     np.random.randn(5, 2),
       ....:     columns=list("AB"),
       ....:     index=pd.date_range("2013-01-01", periods=5),
       ....: )
       ....: 
    
    In [90]: df
    Out[90]: 
                       A         B
    2013-01-01  0.471435 -1.190976
    2013-01-02  1.432707 -0.312652
    2013-01-03 -0.720589  0.887163
    2013-01-04  0.859588 -0.636524
    2013-01-05  0.015696 -2.242685
    
    [5 rows x 2 columns]
    

    Ранее

    In [3]: df + df.A
    FutureWarning: TimeSeries broadcasting along DataFrame index by default is deprecated.
    Please use DataFrame. to explicitly broadcast arithmetic operations along the index
    
    Out[3]:
                        A         B
    2013-01-01  0.942870 -0.719541
    2013-01-02  2.865414  1.120055
    2013-01-03 -1.441177  0.166574
    2013-01-04  1.719177  0.223065
    2013-01-05  0.031393 -2.226989
    

    Текущий

    In [91]: df.add(df.A, axis="index")
    Out[91]: 
                       A         B
    2013-01-01  0.942870 -0.719541
    2013-01-02  2.865414  1.120055
    2013-01-03 -1.441177  0.166574
    2013-01-04  1.719177  0.223065
    2013-01-05  0.031393 -2.226989
    
    [5 rows x 2 columns]
    
  • Удалить table ключевое слово в HDFStore.put/append, в пользу использования format= (GH 4645)

  • Удалить kind в read_excel/ExcelFile так как он не используется (GH 4712)

  • Удалить infer_type ключевое слово из pd.read_html так как он не используется (GH 4770, GH 7032)

  • Удалить offset и timeRule ключевые слова из Series.tshift/shift, в пользу freq (GH 4853, GH 4864)

  • Удалить pd.load/pd.save псевдонимы в пользу pd.to_pickle/pd.read_pickle (GH 3787)

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

  • Поддержка разработки для бенчмаркинга с Библиотека Air Speed Velocity (GH 8361)

  • Добавлены vbench-тесты для альтернативных движков ExcelWriter и чтения файлов Excel (GH 7171)

  • Улучшения производительности в Categorical.value_counts (GH 10804)

  • Улучшения производительности в SeriesGroupBy.nunique и SeriesGroupBy.value_counts и SeriesGroupby.transform (GH 10820, GH 11077)

  • Улучшения производительности в DataFrame.drop_duplicates с целочисленными типами данных (GH 10917)

  • Улучшения производительности в DataFrame.duplicated с широкими фреймами. (GH 10161, GH 11180)

  • 4-кратное улучшение в timedelta разбор строк (GH 6755, GH 10426)

  • 8-кратное улучшение в timedelta64 и datetime64 ops (GH 6755)

  • Значительно улучшена производительность индексации MultiIndex с помощью слайсеров (GH 10287)

  • 8-кратное улучшение в iloc используя ввод в виде списка (GH 10791)

  • Улучшена производительность Series.isin для Series типа datetime/целых чисел (GH 10287)

  • 20-кратное улучшение в concat Categoricals, когда категории идентичны (GH 10587)

  • Улучшена производительность to_datetime когда указанный строковый формат является ISO8601 (GH 10178)

  • 2-кратное улучшение Series.value_counts для float dtype (GH 10821)

  • Включить infer_datetime_format в to_datetime когда компоненты даты не имеют заполнения нулями (GH 11142)

  • Регрессия с 0.16.1 при построении DataFrame из вложенного словаря (GH 11084)

  • Улучшения производительности операций сложения/вычитания для DateOffset с Series или DatetimeIndex (GH 10744, GH 11205)

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

  • Ошибка в некорректном вычислении .mean() на timedelta64[ns] из-за переполнения (GH 9442)

  • Ошибка в .isin на старых версиях numpy (GH 11232)

  • Ошибка в DataFrame.to_html(index=False) делает ненужным name строка (GH 10344)

  • Ошибка в DataFrame.to_latex() the column_format аргумент не мог быть передан (GH 9402)

  • Ошибка в DatetimeIndex при локализации с NaT (GH 10477)

  • Ошибка в Series.dt операции в сохранении метаданных (GH 10477)

  • Ошибка в сохранении NaT когда передается в ином случае недопустимый to_datetime создание (GH 10477)

  • Ошибка в DataFrame.apply когда функция возвращает категориальный ряд. (GH 9573)

  • Ошибка в to_datetime с неверными датами и форматами (GH 10154)

  • Ошибка в Index.drop_duplicates удаление имени(ён) (GH 10115)

  • Ошибка в Series.quantile удаление имени (GH 10881)

  • Ошибка в pd.Series при установке значения на пустом Series чей индекс имеет частоту. (GH 10193)

  • Ошибка в pd.Series.interpolate с недопустимыми order значения ключевых слов. (GH 10633)

  • Ошибка в DataFrame.plot вызывает ValueError когда имя цвета задано несколькими символами (GH 10387)

  • Ошибка в Index конструкция со смешанным списком кортежей (GH 10697)

  • Ошибка в DataFrame.reset_index когда индекс содержит NaT. (GH 10388)

  • Ошибка в ExcelReader когда лист пуст (GH 6403)

  • Ошибка в BinGrouper.group_info где возвращаемые значения не совместимы с базовым классом (GH 10914)

  • Ошибка в очистке кэша на DataFrame.pop и последующая операция на месте (GH 10912)

  • Ошибка при индексации со смешанным целым числом Index вызывая ImportError (GH 10610)

  • Ошибка в Series.count когда индекс содержит нулевые значения (GH 10946)

  • Ошибка при сериализации нерегулярной частоты DatetimeIndex (GH 11002)

  • Ошибка, вызывающая DataFrame.where не учитывать axis параметр, когда фрейм имеет симметричную форму. (GH 9736)

  • Ошибка в Table.select_column где имя не сохраняется (GH 10392)

  • Ошибка в offsets.generate_range где start и end имеют более высокую точность, чем offset (GH 9907)

  • Ошибка в pd.rolling_* где Series.name будет потеряно в выводе (GH 10565)

  • Ошибка в stack когда индекс или столбцы не уникальны. (GH 10417)

  • Ошибка при установке Panel когда ось имеет MultiIndex (GH 10360)

  • Ошибка в USFederalHolidayCalendar где USMemorialDay и USMartinLutherKingJr были некорректными (GH 10278 и GH 9760 )

  • Ошибка в .sample() где возвращаемый объект, если задан, дает ненужные SettingWithCopyWarning (GH 10738)

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

  • Регрессия исправлена в (GH 9311, GH 6620, GH 9345), где groupby с datetime-like преобразованием в float с определенными агрегаторами (GH 10979)

  • Ошибка в DataFrame.interpolate с axis=1 и inplace=True (GH 10395)

  • Ошибка в io.sql.get_schema при указании нескольких столбцов в качестве первичного ключа (GH 10385).

  • Ошибка в groupby(sort=False) с датой-временем Categorical вызывает ValueError (GH 10505)

  • Ошибка в groupby(axis=1) с filter() выбрасывает IndexError (GH 11041)

  • Ошибка в test_categorical на big-endian сборках (GH 10425)

  • Ошибка в Series.shift и DataFrame.shift не поддерживает категориальные данные (GH 9416)

  • Ошибка в Series.map используя категориальный Series вызывает AttributeError (GH 10324)

  • Ошибка в MultiIndex.get_level_values включая Categorical вызывает AttributeError (GH 10460)

  • Ошибка в pd.get_dummies с sparse=True не возвращает SparseDataFrame (GH 10531)

  • Ошибка в Index подтипы (такие как PeriodIndex) не возвращает свой собственный тип для .drop и .insert методы (GH 10620)

  • Ошибка в algos.outer_join_indexer когда right массив пуст (GH 10618)

  • Ошибка в filter (регрессия с версии 0.16.0) и transform при группировке по нескольким ключам, один из которых является датой-временем (GH 10114)

  • Ошибка в to_datetime и to_timedelta вызывая Index имя будет потеряно (GH 10875)

  • Ошибка в len(DataFrame.groupby) вызывая IndexError когда есть столбец, содержащий только NaN (GH 11016)

  • Ошибка, вызывавшая segfault при ресемплинге пустого Series (GH 10228)

  • Ошибка в DatetimeIndex и PeriodIndex.value_counts сбрасывает имя из своего результата, но сохраняет в результате Index. (GH 10150)

  • Ошибка в pd.eval используя numexpr движок преобразует 1-элементный массив numpy в скаляр (GH 10546)

  • Ошибка в pd.concat с axis=0 когда столбец имеет тип данных category (GH 10177)

  • Ошибка в read_msgpack где тип ввода не всегда проверяется (GH 10369, GH 10630)

  • Ошибка в pd.read_csv с kwargs index_col=False, index_col=['a', 'b'] или dtype (GH 10413, GH 10467, GH 10577)

  • Ошибка в Series.from_csv с header kwarg не устанавливает Series.name или Series.index.name (GH 10483)

  • Ошибка в groupby.var что приводило к неточности дисперсии для малых значений с плавающей точкой (GH 10448)

  • Ошибка в Series.plot(kind='hist') Метка Y не информативна (GH 10485)

  • Ошибка в read_csv при использовании конвертера, который генерирует uint8 тип (GH 9266)

  • Ошибка вызывает утечку памяти в линейных и площадных графиках временных рядов (GH 9003)

  • Ошибка при установке Panel разрезанный вдоль основной или второстепенной оси, когда правая сторона является DataFrame (GH 11014)

  • Ошибка, которая возвращает None и не вызывает NotImplementedError когда операторные функции (например, .add) из Panel не реализованы (GH 7692)

  • Ошибка в линейном и kde графике: не может принимать несколько цветов, когда subplots=True (GH 9894)

  • Ошибка в DataFrame.plot вызывает ValueError когда имя цвета задано несколькими символами (GH 10387)

  • Ошибка в левом и правом align of Series с MultiIndex может быть инвертирован (GH 10665)

  • Ошибка в левом и правом join of с MultiIndex может быть инвертирован (GH 10741)

  • Ошибка в read_stata при чтении файла с другим порядком, установленным в columns (GH 10757)

  • Ошибка в Categorical может неправильно представлять, когда категория содержит tz или Period (GH 10713)

  • Ошибка в Categorical.__iter__ может не возвращать корректный datetime и Period (GH 10713)

  • Ошибка при индексации с PeriodIndex на объекте с PeriodIndex (GH 4125)

  • Ошибка в read_csv с engine='c': EOF, предшествующий комментарию, пустой строке и т.д., обрабатывался некорректно (GH 10728, GH 10548)

  • Чтение данных “famafrench” через DataReader приводит к ошибке HTTP 404 из-за изменения URL веб-сайта (GH 10591).

  • Ошибка в read_msgpack где DataFrame для декодирования имеет повторяющиеся имена столбцов (GH 9618)

  • Ошибка в io.common.get_filepath_or_buffer что приводило к сбою чтения корректных файлов S3, если в бакете также содержались ключи, для которых у пользователя нет прав на чтение (GH 10604)

  • Ошибка в векторизованной установке столбцов с метками времени с использованием python datetime.date и numpy datetime64 (GH 10408, GH 10412)

  • Ошибка в Index.take может добавить ненужные freq атрибут (GH 10791)

  • Ошибка в merge с пустым DataFrame может вызывать IndexError (GH 10824)

  • Ошибка в to_latex где неожиданный ключевой аргумент для некоторых документированных аргументов (GH 10888)

  • Ошибка при индексации больших DataFrame где IndexError не перехватывается (GH 10645 и GH 10692)

  • Ошибка в read_csv при использовании nrows или chunksize параметры, если файл содержит только строку заголовка (GH 9535)

  • Ошибка в сериализации category типы в HDF5 при наличии альтернативных кодировок. (GH 10366)

  • Ошибка в pd.DataFrame при создании пустого DataFrame со строковым типом данных (GH 9428)

  • Ошибка в pd.DataFrame.diff когда DataFrame не консолидирован (GH 10907)

  • Ошибка в pd.unique для массивов с datetime64 или timedelta64 dtype, из-за которого возвращался массив с object dtype вместо исходного dtype (GH 9431)

  • Ошибка в Timedelta вызывая ошибку при срезе с 0с (GH 10583)

  • Ошибка в DatetimeIndex.take и TimedeltaIndex.take может не вызывать IndexError против недопустимого индекса (GH 10295)

  • Ошибка в Series([np.nan]).astype('M8[ms]'), который теперь возвращает Series([pd.NaT]) (GH 10747)

  • Ошибка в PeriodIndex.order сброс частоты (GH 10295)

  • Ошибка в date_range когда freq делит end в наносекундах (GH 10885)

  • Ошибка в iloc позволяя обращаться к памяти за пределами Series с отрицательными целыми числами (GH 10779)

  • Ошибка в read_msgpack где кодировка не соблюдается (GH 10581)

  • Ошибка, препятствующая доступу к первому индексу при использовании iloc со списком, содержащим соответствующее отрицательное целое число (GH 10547, GH 10779)

  • Ошибка в TimedeltaIndex форматтер вызывает ошибку при попытке сохранить DataFrame с TimedeltaIndex используя to_csv (GH 10833)

  • Ошибка в DataFrame.where при обработке срезов Series (GH 10218, GH 9558)

  • Ошибка, где pd.read_gbq выбрасывает ValueError когда Bigquery возвращает ноль строк (GH 10273)

  • Ошибка в to_json что вызывало ошибку сегментации при сериализации ndarray ранга 0 (GH 9576)

  • Ошибка в функциях построения графиков может вызвать IndexError при построении на GridSpec (GH 10819)

  • Ошибка в графике может показывать ненужные подписи второстепенных делений (GH 10657)

  • Ошибка в groupby некорректное вычисление для агрегации на DataFrame с NaT (Например first, last, min). (GH 10590, GH 11010)

  • Ошибка при создании DataFrame где передача словаря только со скалярными значениями и указание столбцов не вызывало ошибку (GH 10856)

  • Ошибка в .var() вызывая ошибки округления для очень похожих значений (GH 10242)

  • Ошибка в DataFrame.plot(subplots=True) с дублированными столбцами выдает некорректный результат (GH 10962)

  • Ошибка в Index арифметические операции могут привести к некорректному классу (GH 10638)

  • Ошибка в date_range приводит к пустому результату, если частота отрицательная ежегодно, ежеквартально и ежемесячно (GH 11018)

  • Ошибка в DatetimeIndex не может определить отрицательную частоту (GH 11018)

  • Удалено использование некоторых устаревших операций сравнения NumPy, в основном в тестах. (GH 10569)

  • Ошибка в Index тип данных может применяться некорректно (GH 11017)

  • Ошибка в io.gbq при проверке минимальной версии клиента google api (GH 10652)

  • Ошибка в DataFrame создание из вложенных dict с timedelta ключи (GH 11129)

  • Ошибка в .fillna против может вызвать TypeError когда данные содержат тип datetime (GH 7095, GH 11153)

  • Ошибка в .groupby когда количество ключей для группировки совпадает с длиной индекса (GH 11185)

  • Ошибка в convert_objects где преобразованные значения могут не возвращаться, если все null и coerce (GH 9589)

  • Ошибка в convert_objects где copy ключевое слово не учитывалось (GH 9589)

Участники#

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

  • Алекс Ротберг

  • Andrea Bedini +

  • Andrew Rosenfeld

  • Andy Hayden

  • #N/A

  • Anthonios Partheniou +

  • Artemy Kolchinsky

  • Bernard Willers

  • Charlie Clark +

  • Chris +

  • Крис Уилан

  • Christoph Gohlke +

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

  • Clark Fitzgerald

  • Clearfield Christopher +

  • Dan Ringwalt +

  • Daniel Ni +

  • Эксперт по данным и коду, экспериментирующий с кодом на данных +

  • David Cottrell

  • David John Gagne +

  • David Kelly +

  • ETF +

  • Eduardo Schettino +

  • Egor +

  • Egor Panfilov +

  • Evan Wright

  • Frank Pinter +

  • Gabriel Araujo +

  • Garrett-R

  • Gianluca Rossi +

  • Guillaume Gay

  • Guillaume Poulin

  • Harsh Nisar +

  • Ian Henriksen +

  • Ian Hoegen +

  • Джайдев Дешпанде +

  • Jan Rudolph +

  • Ян Шульц

  • Jason Swails +

  • Jeff Reback

  • Jonas Buyl +

  • Joris Van den Bossche

  • Joris Vankerschaver +

  • Josh Levy-Kramer +

  • Жюльен Данжу

  • Ka Wo Chen

  • Karrie Kehoe +

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

  • Керби Шедден

  • Кевин Шеппард

  • Lars Buitinck

  • Leif Johnson +

  • Луис Ортис +

  • Mac +

  • Matt Gambogi +

  • Мэтт Савой +

  • Matthew Gilbert +

  • Maximilian Roos +

  • Микеланджело Д’Агостино +

  • Mortada Mehyar

  • Nick Eubank

  • Nipun Batra

  • Ondřej Čertík

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

  • Pratap Vardhan +

  • Rafal Skolasinski +

  • Richard Lewis +

  • Rinoc Johnson +

  • Rob Levy

  • Robert Gieseke

  • Safia Abdalla +

  • Samuel Denny +

  • Saumitra Shahapure +

  • Sebastian Pölsterl +

  • Себастьян Рубберт +

  • Шеппард, Кевин +

  • Sinhrks

  • Siu Kwan Lam +

  • Skipper Seabold

  • Spencer Carrucciu +

  • Stephan Hoyer

  • Stephen Hoover +

  • Stephen Pascoe +

  • Терри Сантегоедс +

  • Томас Грейнджер

  • Tjerk Santegoeds +

  • Tom Augspurger

  • Vincent Davis +

  • Winterflower +

  • Yaroslav Halchenko

  • Yuan Tang (Terry) +

  • agijsberts

  • ajcr +

  • behzad nouri

  • cel4

  • chris-b1 +

  • cyrusmaher +

  • davidovitch +

  • ganego +

  • jreback

  • juricast +

  • larvian +

  • maximilianr +

  • msund +

  • rekcahpassyla

  • robertzk +

  • scls19fr

  • seth-p

  • sinhrks

  • springcoil +

  • terrytangyuan +

  • tzinckgraf +