Что нового в 1.3.0 (2 июля 2021)#

Это изменения в pandas 1.3.0. См. Примечания к выпуску для полного списка изменений, включая другие версии pandas.

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

При чтении нового Excel 2007+ (.xlsx) файлов, аргумент по умолчанию engine=None to read_excel() теперь приведёт к использованию openpyxl движок во всех случаях, когда опция io.excel.xlsx.reader установлено в "auto". Ранее в некоторых случаях использовался xlrd движок вместо. См. Что нового 1.2.0 для получения дополнительной информации об этом изменении.

Улучшения#

Пользовательские HTTP(s)-заголовки при чтении csv или json файлов#

При чтении с удалённого URL, не обрабатываемого fsspec (например, HTTP и HTTPS), словарь, переданный в storage_options будет использоваться для создания заголовков, включенных в запрос. Это можно использовать для управления заголовком User-Agent или отправки других пользовательских заголовков (GH 36688). Например:

In [1]: headers = {"User-Agent": "pandas"}
In [2]: df = pd.read_csv(
   ...:     "https://download.bls.gov/pub/time.series/cu/cu.item",
   ...:     sep="\t",
   ...:     storage_options=headers
   ...: )

Чтение и запись XML-документов#

Мы добавили поддержку ввода-вывода для чтения и отображения упрощенных версий XML документы с read_xml() и DataFrame.to_xml(). Использование lxml в качестве парсера, доступны как XPath 1.0, так и XSLT 1.0. (GH 27554)

In [1]: xml = """
   ...: 
   ...:  
   ...:     square
   ...:     360
   ...:     4.0
   ...:  
   ...:  
   ...:     circle
   ...:     360
   ...:     
   ...:  
   ...:  
   ...:     triangle
   ...:     180
   ...:     3.0
   ...:  
   ...:  """

In [2]: df = pd.read_xml(xml)
In [3]: df
Out[3]:
      shape  degrees  sides
0    square      360    4.0
1    circle      360    NaN
2  triangle      180    3.0

In [4]: df.to_xml()
Out[4]:


  
    0
    square
    360
    4.0
  
  
    1
    circle
    360
    
  
  
    2
    triangle
    180
    3.0
  

Для получения дополнительной информации см. Запись XML в руководстве пользователя по инструментам ввода-вывода.

Улучшения Styler#

Мы провели целенаправленную разработку Styler. См. также Документация Styler который был пересмотрен и улучшен (GH 39720, GH 39317, GH 40493).

  • Метод Styler.set_table_styles() теперь может принимать более естественный язык CSS для аргументов, такой как 'color:red;' вместо [('color', 'red')] (GH 39563)

  • Методы Styler.highlight_null(), Styler.highlight_min(), и Styler.highlight_max() теперь позволяют использовать пользовательскую CSS-подсветку вместо стандартной цветовой заливки фона (GH 40242)

  • Styler.apply() теперь принимает функции, которые возвращают ndarray когда axis=None, делая его теперь согласованным с axis=0 и axis=1 поведение (GH 39359)

  • Когда некорректно отформатированный CSS передаётся через Styler.apply() или Styler.applymap(), теперь при рендеринге возникает ошибка (GH 39660)

  • Styler.format() теперь принимает аргумент ключевого слова escape для опционального экранирования HTML и LaTeX (GH 40388, GH 41619)

  • Styler.background_gradient() получил аргумент gmap для предоставления конкретной карты градиента для затенения (GH 22727)

  • Styler.clear() теперь очищает Styler.hidden_index и Styler.hidden_columns а также (GH 40484)

  • Добавлен метод Styler.highlight_between() (GH 39821)

  • Добавлен метод Styler.highlight_quantile() (GH 40926)

  • Добавлен метод Styler.text_gradient() (GH 41098)

  • Добавлен метод Styler.set_tooltips() для включения всплывающих подсказок; это может использоваться для улучшения интерактивных отображений (GH 21266, GH 40284)

  • Добавлен параметр precision в метод Styler.format() для управления отображением чисел с плавающей точкой (GH 40134)

  • Styler сгенерированный HTML-вывод теперь следует Руководство по стилю HTML w3 (GH 39626)

  • Многие функции Styler класс теперь либо частично, либо полностью применим к DataFrame с неуникальными индексами или столбцами (GH 41143)

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

  • Добавлена опция styler.render.max_elements чтобы избежать перегрузки браузера при стилизации больших DataFrames (GH 40712)

  • Добавлен метод Styler.to_latex() (GH 21673, GH 42320), который также позволяет ограниченное преобразование CSS (GH 40731)

  • Добавлен метод Styler.to_html() (GH 13379)

  • Добавлен метод Styler.set_sticky() чтобы сделать заголовки индекса и столбцов постоянно видимыми в прокручиваемых HTML-фреймах (GH 29072)

Конструктор DataFrame учитывает copy=False с словарем#

При передаче словаря в DataFrame с copy=False, копия больше не будет создаваться (GH 32960).

In [1]: arr = np.array([1, 2, 3])

In [2]: df = pd.DataFrame({"A": arr, "B": arr.copy()}, copy=False)

In [3]: df
Out[3]: 
   A  B
0  1  1
1  2  2
2  3  3

df["A"] остается представлением arr:

In [4]: arr[0] = 0

In [5]: assert df.iloc[0, 0] == 0

Поведение по умолчанию при непередаче copy останется неизменным, т.е. будет создана копия.

Тип данных строк с поддержкой PyArrow#

Мы улучшили StringDtype, тип расширения, предназначенный для строковых данных. (GH 39908)

Теперь можно указать storage ключевой параметр для StringDtype. Используйте параметры pandas или укажите тип данных с помощью dtype='string[pyarrow]' чтобы позволить StringArray поддерживаться массивом PyArrow вместо массива NumPy объектов Python.

StringArray на основе PyArrow требует установки pyarrow версии 1.0.0 или выше.

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

string[pyarrow] в настоящее время считается экспериментальным. Реализация и части API могут измениться без предупреждения.

In [6]: pd.Series(['abc', None, 'def'], dtype=pd.StringDtype(storage="pyarrow"))
Out[6]: 
0     abc
1    
2     def
dtype: string

Вы можете использовать псевдоним "string[pyarrow]" также.

In [7]: s = pd.Series(['abc', None, 'def'], dtype="string[pyarrow]")

In [8]: s
Out[8]: 
0     abc
1    
2     def
dtype: string

Вы также можете создать массив строк на основе PyArrow с помощью опций pandas.

In [9]: with pd.option_context("string_storage", "pyarrow"):
   ...:     s = pd.Series(['abc', None, 'def'], dtype="string")
   ...: 

In [10]: s
Out[10]: 
0     abc
1    
2     def
dtype: string

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

In [11]: s.str.upper()
Out[11]: 
0     ABC
1    
2     DEF
dtype: string

In [12]: s.str.split('b', expand=True).dtypes
Out[12]: 
0    string[pyarrow]
1    string[pyarrow]
dtype: object

Методы строкового аксессора, возвращающие целые числа, будут возвращать значение с Int64Dtype

In [13]: s.str.count("a")
Out[13]: 
0       1
1    
2       0
dtype: Int64

Центрированные скользящие окна с датой и временем#

При выполнении скользящих вычислений на объектах DataFrame и Series с индексом, похожим на дату и время, теперь можно использовать центрированное окно, похожее на дату и время (GH 38780). Например:

In [14]: df = pd.DataFrame(
   ....:     {"A": [0, 1, 2, 3, 4]}, index=pd.date_range("2020", periods=5, freq="1D")
   ....: )
   ....: 

In [15]: df
Out[15]: 
            A
2020-01-01  0
2020-01-02  1
2020-01-03  2
2020-01-04  3
2020-01-05  4

In [16]: df.rolling("2D", center=True).mean()
Out[16]: 
              A
2020-01-01  0.5
2020-01-02  1.5
2020-01-03  2.5
2020-01-04  3.5
2020-01-05  4.0

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

  • DataFrame.rolling(), Series.rolling(), DataFrame.expanding(), и Series.expanding() теперь поддерживает method аргумент с 'table' опция, которая выполняет оконную операцию по всему DataFrame. См. Обзор оконных функций для производительности и функциональных преимуществ (GH 15095, GH 38995)

  • ExponentialMovingWindow теперь поддерживает online метод, который может выполнять mean вычисления в онлайн-режиме. См. Обзор оконных функций (GH 41673)

  • Добавлен MultiIndex.dtypes() (GH 37062)

  • Добавлен end и end_day параметры для origin аргумент в DataFrame.resample() (GH 37804)

  • Улучшенное сообщение об ошибке, когда usecols и names не соответствуют для read_csv() и engine="c" (GH 29042)

  • Улучшена согласованность сообщений об ошибках при передаче недопустимого win_type аргумент в Методы окна (GH 15969)

  • read_sql_query() теперь принимает dtype аргумент для преобразования столбцовых данных из базы данных SQL на основе пользовательского ввода (GH 10285)

  • read_csv() теперь вызывает ParserWarning если длина заголовка или заданных имен не соответствует длине данных, когда usecols не указан (GH 21768)

  • Улучшено сопоставление целочисленных типов из pandas в SQLAlchemy при использовании DataFrame.to_sql() (GH 35076)

  • to_numeric() теперь поддерживает понижающее преобразование nullable ExtensionDtype объекты (GH 33013)

  • Добавлена поддержка dict-подобных имен в MultiIndex.set_names и MultiIndex.rename (GH 20421)

  • read_excel() теперь может автоматически определять файлы .xlsb и старые файлы .xls (GH 35416, GH 41225)

  • ExcelWriter теперь принимает if_sheet_exists параметр для управления поведением режима добавления при записи в существующие листы (GH 40230)

  • Rolling.sum(), Expanding.sum(), Rolling.mean(), Expanding.mean(), ExponentialMovingWindow.mean(), Rolling.median(), Expanding.median(), Rolling.max(), Expanding.max(), Rolling.min(), и Expanding.min() теперь поддерживает Numba выполнение с помощью engine ключевое слово (GH 38895, GH 41267)

  • DataFrame.apply() теперь может принимать унарные операторы NumPy в виде строк, например df.apply("sqrt"), что уже было для Series.apply() (GH 39116)

  • DataFrame.apply() теперь может принимать невызываемые свойства DataFrame в виде строк, например df.apply("size"), что уже было для Series.apply() (GH 39116)

  • DataFrame.applymap() теперь может принимать kwargs для передачи пользовательскому func (GH 39987)

  • Передача DataFrame индексатор для iloc теперь запрещено для Series.__getitem__() и DataFrame.__getitem__() (GH 39004)

  • Series.apply() теперь может принимать аргументы, похожие на списки или словари, но не являющиеся списками или словарями, например ser.apply(np.array(["sum", "mean"])), что уже было для DataFrame.apply() (GH 39140)

  • DataFrame.plot.scatter() теперь может принимать категориальный столбец для аргумента c (GH 12380, GH 31357)

  • Series.loc() теперь вызывает полезное сообщение об ошибке, когда Series имеет MultiIndex и индексатор имеет слишком много измерений (GH 35349)

  • read_stata() теперь поддерживает чтение данных из сжатых файлов (GH 26599)

  • Добавлена поддержка парсинга ISO 8601-подобные временные метки с отрицательными знаками в Timedelta (GH 37172)

  • Добавлена поддержка унарных операторов в FloatingArray (GH 38749)

  • RangeIndex теперь может быть создан путём передачи range объект напрямую, например, pd.RangeIndex(range(3)) (GH 12067)

  • Series.round() и DataFrame.round() теперь работают с обнуляемыми целочисленными и плавающими типами данных (GH 38844)

  • read_csv() и read_json() предоставить аргумент encoding_errors для управления обработкой ошибок кодирования (GH 39450)

  • DataFrameGroupBy.any(), SeriesGroupBy.any(), DataFrameGroupBy.all(), и SeriesGroupBy.all() использовать логику Клини с нуллифицируемыми типами данных (GH 37506)

  • DataFrameGroupBy.any(), SeriesGroupBy.any(), DataFrameGroupBy.all(), и SeriesGroupBy.all() возвращает BooleanDtype для столбцов с обнуляемыми типами данных (GH 33449)

  • DataFrameGroupBy.any(), SeriesGroupBy.any(), DataFrameGroupBy.all(), и SeriesGroupBy.all() вызов исключения с object данные, содержащие pd.NA даже когда skipna=True (GH 37501)

  • DataFrameGroupBy.rank() и SeriesGroupBy.rank() теперь поддерживает данные типа object-dtype (GH 38278)

  • Создание DataFrame или Series с data аргумент является итерируемым объектом Python, который не NumPy ndarray состоящий из скаляров NumPy теперь приведёт к dtype с точностью, равной максимальной из скаляров NumPy; это уже было так, когда data является NumPy ndarray (GH 40908)

  • Добавить ключевое слово sort to pivot_table() чтобы разрешить несортировку результата (GH 39143)

  • Добавить ключевое слово dropna to DataFrame.value_counts() чтобы позволить подсчет строк, включающих NA значения (GH 41325)

  • Series.replace() теперь будет приводить результаты к PeriodDtype где возможно, вместо object тип данных (GH 41526)

  • Улучшенное сообщение об ошибке в corr и cov методы на Rolling, Expanding, и ExponentialMovingWindow когда other не является DataFrame или Series (GH 41741)

  • Series.between() теперь может принимать left или right в качестве аргументов для inclusive чтобы включить только левую или правую границу (GH 40245)

  • DataFrame.explode() теперь поддерживает взрыв нескольких столбцов. Его column аргумент теперь также принимает список str или кортежей для одновременного разворачивания нескольких столбцов (GH 39240)

  • DataFrame.sample() теперь принимает ignore_index аргумент для сброса индекса после выборки, аналогично DataFrame.drop_duplicates() и DataFrame.sort_values() (GH 38581)

Значительные исправления ошибок#

Это исправления ошибок, которые могут привести к заметным изменениям в поведении.

Categorical.unique теперь всегда сохраняет тот же dtype, что и исходный#

Ранее, при вызове Categorical.unique() с категориальными данными, неиспользуемые категории в новом массиве будут удалены, что делает dtype нового массива отличным от исходного (GH 18291)

В качестве примера, учитывая:

In [17]: dtype = pd.CategoricalDtype(['bad', 'neutral', 'good'], ordered=True)

In [18]: cat = pd.Categorical(['good', 'good', 'bad', 'bad'], dtype=dtype)

In [19]: original = pd.Series(cat)

In [20]: unique = original.unique()

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

In [1]: unique
['good', 'bad']
Categories (2, object): ['bad' < 'good']
In [2]: original.dtype == unique.dtype
False

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

In [21]: unique
Out[21]: 
['good', 'bad']
Categories (3, object): ['bad' < 'neutral' < 'good']

In [22]: original.dtype == unique.dtype
Out[22]: True

Сохранение типов данных в DataFrame.combine_first()#

DataFrame.combine_first() теперь будет сохранять типы данных (GH 7509)

In [23]: df1 = pd.DataFrame({"A": [1, 2, 3], "B": [1, 2, 3]}, index=[0, 1, 2])

In [24]: df1
Out[24]: 
   A  B
0  1  1
1  2  2
2  3  3

In [25]: df2 = pd.DataFrame({"B": [4, 5, 6], "C": [1, 2, 3]}, index=[2, 3, 4])

In [26]: df2
Out[26]: 
   B  C
2  4  1
3  5  2
4  6  3

In [27]: combined = df1.combine_first(df2)

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

In [1]: combined.dtypes
Out[2]:
A    float64
B    float64
C    float64
dtype: object

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

In [28]: combined.dtypes
Out[28]: 
A    float64
B      int64
C    float64
dtype: object

Методы группировки agg и transform больше не изменяют тип возвращаемых данных для вызываемых объектов#

Ранее методы DataFrameGroupBy.aggregate(), SeriesGroupBy.aggregate(), DataFrameGroupBy.transform(), и SeriesGroupBy.transform() может привести к изменению типа данных результата, когда аргумент func является вызываемым, что может привести к нежелательным результатам (GH 21240). Приведение будет происходить, если результат числовой и приведение обратно к исходному типу данных не изменяет никакие значения, измеренные с помощью np.allclose. Теперь такое приведение не происходит.

In [29]: df = pd.DataFrame({'key': [1, 1], 'a': [True, False], 'b': [True, True]})

In [30]: df
Out[30]: 
   key      a     b
0    1   True  True
1    1  False  True

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

In [5]: df.groupby('key').agg(lambda x: x.sum())
Out[5]:
        a  b
key
1    True  2

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

In [31]: df.groupby('key').agg(lambda x: x.sum())
Out[31]: 
     a  b
key      
1    1  2

float результат для DataFrameGroupBy.mean(), DataFrameGroupBy.median(), и GDataFrameGroupBy.var(), SeriesGroupBy.mean(), SeriesGroupBy.median(), и SeriesGroupBy.var()#

Ранее эти методы могли приводить к разным типам данных в зависимости от входных значений. Теперь эти методы всегда будут возвращать тип данных float. (GH 41137)

In [32]: df = pd.DataFrame({'a': [True], 'b': [1], 'c': [1.0]})

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

In [5]: df.groupby(df.index).mean()
Out[5]:
        a  b    c
0    True  1  1.0

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

In [33]: df.groupby(df.index).mean()
Out[33]: 
     a    b    c
0  1.0  1.0  1.0

Попробовать выполнить операцию на месте при установке значений с loc и iloc#

При установке всего столбца с помощью loc или iloc, pandas попытается вставить значения в существующие данные, а не создавать полностью новый массив.

In [34]: df = pd.DataFrame(range(3), columns=["A"], dtype="float64")

In [35]: values = df.values

In [36]: new = np.array([5, 6, 7], dtype="int64")

In [37]: df.loc[[0, 1, 2], "A"] = new

Как в новом, так и в старом поведении данные в values перезаписывается, но в старом поведении тип данных df["A"] изменено на int64.

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

In [1]: df.dtypes
Out[1]:
A    int64
dtype: object
In [2]: np.shares_memory(df["A"].values, new)
Out[2]: False
In [3]: np.shares_memory(df["A"].values, values)
Out[3]: False

В pandas 1.3.0, df продолжает делиться данными с values

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

In [38]: df.dtypes
Out[38]: 
A    float64
dtype: object

In [39]: np.shares_memory(df["A"], new)
Out[39]: False

In [40]: np.shares_memory(df["A"], values)
Out[40]: True

Никогда не выполняйте операцию на месте при установке frame[keys] = values#

При установке нескольких столбцов с помощью frame[keys] = values новые массивы заменят существующие массивы для этих ключей, что не будет перезаписан (GH 39510). В результате столбцы сохранят тип(ы) данных values, никогда не приводя к типам данных существующих массивов.

In [41]: df = pd.DataFrame(range(3), columns=["A"], dtype="float64")

In [42]: df[["A"]] = 5

В старом поведении, 5 был приведен к float64 и вставлены в существующий массив, лежащий в основе df:

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

In [1]: df.dtypes
Out[1]:
A    float64

В новом поведении мы получаем новый массив и сохраняем целочисленный тип данных 5:

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

In [43]: df.dtypes
Out[43]: 
A    int64
dtype: object

Согласованное приведение типов при установке в Boolean Series#

Установка небулевых значений в Series с dtype=bool теперь последовательно приводит к dtype=object (GH 38709)

In [1]: orig = pd.Series([True, False])

In [2]: ser = orig.copy()

In [3]: ser.iloc[1] = np.nan

In [4]: ser2 = orig.copy()

In [5]: ser2.iloc[1] = 2.0

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

In [1]: ser
Out [1]:
0    1.0
1    NaN
dtype: float64

In [2]:ser2
Out [2]:
0    True
1     2.0
dtype: object

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

In [1]: ser
Out [1]:
0    True
1     NaN
dtype: object

In [2]:ser2
Out [2]:
0    True
1     2.0
dtype: object

DataFrameGroupBy.rolling и SeriesGroupBy.rolling больше не возвращают сгруппированный столбец в значениях#

Столбец группировки теперь будет удален из результата groupby.rolling операция (GH 32262)

In [44]: df = pd.DataFrame({"A": [1, 1, 2, 3], "B": [0, 1, 2, 3]})

In [45]: df
Out[45]: 
   A  B
0  1  0
1  1  1
2  2  2
3  3  3

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

In [1]: df.groupby("A").rolling(2).sum()
Out[1]:
       A    B
A
1 0  NaN  NaN
1    2.0  1.0
2 2  NaN  NaN
3 3  NaN  NaN

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

In [46]: df.groupby("A").rolling(2).sum()
Out[46]: 
       B
A       
1 0  NaN
  1  1.0
2 2  NaN
3 3  NaN

Удалено искусственное усечение в скользящей дисперсии и стандартном отклонении#

Rolling.std() и Rolling.var() больше не будет искусственно обрезать результаты, которые меньше ~1e-8 и ~1e-15 соответственно до нуля (GH 37051, GH 40448, GH 39872).

Однако теперь в результатах могут присутствовать артефакты с плавающей точкой при прокатке больших значений.

In [47]: s = pd.Series([7, 5, 5, 5])

In [48]: s.rolling(3).var()
Out[48]: 
0         NaN
1         NaN
2    1.333333
3    0.000000
dtype: float64

DataFrameGroupBy.rolling и SeriesGroupBy.rolling с MultiIndex больше не удаляют уровни в результате#

DataFrameGroupBy.rolling() и SeriesGroupBy.rolling() больше не будет удалять уровни DataFrame с MultiIndex в результате. Это может привести к воспринимаемому дублированию уровней в результирующем MultiIndex, но это изменение восстанавливает поведение, которое присутствовало в версии 1.1.3 (GH 38787, GH 38523).

In [49]: index = pd.MultiIndex.from_tuples([('idx1', 'idx2')], names=['label1', 'label2'])

In [50]: df = pd.DataFrame({'a': [1], 'b': [2]}, index=index)

In [51]: df
Out[51]: 
               a  b
label1 label2      
idx1   idx2    1  2

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

In [1]: df.groupby('label1').rolling(1).sum()
Out[1]:
          a    b
label1
idx1    1.0  2.0

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

In [52]: df.groupby('label1').rolling(1).sum()
Out[52]: 
                        a    b
label1 label1 label2          
idx1   idx1   idx2    1.0  2.0

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

Повышенные минимальные версии для зависимостей#

Некоторые минимальные поддерживаемые версии зависимостей были обновлены. Если установлены, теперь требуются:

Пакет

Минимальная версия

Обязательно

Изменено

numpy

1.17.3

X

X

pytz

2017.3

X

python-dateutil

2.7.3

X

bottleneck

1.2.1

numexpr

2.7.0

X

pytest (разработка)

6.0

X

mypy (dev)

0.812

X

setuptools

38.6.0

X

Для дополнительные библиотеки общая рекомендация — использовать последнюю версию. Следующая таблица перечисляет минимальную версию для каждой библиотеки, которая в настоящее время тестируется в ходе разработки pandas. Опциональные библиотеки ниже минимальной тестируемой версии могут всё ещё работать, но не считаются поддерживаемыми.

Пакет

Минимальная версия

Изменено

beautifulsoup4

4.6.0

fastparquet

0.4.0

X

fsspec

0.7.4

gcsfs

0.6.0

lxml

4.3.0

matplotlib

2.2.3

numba

0.46.0

openpyxl

3.0.0

X

pyarrow

0.17.0

X

pymysql

0.8.1

X

pytables

3.5.1

s3fs

0.4.0

scipy

1.2.0

sqlalchemy

1.3.0

X

tabulate

0.8.7

X

xarray

0.12.0

xlrd

1.2.0

xlsxwriter

1.0.2

xlwt

1.3.0

pandas-gbq

0.12.0

См. Зависимости и Необязательные зависимости подробнее.

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

  • Частично инициализированный CategoricalDtype объектов (т.е. тех, которые имеют categories=None) больше не будет сравниваться как равный полностью инициализированным объектам dtype (GH 38516)

  • Доступ к _constructor_expanddim на DataFrame и _constructor_sliced на Series теперь вызывает AttributeError. Ранее NotImplementedError был поднят (GH 38782)

  • Добавлен новый engine и **engine_kwargs параметры для DataFrame.to_sql() для поддержки других будущих "SQL-движков". В настоящее время мы по-прежнему используем только SQLAlchemy внутренне, но планируется поддержка дополнительных механизмов, таких как turbodbc (GH 36893)

  • Удалено избыточное freq из PeriodIndex строковое представление (GH 41653)

  • ExtensionDtype.construct_array_type() теперь является обязательным методом вместо необязательного для ExtensionDtype подклассы (GH 24860)

  • Вызов hash на нехешируемых объектах pandas теперь будет вызываться TypeError со встроенным сообщением об ошибке (например, unhashable type: 'Series'). Ранее вызывалось пользовательское сообщение, например 'Series' objects are mutable, thus they cannot be hashed. Кроме того, isinstance(, abc.collections.Hashable) теперь вернет False (GH 40013)

  • Styler.from_custom_template() теперь имеет два новых аргумента для имен шаблонов и удалил старый name, из-за введения наследования шаблонов для лучшего парсинга (GH 42053). Также требуются модификации подклассов для атрибутов Styler.

Сборка#

  • Документация в .pptx и .pdf форматы больше не включены в wheels или исходные дистрибутивы. (GH 30741)

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

Устаревшее удаление нежелательных столбцов в редукциях DataFrame и операциях DataFrameGroupBy#

Вызов редукции (например, .min, .max, .sum) на DataFrame с numeric_only=None (по умолчанию), столбцы, где редукция вызывает TypeError тихо игнорируются и удаляются из результата.

Это поведение устарело. В будущей версии TypeError будет вызвано, и пользователям потребуется выбрать только допустимые столбцы перед вызовом функции.

Например:

In [53]: df = pd.DataFrame({"A": [1, 2, 3, 4], "B": pd.date_range("2016-01-01", periods=4)})

In [54]: df
Out[54]: 
   A          B
0  1 2016-01-01
1  2 2016-01-02
2  3 2016-01-03
3  4 2016-01-04

Старое поведение:

In [3]: df.prod()
Out[3]:
Out[3]:
A    24
dtype: int64

Будущее поведение:

In [4]: df.prod()
...
TypeError: 'DatetimeArray' does not implement reduction 'prod'

In [5]: df[["A"]].prod()
Out[5]:
A    24
dtype: int64

Аналогично, при применении функции к DataFrameGroupBy, столбцы, на которых функция вызывает исключение TypeError в настоящее время молча игнорируются и удаляются из результата.

Это поведение устарело. В будущей версии TypeError будет вызвано, и пользователям нужно будет выбрать только допустимые столбцы перед вызовом функции.

Например:

In [55]: df = pd.DataFrame({"A": [1, 2, 3, 4], "B": pd.date_range("2016-01-01", periods=4)})

In [56]: gb = df.groupby([1, 1, 2, 2])

Старое поведение:

In [4]: gb.prod(numeric_only=False)
Out[4]:
A
1   2
2  12

Будущее поведение:

In [5]: gb.prod(numeric_only=False)
...
TypeError: datetime64 type does not support prod operations

In [6]: gb[["A"]].prod(numeric_only=False)
Out[6]:
    A
1   2
2  12

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

  • Устарело: разрешение передачи скаляров в Categorical конструктор (GH 38433)

  • Устаревшее построение CategoricalIndex без передачи list-like данных (GH 38944)

  • Устарело разрешение аргументов ключевых слов, специфичных для подкласса, в Index конструктор, используйте конкретный подкласс напрямую вместо этого (GH 14093, GH 21311, GH 22315, GH 26974)

  • Устарел astype() метод даты-времени (timedelta64[ns], datetime64[ns], Datetime64TZDtype, PeriodDtype) для преобразования в целочисленные типы данных, используйте values.view(...) вместо (GH 38544). Это устаревание было позже отменено в pandas 1.4.0.

  • Устаревший MultiIndex.is_lexsorted() и MultiIndex.lexsort_depth(), используйте MultiIndex.is_monotonic_increasing() вместо (GH 32259)

  • Устаревшее ключевое слово try_cast в Series.where(), Series.mask(), DataFrame.where(), DataFrame.mask(); при необходимости преобразуйте результаты вручную (GH 38836)

  • Устаревшее сравнение Timestamp объекты с datetime.date объекты. Вместо, например, ts <= mydate использовать ts <= pd.Timestamp(mydate) или ts.date() <= mydate (GH 36131)

  • Устаревший Rolling.win_type возвращая "freq" (GH 38963)

  • Устаревший Rolling.is_datetimelike (GH 38963)

  • Устаревший DataFrame индексатор для Series.__setitem__() и DataFrame.__setitem__() (GH 39004)

  • Устаревший ExponentialMovingWindow.vol() (GH 39220)

  • Используя .astype для преобразования между datetime64[ns] dtype и DatetimeTZDtype устарело и будет вызывать ошибку в будущей версии, используйте obj.tz_localize или obj.dt.tz_localize вместо (GH 38622)

  • Устаревшее приведение типов datetime.date объекты в datetime64 при использовании в качестве fill_value в DataFrame.unstack(), DataFrame.shift(), Series.shift(), и DataFrame.reindex(), передать pd.Timestamp(dateobj) вместо (GH 39767)

  • Устаревший Styler.set_na_rep() и Styler.set_precision() в пользу Styler.format() с na_rep и precision как существующие и новые входные аргументы соответственно (GH 40134, GH 40425)

  • Устаревший Styler.where() в пользу использования альтернативной формулировки с Styler.applymap() (GH 40821)

  • Устаревшее разрешение частичного сбоя в Series.transform() и DataFrame.transform() когда func является списком или словарём и вызывает что-либо, кроме TypeError; func вызывая что-либо, кроме TypeError вызовет в будущей версии (GH 40211)

  • Устаревшие аргументы error_bad_lines и warn_bad_lines в read_csv() и read_table() в пользу аргумента on_bad_lines (GH 15122)

  • Устаревшая поддержка для np.ma.mrecords.MaskedRecords в DataFrame конструктор, передайте {name: data[name] for name in data.dtype.names} вместо (GH 40363)

  • Устаревшее использование merge(), DataFrame.merge(), и DataFrame.join() на разном количестве уровней (GH 34862)

  • Устаревшее использование **kwargs в ExcelWriter; используйте аргумент ключевого слова engine_kwargs вместо (GH 40430)

  • Устарел level ключевое слово для DataFrame и Series агрегации; используйте groupby вместо (GH 39983)

  • Устарел inplace параметр Categorical.remove_categories(), Categorical.add_categories(), Categorical.reorder_categories(), Categorical.rename_categories(), Categorical.set_categories() и будет удалена в будущей версии (GH 37643)

  • Устаревший merge() создание дублирующихся столбцов через suffixes ключевое слово и уже существующие столбцы (GH 22818)

  • Устаревшая настройка Categorical._codes, создайте новый Categorical с желаемыми кодами вместо (GH 40606)

  • Устарел convert_float необязательным аргументом в read_excel() и ExcelFile.parse() (GH 41127)

  • Устаревшее поведение DatetimeIndex.union() со смешанными часовыми поясами; в будущей версии оба будут приведены к UTC вместо типа object (GH 39328)

  • Устаревшее использование usecols с индексами вне диапазона для read_csv() с engine="c" (GH 25623)

  • Устаревшая специальная обработка списков с первым элементом Categorical в DataFrame конструктор; передать как pd.DataFrame({col: categorical, ...}) вместо (GH 38845)

  • Устаревшее поведение DataFrame конструктор, когда dtype передается, и данные не могут быть приведены к этому типу данных. В будущей версии это будет вызывать исключение вместо молчаливого игнорирования (GH 24435)

  • Устарел Timestamp.freq атрибут. Для свойств, которые его используют (is_month_start, is_month_end, is_quarter_start, is_quarter_end, is_year_start, is_year_end), когда у вас есть freq, используйте, например, freq.is_month_start(ts) (GH 15146)

  • Устаревшее создание Series или DataFrame с DatetimeTZDtype данные и datetime64[ns] dtype. Используйте Series(data).dt.tz_localize(None) вместо (GH 41555, GH 33401)

  • Устаревшее поведение Series конструкция с большими целочисленными значениями и малым целочисленным типом данных, тихо переполняющаяся; используйте Series(data).astype(dtype) вместо (GH 41734)

  • Устаревшее поведение DataFrame создание с плавающими данными и приведением целочисленного типа, даже если с потерями; в будущей версии это останется плавающим, соответствуя Series поведение (GH 41770)

  • Устаревший вывод timedelta64[ns], datetime64[ns], или DatetimeTZDtype типы данных в Series создание при передаче данных, содержащих строки, и отсутствии dtype передается (GH 33558)

  • В будущей версии создание Series или DataFrame с datetime64[ns] данные и DatetimeTZDtype будет обрабатывать данные как локальное время вместо времени UTC (соответствуя поведению DatetimeIndex). Чтобы обрабатывать данные как время UTC, используйте pd.Series(data).dt.tz_localize("UTC").dt.tz_convert(dtype.tz) или pd.Series(data.view("int64"), dtype=dtype) (GH 33401)

  • Устаревшая передача списков как key to DataFrame.xs() и Series.xs() (GH 41760)

  • Устаревшие булевы аргументы функции inclusive в Series.between() чтобы иметь {"left", "right", "neither", "both"} как стандартные значения аргументов (GH 40628)

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

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

  • Улучшение производительности в IntervalIndex.isin() (GH 38353)

  • Улучшение производительности в Series.mean() для nullable типов данных (GH 34814)

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

  • Улучшение производительности в DataFrame.fillna() с method="pad" или method="backfill" для допускающих значения NULL типов с плавающей запятой и целочисленных типов (GH 39953)

  • Улучшение производительности в DataFrame.corr() для method=kendall (GH 28329)

  • Улучшение производительности в DataFrame.corr() для method=spearman (GH 40956, GH 41885)

  • Улучшение производительности в Rolling.corr() и Rolling.cov() (GH 39388)

  • Улучшение производительности в RollingGroupby.corr(), ExpandingGroupby.corr(), ExpandingGroupby.corr() и ExpandingGroupby.cov() (GH 39591)

  • Улучшение производительности в unique() для типа данных object (GH 37615)

  • Улучшение производительности в json_normalize() для базовых случаев (включая разделители) (GH 40035 GH 15621)

  • Улучшение производительности в ExpandingGroupby методы агрегации (GH 39664)

  • Улучшение производительности в Styler где время рендеринга сокращено более чем на 50% и теперь соответствует DataFrame.to_html() (GH 39972 GH 39952, GH 40425)

  • Метод Styler.set_td_classes() теперь так же производителен, как Styler.apply() и Styler.applymap(), и даже больше в некоторых случаях (GH 40453)

  • Улучшение производительности в ExponentialMovingWindow.mean() с times (GH 39784)

  • Улучшение производительности в DataFrameGroupBy.apply() и SeriesGroupBy.apply() при необходимости использования резервной реализации на Python (GH 40176)

  • Улучшение производительности при преобразовании массива PyArrow Boolean в nullable Boolean массив pandas (GH 41051)

  • Улучшение производительности для конкатенации данных с типом CategoricalDtype (GH 40193)

  • Улучшение производительности в DataFrameGroupBy.cummin(), SeriesGroupBy.cummin(), DataFrameGroupBy.cummax(), и SeriesGroupBy.cummax() с допускающими значение NULL типами данных (GH 37493)

  • Улучшение производительности в Series.nunique() с значениями nan (GH 40865)

  • Улучшение производительности в DataFrame.transpose(), Series.unstack() с DatetimeTZDtype (GH 40149)

  • Улучшение производительности в Series.plot() и DataFrame.plot() с ленивой загрузкой точки входа (GH 41492)

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

Категориальный#

  • Ошибка в CategoricalIndex неправильно не вызывает исключение TypeError когда передаются скалярные данные (GH 38614)

  • Ошибка в CategoricalIndex.reindex не удалось, когда Index переданный не был категориальным, но все его значения были метками в категории (GH 28690)

  • Ошибка, при которой создание Categorical из массива типа object-dtype date объекты не корректно сохранялись при сериализации с astype (GH 38552)

  • Ошибка при построении DataFrame из ndarray и CategoricalDtype (GH 38857)

  • Ошибка при установке категориальных значений в столбец с типом object-dtype в DataFrame (GH 39136)

  • Ошибка в DataFrame.reindex() вызывал IndexError когда новый индекс содержал дубликаты, а старый индекс был CategoricalIndex (GH 38906)

  • Ошибка в Categorical.fillna() с категорией, похожей на кортеж, вызывающей NotImplementedError вместо ValueError при заполнении некатегориальным кортежем (GH 41914)

Datetimelike#

  • Ошибка в DataFrame и Series конструкторы иногда отбрасывали наносекунды из Timestamp (соответственно. Timedelta) data, с dtype=datetime64[ns] (соответственно. timedelta64[ns]) (GH 38032)

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

  • Ошибка при построении DataFrame или Series с несоответствующими datetime64 данные и timedelta64 dtype, или наоборот, не вызывая исключение TypeError (GH 38575, GH 38764, GH 38792)

  • Ошибка при построении Series или DataFrame с datetime объект вне границ для datetime64[ns] тип данных или timedelta объект вне границ для timedelta64[ns] тип данных (GH 38792, GH 38965)

  • Ошибка в DatetimeIndex.intersection(), DatetimeIndex.symmetric_difference(), PeriodIndex.intersection(), PeriodIndex.symmetric_difference() всегда возвращает object-dtype при работе с CategoricalIndex (GH 38741)

  • Ошибка в DatetimeIndex.intersection() выдавая некорректные результаты с частотами, не являющимися Tick, при n != 1 (GH 42104)

  • Ошибка в Series.where() некорректное приведение типов datetime64 значения в int64 (GH 37682)

  • Ошибка в Categorical неправильное приведение типов datetime объект в Timestamp (GH 38878)

  • Ошибка в сравнениях между Timestamp объект и datetime64 объекты чуть за пределами границ реализации для наносекунд datetime64 (GH 39221)

  • Ошибка в Timestamp.round(), Timestamp.floor(), Timestamp.ceil() для значений, близких к границам реализации Timestamp (GH 39244)

  • Ошибка в Timedelta.round(), Timedelta.floor(), Timedelta.ceil() для значений, близких к границам реализации Timedelta (GH 38964)

  • Ошибка в date_range() неправильное создание DatetimeIndex содержащий NaT вместо вызова исключения OutOfBoundsDatetime в крайних случаях (GH 24124)

  • Ошибка в infer_freq() неправильно не определяет частоту 'H' для DatetimeIndex если последний имеет часовой пояс и пересекает границы перехода на летнее время (GH 39556)

  • Ошибка в Series поддерживаемый DatetimeArray или TimedeltaArray иногда не удается установить массив freq to None (GH 41425)

Timedelta#

  • Ошибка при построении Timedelta из np.timedelta64 объектов с не-наносекундными единицами, которые выходят за пределы допустимых для timedelta64[ns] (GH 38965)

  • Ошибка при построении TimedeltaIndex некорректно принимая np.datetime64("NaT") объекты (GH 39462)

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

  • Ошибка в TimedeltaIndex и to_timedelta() не удалось вызвать при передаче не-наносекундных timedelta64 массивы, которые переполняются при преобразовании в timedelta64[ns] (GH 40008)

Часовые пояса#

  • Ошибка в разных tzinfo объекты, представляющие UTC, не рассматриваются как эквивалентные (GH 39216)

  • Ошибка в dateutil.tz.gettz("UTC") не распознаётся как эквивалентный другим tzinfos, представляющим UTC (GH 39276)

Числовой#

  • Ошибка в DataFrame.quantile(), DataFrame.sort_values() вызывая некорректное последующее поведение индексирования (GH 38351)

  • Ошибка в DataFrame.sort_values() вызов IndexError для пустых by (GH 40258)

  • Ошибка в DataFrame.select_dtypes() с include=np.number будет удалять числовые ExtensionDtype столбцы (GH 35340)

  • Ошибка в DataFrame.mode() и Series.mode() не сохраняя целочисленную согласованность Index для пустого ввода (GH 33321)

  • Ошибка в DataFrame.rank() когда DataFrame содержал np.inf (GH 32593)

  • Ошибка в DataFrame.rank() с axis=0 и столбцы, содержащие несравнимые типы, вызывающие IndexError (GH 38932)

  • Ошибка в Series.rank(), DataFrame.rank(), DataFrameGroupBy.rank(), и SeriesGroupBy.rank() обработка наиболее отрицательного int64 значение как отсутствующее (GH 32859)

  • Ошибка в DataFrame.select_dtypes() различное поведение между Windows и Linux с include="int" (GH 36596)

  • Ошибка в DataFrame.apply() и DataFrame.agg() при передаче аргумента func="size" будет работать со всем DataFrame вместо строк или столбцов (GH 39934)

  • Ошибка в DataFrame.transform() вызовет SpecificationError при передаче словаря и отсутствии столбцов; теперь будет вызываться KeyError вместо (GH 40004)

  • Ошибка в DataFrameGroupBy.rank() и SeriesGroupBy.rank() давая некорректные результаты с pct=True и равные значения между последовательными группами (GH 40518)

  • Ошибка в Series.count() приводило бы к int32 результат на 32-битных платформах при аргументе level=None (GH 40908)

  • Ошибка в Series и DataFrame агрегации с методами any и all не возвращает булевы результаты для данных типа object (GH 12863, GH 35450, GH 27709)

  • Ошибка в Series.clip() завершится ошибкой, если Series содержит значения NA и имеет nullable int или float в качестве типа данных (GH 40851)

  • Ошибка в UInt64Index.where() и UInt64Index.putmask() с np.int64 dtype other некорректное возбуждение TypeError (GH 41974)

  • Ошибка в DataFrame.agg() не сортируя агрегированную ось в порядке предоставленных агрегационных функций, когда одна или несколько агрегационных функций не дают результатов (GH 33634)

  • Ошибка в DataFrame.clip() не интерпретируя пропущенные значения как отсутствие порога (GH 40420)

Преобразование#

  • Ошибка в Series.to_dict() с orient='records' теперь возвращает нативные типы Python (GH 25969)

  • Ошибка в Series.view() и Index.view() при преобразовании между дата-время подобными (datetime64[ns], datetime64[ns, tz], timedelta64, period) dtypes (GH 39788)

  • Ошибка при создании DataFrame из пустого np.recarray не сохраняя исходные типы данных (GH 40121)

  • Ошибка в DataFrame не удалось вызвать TypeError при создании из frozenset (GH 40163)

  • Ошибка в Index конструкция молча игнорирует переданный dtype когда данные не могут быть приведены к этому типу (GH 21311)

  • Ошибка в StringArray.astype() возврат к NumPy и вызов исключения при преобразовании в dtype='categorical' (GH 40450)

  • Ошибка в factorize() где, при задании массива с числовым типом данных NumPy ниже int64, uint64 и float64, уникальные значения не сохраняли свой исходный тип данных (GH 41132)

  • Ошибка в DataFrame создание с помощью словаря, содержащего массивоподобный объект с ExtensionDtype и copy=True не удалось создать копию (GH 38939)

  • Ошибка в qcut() вызов ошибки при взятии Float64DType в качестве входных данных (GH 40730)

  • Ошибка в DataFrame и Series создание с datetime64[ns] данные и dtype=object в результате datetime объекты вместо Timestamp объекты (GH 41599)

  • Ошибка в DataFrame и Series создание с timedelta64[ns] данные и dtype=object в результате np.timedelta64 объекты вместо Timedelta объекты (GH 41599)

  • Ошибка в DataFrame создание при передаче двумерного объекта object-dtype np.ndarray of Period или Interval объекты, не приводящиеся к PeriodDtype или IntervalDtype, соответственно (GH 41812)

  • Ошибка при построении Series из списка и PandasDtype (GH 39357)

  • Ошибка при создании Series из range объект, который не помещается в границы int64 тип данных (GH 30173)

  • Ошибка при создании Series из dict со всеми ключами-кортежами и Index что требует переиндексации (GH 41707)

  • Ошибка в infer_dtype() не распознаёт Series, Index или массив с типом данных Period (GH 23553)

  • Ошибка в infer_dtype() вызов ошибки для общего ExtensionArray объектов. Теперь будет возвращать "unknown-array" вместо вызова исключения (GH 37367)

  • Ошибка в DataFrame.convert_dtypes() неправильно вызывал ValueError при вызове на пустом DataFrame (GH 40393)

Строки#

Interval#

  • Ошибка в IntervalIndex.intersection() и IntervalIndex.symmetric_difference() всегда возвращает object-dtype при работе с CategoricalIndex (GH 38653, GH 38741)

  • Ошибка в IntervalIndex.intersection() возвращение дубликатов, когда хотя бы один из Index объекты имеют дубликаты, которые присутствуют в другом (GH 38743)

  • IntervalIndex.union(), IntervalIndex.intersection(), IntervalIndex.difference(), и IntervalIndex.symmetric_difference() теперь приводится к соответствующему типу данных вместо вызова TypeError при работе с другим IntervalIndex с несовместимым dtype (GH 39267)

  • PeriodIndex.union(), PeriodIndex.intersection(), PeriodIndex.symmetric_difference(), PeriodIndex.difference() теперь преобразуется в тип данных object вместо вызова исключения IncompatibleFrequency при работе с другим PeriodIndex с несовместимым dtype (GH 39306)

  • Ошибка в IntervalIndex.is_monotonic(), IntervalIndex.get_loc(), IntervalIndex.get_indexer_for(), и IntervalIndex.__contains__() при наличии значений NA (GH 41831)

Индексирование#

  • Ошибка в Index.union() и MultiIndex.union() удаление дубликатов Index значения, когда Index не был монотонным или sort был установлен в False (GH 36289, GH 31326, GH 40862)

  • Ошибка в CategoricalIndex.get_indexer() не удалось вызвать InvalidIndexError когда не уникален (GH 38372)

  • Ошибка в IntervalIndex.get_indexer() когда target имеет CategoricalDtype и и индекс, и целевой объект содержат значения NA (GH 41934)

  • Ошибка в Series.loc() вызов ValueError когда входные данные были отфильтрованы с помощью логического списка и устанавливаемые значения были списком с меньшей размерностью (GH 20438)

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

  • Ошибка в DataFrame.__setitem__() вызов ValueError при установке нескольких значений в дублирующиеся столбцы (GH 15695)

  • Ошибка в DataFrame.loc(), Series.loc(), DataFrame.__getitem__() и Series.__getitem__() возвращает некорректные элементы для немонотонных DatetimeIndex для строковых срезов (GH 33146)

  • Ошибка в DataFrame.reindex() и Series.reindex() с индексами, учитывающими часовой пояс, вызывая TypeError для method="ffill" и method="bfill" и указанный tolerance (GH 38566)

  • Ошибка в DataFrame.reindex() с datetime64[ns] или timedelta64[ns] неправильное приведение к целым числам, когда fill_value требует приведения к типу object (GH 39755)

  • Ошибка в DataFrame.__setitem__() вызов ValueError при установке на пустой DataFrame используя указанные столбцы и непустой DataFrame значение (GH 38831)

  • Ошибка в DataFrame.loc.__setitem__() вызов ValueError при работе с уникальным столбцом, когда DataFrame имеет дублирующиеся столбцы (GH 38521)

  • Ошибка в DataFrame.iloc.__setitem__() и DataFrame.loc.__setitem__() со смешанными типами данных при установке со значением словаря (GH 38335)

  • Ошибка в Series.loc.__setitem__() и DataFrame.loc.__setitem__() вызов KeyError при предоставлении логического генератора (GH 39614)

  • Ошибка в Series.iloc() и DataFrame.iloc() вызов KeyError при предоставлении генератора (GH 39614)

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

  • Ошибка в Series.__setitem__() вызов ValueError при установке Series со скалярным индексатором (GH 38303)

  • Ошибка в DataFrame.loc() удаление уровней MultiIndex когда DataFrame используемый в качестве входных данных имеет только одну строку (GH 10521)

  • Ошибка в DataFrame.__getitem__() и Series.__getitem__() всегда вызывающий исключение KeyError при срезе существующими строками, где Index имеет миллисекунды (GH 33589)

  • Ошибка при установке timedelta64 или datetime64 преобразование значений в числовые Series не удалось привести к типу object (GH 39086, GH 39619)

  • Ошибка при установке Interval значения в Series или DataFrame с несоответствующими IntervalDtype неправильное приведение новых значений к существующему типу данных (GH 39120)

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

  • Ошибка при установке np.datetime64("NaT") в Series с Datetime64TZDtype неправильно обрабатывал значение без часового пояса как значение с часовым поясом (GH 39769)

  • Ошибка в Index.get_loc() не вызывая KeyError когда key=NaN и method указан, но NaN не находится в Index (GH 39382)

  • Ошибка в DatetimeIndex.insert() при вставке np.datetime64("NaT") в индекс с учетом часового пояса, некорректно обрабатывая значение без часового пояса как значение с часовым поясом (GH 39769)

  • Ошибка в некорректном вызове исключения в Index.insert(), при установке нового столбца, который не может быть размещён в существующем frame.columns, или в Series.reset_index() или DataFrame.reset_index() вместо приведения к совместимому типу данных (GH 39068)

  • Ошибка в RangeIndex.append() где одиночный объект длиной 1 был некорректно объединён (GH 39401)

  • Ошибка в RangeIndex.astype() где при преобразовании в CategoricalIndex, категории стали Int64Index вместо RangeIndex (GH 41263)

  • Ошибка при установке numpy.timedelta64 значения в тип object-dtype Series используя булев индексатор (GH 39488)

  • Ошибка при установке числовых значений в boolean-dtypes Series используя at или iat не удалось преобразовать в object-dtype (GH 39582)

  • Ошибка в DataFrame.__setitem__() и DataFrame.iloc.__setitem__() вызов ValueError при попытке индексирования срезом строк и установке списка в качестве значений (GH 40440)

  • Ошибка в DataFrame.loc() не вызывая KeyError когда ключ не был найден в MultiIndex и уровни не были полностью указаны (GH 41170)

  • Ошибка в DataFrame.loc.__setitem__() когда установка-с-расширением некорректно вызывала ошибку, когда индекс в расширяющейся оси содержал дубликаты (GH 40096)

  • Ошибка в DataFrame.loc.__getitem__() с MultiIndex приведение к float, когда хотя бы один столбец индекса имеет тип float и мы извлекаем скаляр (GH 41369)

  • Ошибка в DataFrame.loc() неправильное сопоставление небулевых элементов индекса (GH 20432)

  • Ошибка при индексировании с np.nan на Series или DataFrame с CategoricalIndex некорректное возбуждение KeyError когда np.nan ключи присутствуют (GH 41933)

  • Ошибка в Series.__delitem__() с ExtensionDtype неправильное приведение к ndarray (GH 40386)

  • Ошибка в DataFrame.at() с CategoricalIndex возвращая некорректные результаты при передаче целочисленных ключей (GH 41846)

  • Ошибка в DataFrame.loc() возвращая MultiIndex в неправильном порядке, если индексатор имеет дубликаты (GH 40978)

  • Ошибка в DataFrame.__setitem__() вызов TypeError при использовании str подкласс как имя столбца с DatetimeIndex (GH 37366)

  • Ошибка в PeriodIndex.get_loc() не удалось вызвать KeyError когда задан Period с несоответствием freq (GH 41670)

  • Ошибка .loc.__getitem__ с UInt64Index и отрицательные целочисленные ключи, вызывающие OverflowError вместо KeyError в некоторых случаях, переходя к положительным целым числам в других (GH 41777)

  • Ошибка в Index.get_indexer() не удалось вызвать ValueError в некоторых случаях с недопустимыми method, limit, или tolerance аргументы (GH 41918)

  • Ошибка при срезе Series или DataFrame с TimedeltaIndex при передаче недопустимой строки вызывает ValueError вместо TypeError (GH 41821)

  • Ошибка в Index конструктор иногда молча игнорирует указанный dtype (GH 38879)

  • Index.where() поведение теперь зеркалирует Index.putmask() поведение, т.е. index.where(mask, other) соответствует index.putmask(~mask, other) (GH 39412)

Отсутствует#

  • Ошибка в Grouper неправильно распространял dropna аргумент; DataFrameGroupBy.transform() теперь корректно обрабатывает пропущенные значения для dropna=True (GH 35612)

  • Ошибка в isna(), Series.isna(), Index.isna(), DataFrame.isna(), и соответствующий notna функции не распознают Decimal("NaN") объекты (GH 39409)

  • Ошибка в DataFrame.fillna() не принимает словарь для downcast ключевое слово (GH 40809)

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

  • Ошибка в DataFrame создание с данными с плавающей точкой, содержащими NaN и целое число dtype приведение вместо сохранения NaN (GH 26919)

  • Ошибка в Series.isin() и MultiIndex.isin() не рассматривал все nan как эквивалентные, если они были в кортежах (GH 41836)

MultiIndex#

  • Ошибка в DataFrame.drop() вызов TypeError когда MultiIndex не является уникальным и level не предоставлен (GH 36293)

  • Ошибка в MultiIndex.intersection() дублирование NaN в результате (GH 38623)

  • Ошибка в MultiIndex.equals() некорректно возвращает True когда MultiIndex содержал NaN даже когда они упорядочены по-разному (GH 38439)

  • Ошибка в MultiIndex.intersection() всегда возвращает пустой результат при пересечении с CategoricalIndex (GH 38653)

  • Ошибка в MultiIndex.difference() некорректное возбуждение TypeError когда индексы содержат несортируемые записи (GH 41915)

  • Ошибка в MultiIndex.reindex() вызов ValueError при использовании на пустом MultiIndex и индексация только определенного уровня (GH 41170)

  • Ошибка в MultiIndex.reindex() вызов TypeError при переиндексации относительно плоского Index (GH 41707)

I/O#

  • Ошибка в Index.__repr__() когда display.max_seq_items=1 (GH 38415)

  • Ошибка в read_csv() не распознаёт научную нотацию, если аргумент decimal установлен и engine="python" (GH 31920)

  • Ошибка в read_csv() интерпретация NA значение как комментарий, когда NA содержит строку комментария, исправленную для engine="python" (GH 34002)

  • Ошибка в read_csv() вызов IndexError с несколькими заголовочными столбцами и index_col указывается, когда файл не содержит строк данных (GH 38292)

  • Ошибка в read_csv() не принимает usecols с длиной, отличной от names для engine="python" (GH 16469)

  • Ошибка в read_csv() возвращение типа данных object, когда delimiter="," с usecols и parse_dates указано для engine="python" (GH 35873)

  • Ошибка в read_csv() вызов TypeError когда names и parse_dates указан для engine="c" (GH 33699)

  • Ошибка в read_clipboard() и DataFrame.to_clipboard() не работает в WSL (GH 38527)

  • Разрешить пользовательские значения ошибок для parse_dates аргумент read_sql(), read_sql_query() и read_sql_table() (GH 35185)

  • Ошибка в DataFrame.to_hdf() и Series.to_hdf() вызов KeyError при попытке применить для подклассов DataFrame или Series (GH 33748)

  • Ошибка в HDFStore.put() вызывая неправильное TypeError при сохранении DataFrame с нестроковым типом данных (GH 34274)

  • Ошибка в json_normalize() приводя к тому, что первый элемент объекта-генератора не включается в возвращаемый DataFrame (GH 35923)

  • Ошибка в read_csv() применение разделителя тысяч к столбцам дат, когда столбец должен быть разобран на даты и usecols указан для engine="python" (GH 39365)

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

  • Ошибка в read_excel() не учитывая set_option() (GH 34252)

  • Ошибка в read_csv() не переключая true_values и false_values для nullable Boolean dtype (GH 34655)

  • Ошибка в read_json() когда orient="split" не поддерживая числовой строковый индекс (GH 28556)

  • read_sql() возвращал пустой генератор, если chunksize был ненулевым, и запрос не вернул результатов. Теперь возвращает генератор с одним пустым DataFrame (GH 34411)

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

  • Ошибка в read_sas() вызов ValueError когда datetimes были нулевыми (GH 39725)

  • Ошибка в read_excel() удаление пустых значений из одностолбцовых электронных таблиц (GH 39808)

  • Ошибка в read_excel() загрузка пустых строк/столбцов в конце для некоторых типов файлов (GH 41167)

  • Ошибка в read_excel() вызов AttributeError когда файл Excel имел MultiIndex заголовок, за которым следуют две пустые строки и нет индекса (GH 40442)

  • Ошибка в read_excel(), read_csv(), read_table(), read_fwf(), и read_clipboard() где одна пустая строка после MultiIndex заголовок без индекса будет удален (GH 40442)

  • Ошибка в DataFrame.to_string() неправильное размещение столбца усечения при index=False (GH 40904)

  • Ошибка в DataFrame.to_string() добавление лишней точки и смещение строки усечения при index=False (GH 40904)

  • Ошибка в read_orc() всегда вызывает AttributeError (GH 40918)

  • Ошибка в read_csv() и read_table() тихо игнорируя prefix if names и prefix определены, теперь вызывая ValueError (GH 39123)

  • Ошибка в read_csv() и read_excel() не учитывая dtype для дублированного имени столбца при mangle_dupe_cols установлено в True (GH 35211)

  • Ошибка в read_csv() тихо игнорируя sep if delimiter и sep определены, теперь вызывая ValueError (GH 39823)

  • Ошибка в read_csv() и read_table() неправильная интерпретация аргументов при sys.setprofile был ранее вызван (GH 41069)

  • Ошибка при преобразовании из PyArrow в pandas (например, при чтении Parquet) с нулевыми типами данных и массивом PyArrow, размер буфера данных которого не кратен размеру типа данных (GH 40896)

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

  • Ошибка в read_clipboard() копирование из файла Excel смещает значения в неправильный столбец, если в первом столбце есть нулевые значения (GH 41108)

  • Ошибка в DataFrame.to_hdf() и Series.to_hdf() вызов TypeError при попытке добавить строковый столбец к несовместимому столбцу (GH 41897)

Period#

  • Сравнения Period объектов или Index, Series, или DataFrame с несоответствующими PeriodDtype теперь ведут себя как другие сравнения с несовпадающими типами, возвращая False для equals, True для неравенства и вызов TypeError для проверок неравенства (GH 39274)

Построение графиков#

  • Ошибка в plotting.scatter_matrix() вызов исключения при 2d ax переданный аргумент (GH 16253)

  • Предотвращение предупреждений при использовании constrained_layout включен (GH 25261)

  • Ошибка в DataFrame.plot() показывал неправильные цвета в легенде, если функция вызывалась повторно и некоторые вызовы использовали yerr в то время как другие не поддерживали (GH 39522)

  • Ошибка в DataFrame.plot() показывал неправильные цвета в легенде, если функция вызывалась повторно и некоторые вызовы использовали secondary_y и другие используют legend=False (GH 40044)

  • Ошибка в DataFrame.plot.box() когда dark_background тема была выбрана, маркеры верхнего/нижнего регистра или мин/макс для графика не были видны (GH 40769)

Groupby/resample/rolling#

  • Ошибка в DataFrameGroupBy.agg() и SeriesGroupBy.agg() с PeriodDtype столбцы некорректно приводят результаты слишком агрессивно (GH 38254)

  • Ошибка в SeriesGroupBy.value_counts() где ненаблюдаемые категории в сгруппированной категориальной Series не учитывались (GH 38672)

  • Ошибка в SeriesGroupBy.value_counts() где ошибка возникала на пустом Series (GH 39172)

  • Ошибка в GroupBy.indices() содержал бы несуществующие индексы, когда в ключах группировки присутствовали нулевые значения (GH 9304)

  • Исправлена ошибка в DataFrameGroupBy.sum() и SeriesGroupBy.sum() вызывая потерю точности, теперь используя суммирование Кахана (GH 38778)

  • Исправлена ошибка в DataFrameGroupBy.cumsum(), SeriesGroupBy.cumsum(), DataFrameGroupBy.mean(), и SeriesGroupBy.mean() вызывая потерю точности из-за использования суммирования Кахана (GH 38934)

  • Ошибка в Resampler.aggregate() и DataFrame.transform() вызов TypeError вместо SpecificationError когда отсутствующие ключи имели смешанные типы данных (GH 39025)

  • Ошибка в DataFrameGroupBy.idxmin() и DataFrameGroupBy.idxmax() с ExtensionDtype столбцы (GH 38733)

  • Ошибка в Series.resample() вызывал ошибку, когда индекс был PeriodIndex состоящий из NaT (GH 39227)

  • Ошибка в RollingGroupby.corr() и ExpandingGroupby.corr() где столбец groupby вернет 0 вместо np.nan при указании other который был длиннее каждой группы (GH 39591)

  • Ошибка в ExpandingGroupby.corr() и ExpandingGroupby.cov() где 1 будет возвращено вместо np.nan при указании other который был длиннее каждой группы (GH 39591)

  • Ошибка в DataFrameGroupBy.mean(), SeriesGroupBy.mean(), DataFrameGroupBy.median(), SeriesGroupBy.median(), и DataFrame.pivot_table() не распространяются метаданные (GH 28283)

  • Ошибка в Series.rolling() и DataFrame.rolling() неправильный расчёт границ окна, когда окно является смещением, а даты расположены в порядке убывания (GH 40002)

  • Ошибка в Series.groupby() и DataFrame.groupby() на пустом Series или DataFrame терял индекс, столбцы и/или типы данных при непосредственном использовании методов idxmax, idxmin, mad, min, max, sum, prod, и skew или используя их через apply, aggregate, или resample (GH 26411)

  • Ошибка в DataFrameGroupBy.apply() и SeriesGroupBy.apply() где MultiIndex будет создан вместо Index при использовании на RollingGroupby объект (GH 39732)

  • Ошибка в DataFrameGroupBy.sample() где возникала ошибка, когда weights был указан, и индекс был Int64Index (GH 39927)

  • Ошибка в DataFrameGroupBy.aggregate() и Resampler.aggregate() иногда вызывал SpecificationError при передаче словаря и отсутствии столбцов; теперь всегда будет вызывать KeyError вместо (GH 40004)

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

  • Ошибка в ExponentialMovingWindow при вызове __getitem__ неправильно вызывал бы ValueError при указании times (GH 40164)

  • Ошибка в ExponentialMovingWindow при вызове __getitem__ не сохранял com, span, alpha или halflife атрибуты (GH 40164)

  • ExponentialMovingWindow теперь вызывает NotImplementedError при указании times с adjust=False из-за некорректного расчета (GH 40098)

  • Ошибка в ExponentialMovingWindowGroupby.mean() где times аргумент игнорировался, когда engine='numba' (GH 40951)

  • Ошибка в ExponentialMovingWindowGroupby.mean() где использовались неправильные времена в случае нескольких групп (GH 40951)

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

  • Ошибка в Series.asfreq() и DataFrame.asfreq() удаление строк, когда индекс не был отсортирован (GH 39805)

  • Ошибка в агрегационных функциях для DataFrame не учитывая numeric_only аргумент, когда level ключевое слово было указано (GH 40660)

  • Ошибка в SeriesGroupBy.aggregate() где использование пользовательской функции для агрегации Series с типом object Index вызывает некорректное Index форма (GH 40014)

  • Ошибка в RollingGroupby где as_index=False аргумент в groupby игнорировался (GH 39433)

  • Ошибка в DataFrameGroupBy.any(), SeriesGroupBy.any(), DataFrameGroupBy.all() и SeriesGroupBy.all() вызов ValueError при использовании со столбцами nullable type, содержащими NA даже с skipna=True (GH 40585)

  • Ошибка в DataFrameGroupBy.cummin(), SeriesGroupBy.cummin(), DataFrameGroupBy.cummax() и SeriesGroupBy.cummax() неправильное округление целочисленных значений около int64 ограничения реализации (GH 40767)

  • Ошибка в DataFrameGroupBy.rank() и SeriesGroupBy.rank() с nullable типами данных, некорректно вызывающими TypeError (GH 41010)

  • Ошибка в DataFrameGroupBy.cummin(), SeriesGroupBy.cummin(), DataFrameGroupBy.cummax() и SeriesGroupBy.cummax() вычисление неверного результата с обнуляемыми типами данных, слишком большими для обратного преобразования при приведении к float (GH 37493)

  • Ошибка в DataFrame.rolling() возвращая среднее значение ноль для всех NaN окно с min_periods=0 если вычисление не является численно стабильным (GH 41053)

  • Ошибка в DataFrame.rolling() возвращает сумму, не равную нулю для всех NaN окно с min_periods=0 если вычисление не является численно стабильным (GH 41053)

  • Ошибка в SeriesGroupBy.agg() не удается сохранить упорядоченность CategoricalDtype на агрегациях, сохраняющих порядок (GH 41147)

  • Ошибка в DataFrameGroupBy.min(), SeriesGroupBy.min(), DataFrameGroupBy.max() и SeriesGroupBy.max() с несколькими столбцами типа object и numeric_only=False некорректно вызывал ValueError (GH 41111)

  • Ошибка в DataFrameGroupBy.rank() с объектом GroupBy axis=0 и rank ключевое слово метода axis=1 (GH 41320)

  • Ошибка в DataFrameGroupBy.__getitem__() с не уникальными столбцами некорректно возвращает неправильно сформированный SeriesGroupBy вместо DataFrameGroupBy (GH 41427)

  • Ошибка в DataFrameGroupBy.transform() с неуникальными столбцами, ошибочно вызывая AttributeError (GH 41427)

  • Ошибка в Resampler.apply() с неуникальными столбцами некорректно удалял дублирующиеся столбцы (GH 41445)

  • Ошибка в Series.groupby() агрегации, некорректно возвращающие пустые Series вместо вызова исключения TypeError при агрегациях, которые недопустимы для его dtype, например .prod с datetime64[ns] тип данных (GH 41342)

  • Ошибка в DataFrameGroupBy агрегации, некорректно не удаляющие столбцы с недопустимыми типами данных для этой агрегации, когда нет допустимых столбцов (GH 41291)

  • Ошибка в DataFrame.rolling.__iter__() где on не был назначен индексу результирующих объектов (GH 40373)

  • Ошибка в DataFrameGroupBy.transform() и DataFrameGroupBy.agg() с engine="numba" где *args кэшировались с переданной пользователем функцией (GH 41647)

  • Ошибка в DataFrameGroupBy методы agg, transform, sum, bfill, ffill, pad, pct_change, shift, ohlc удаление .columns.names (GH 41497)

Изменение формы#

  • Ошибка в merge() вызывая ошибку при выполнении внутреннего соединения с частичным индексом и right_index=True когда не было пересечения между индексами (GH 33814)

  • Ошибка в DataFrame.unstack() с отсутствующими уровнями привело к некорректным именам индексов (GH 37510)

  • Ошибка в merge_asof() распространение правильного Index с left_index=True и right_on спецификации вместо левого индекса (GH 33463)

  • Ошибка в DataFrame.join() на DataFrame с MultiIndex возвращал неверный результат, когда один из обоих индексов имел только один уровень (GH 36909)

  • merge_asof() теперь вызывает ValueError вместо загадочного TypeError в случае немержных столбцов слияния (GH 29130)

  • Ошибка в DataFrame.join() неправильное присвоение значений, когда DataFrame имел MultiIndex где хотя бы одно измерение имело тип данных Categorical с неотсортированными по алфавиту категориями (GH 38502)

  • Series.value_counts() и Series.mode() теперь возвращает согласованные ключи в исходном порядке (GH 12679, GH 11227 и GH 39007)

  • Ошибка в DataFrame.stack() не обрабатывая NaN в MultiIndex столбцы корректно (GH 39481)

  • Ошибка в DataFrame.apply() давал некорректные результаты, когда аргумент func была строкой, axis=1, и аргумент axis не поддерживался; теперь вызывает ValueError вместо (GH 39211)

  • Ошибка в DataFrame.sort_values() неправильное изменение формы индекса после сортировки по столбцам, когда ignore_index=True (GH 39464)

  • Ошибка в DataFrame.append() возвращение некорректных типов данных при комбинациях ExtensionDtype типы данных (GH 39454)

  • Ошибка в DataFrame.append() возвращение некорректных dtypes при использовании с комбинациями datetime64 и timedelta64 типы данных (GH 39574)

  • Ошибка в DataFrame.append() с DataFrame с MultiIndex и добавление Series чей Index не является MultiIndex (GH 41707)

  • Ошибка в DataFrame.pivot_table() возвращая MultiIndex для одного значения при работе с пустым DataFrame (GH 13483)

  • Index теперь можно передать в numpy.all() функция (GH 40180)

  • Ошибка в DataFrame.stack() не сохраняя CategoricalDtype в MultiIndex (GH 36991)

  • Ошибка в to_datetime() вызывает ошибку, когда входная последовательность содержит нехэшируемые элементы (GH 39756)

  • Ошибка в Series.explode() сохраняя индекс при ignore_index был True и значения были скалярами (GH 40487)

  • Ошибка в to_datetime() вызов ValueError когда Series содержит None и NaT и имеет более 50 элементов (GH 39882)

  • Ошибка в Series.unstack() и DataFrame.unstack() с значениями типа object, содержащими объекты datetime с часовыми поясами, ошибочно вызывающими TypeError (GH 41875)

  • Ошибка в DataFrame.melt() вызов InvalidIndexError когда DataFrame имеет дублирующиеся столбцы, используемые как value_vars (GH 41951)

Разреженный#

  • Ошибка в DataFrame.sparse.to_coo() вызов KeyError со столбцами, которые являются числовыми Index без 0 (GH 18414)

  • Ошибка в SparseArray.astype() с copy=False выдавая некорректные результаты при переходе от целочисленного типа данных к типу данных с плавающей точкой (GH 34456)

  • Ошибка в SparseArray.max() и SparseArray.min() всегда возвращал бы пустой результат (GH 40921)

ExtensionArray#

Styler#

  • Ошибка в Styler где subset аргумент в методах вызывал ошибку для некоторых допустимых срезов MultiIndex (GH 33562)

  • Styler отображаемый HTML-вывод претерпел незначительные изменения для поддержки стандартов хорошего кода w3 (GH 39626)

  • Ошибка в Styler где отображаемый HTML не содержал идентификатор класса столбца для определенных заголовочных ячеек (GH 39716)

  • Ошибка в Styler.background_gradient() где цвет текста не определялся корректно (GH 39888)

  • Ошибка в Styler.set_table_styles() где несколько элементов в CSS-селекторах table_styles аргумент не был правильно добавлен (GH 34061)

  • Ошибка в Styler где копирование из Jupyter удалило верхнюю левую ячейку и сместило заголовки (GH 12147)

  • Ошибка в Styler.where где kwargs не были переданы в соответствующий вызываемый объект (GH 40845)

  • Ошибка в Styler вызывая дублирование CSS при множественных рендерах (GH 39395, GH 40334)

Другие#

Участники#

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

  • Abhishek R +

  • Ада Драгинда

  • Adam J. Stewart

  • Adam Turner +

  • Aidan Feldman +

  • Ajitesh Singh +

  • Акшат Джайн +

  • Albert Villanova del Moral

  • Alexandre Prince-Levasseur +

  • Andrew Hawyrluk +

  • Andrew Wieteska

  • AnglinaBhambra +

  • Анкуш Дуа +

  • Анна Даглис

  • Ashlan Parker +

  • Ашвани +

  • Avinash Pancham

  • Ayushman Kumar +

  • BeanNan

  • Benoît Vinot

  • Bharat Raghunathan

  • Bijay Regmi +

  • Bobin Mathew +

  • Bogdan Pilyavets +

  • Brian Hulette +

  • Brian Sun +

  • Брок +

  • Bryan Cutler

  • Калеб +

  • Калвин Хо +

  • Chathura Widanage +

  • Chinmay Rane +

  • Крис Линч

  • Крис Уитерс

  • Christos Petropoulos

  • Corentin Girard +

  • DaPy15 +

  • Damodara Puddu +

  • Daniel Hrisca

  • Daniel Saxton

  • DanielFEvans

  • Dare Adewumi +

  • Dave Willmer

  • David Schlachter +

  • David-dmh +

  • Deepang Raval +

  • Doris Lee +

  • Dr. Jan-Philip Gehrcke +

  • DriesS +

  • Dylan Percy

  • Эрфан Нариман

  • Eric Leung

  • EricLeer +

  • Eve

  • Fangchen Li

  • Феликс Диво

  • Флориан Йеттер

  • Fred Reiss

  • GFJ138 +

  • Gaurav Sheni +

  • Geoffrey B. Eisenbarth +

  • Gesa Stupperich +

  • Griffin Ansel +

  • Густаво К. Масиэль +

  • Heidi +

  • Henry +

  • Hung-Yi Wu +

  • Ian Ozsvald +

  • Ирв Ластиг

  • Isaac Chung +

  • Isaac Virshup

  • JHM Darbyshire (MBP) +

  • JHM Darbyshire (iMac) +

  • Jack Liu +

  • James Lamb +

  • Jeet Parekh

  • Jeff Reback

  • Jiezheng2018 +

  • Jody Klymak

  • Johan Kåhrström +

  • John McGuigan

  • Joris Van den Bossche

  • Jose

  • JoseNavy

  • Josh Dimarsky

  • Josh Friedlander

  • Джошуа Кляйн +

  • Julia Signell

  • Julian Schnitzler +

  • Kaiqi Dong

  • Касим Панджри +

  • Katie Smith +

  • Kelly +

  • Kenil +

  • Keppler, Kyle +

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

  • Кхор Чиан Вей +

  • Кили Хьюитт +

  • Larry Wong +

  • Lightyears +

  • Lucas Holtz +

  • Lucas Rodés-Guirao

  • Lucky Sivagurunathan +

  • Luis Pinto

  • Maciej Kos +

  • Марк Гарсия

  • Марко Эдвард Горелли +

  • Марко Горелли

  • MarcoGorelli +

  • Mark Graham

  • Martin Dengler +

  • Martin Grigorov +

  • Marty Rudolf +

  • Мэтт Рёшке

  • Мэтью Рёшке

  • Matthew Zeitlin

  • Max Bolingbroke

  • Максим Иванов

  • Максим Купфер +

  • Mayur +

  • MeeseeksMachine

  • Micael Jarniac

  • Michael Hsieh +

  • Michel de Ruiter +

  • Mike Roberts +

  • Miroslav Šedivý

  • Мохаммад Джафар Машхади

  • Morisa Manzella +

  • Mortada Mehyar

  • Muktan +

  • Naveen Agrawal +

  • Ноа

  • Nofar Mishraki +

  • Oleh Kozynets

  • Olga Matoula +

  • Oli +

  • Омар Афифи

  • Omer Ozarslan +

  • Owen Lamont +

  • Ozan Öğreden +

  • Команда разработчиков Pandas

  • Паоло Ламменс

  • Parfait Gasana +

  • Patrick Hoefler

  • Пол Маккарти +

  • Paulo S. Costa +

  • Pav A

  • Peter

  • Pradyumna Rahul +

  • Пунитвара +

  • QP Hou +

  • Rahul Chauhan

  • Rahul Sathanapalli

  • Richard Shadrach

  • Роберт Брэдшоу

  • Robin to Roxel

  • Рохит Гупта

  • Sam Purkis +

  • Samuel GIFFARD +

  • Sean M. Law +

  • Shahar Naveh +

  • ShaharNaveh +

  • Shiv Gupta +

  • Shrey Dixit +

  • Shudong Yang +

  • Simon Boehm +

  • Simon Hawkins

  • Sioned Baker +

  • Stefan Mejlgaard +

  • Steven Pitman +

  • Steven Schaerer +

  • Stéphane Guillou +

  • TLouf +

  • Tegar D Pratama +

  • Терджи Петерсен

  • Теодорос Николау +

  • Thomas Dickson

  • Thomas Li

  • Томас Смит

  • Thomas Yu +

  • ThomasBlauthQC +

  • Tim Hoffmann

  • Tom Augspurger

  • Torsten Wörtwein

  • Tyler Reddy

  • UrielMaD

  • Uwe L. Korn

  • Venaturum +

  • VirosaLi

  • Vladimir Podolskiy

  • Вьом Патхак +

  • WANG Aiyong

  • Waltteri Koskinen +

  • Вэньцзюнь Си +

  • William Ayd

  • Yeshwanth N +

  • Yuanhao Geng

  • Zito Relova +

  • aflah02 +

  • arredond +

  • attack68

  • cdknox +

  • chinggg +

  • fathomer +

  • ftrihardjo +

  • github-actions[bot] +

  • gunjan-solanki +

  • guru kiran

  • hasan-yaman

  • i-aki-y +

  • jbrockmendel

  • jmholzer +

  • jordi-crespo +

  • jotasi +

  • jreback

  • juliansmidek +

  • kylekeppler

  • lrepiton +

  • lucasrodes

  • maroth96 +

  • mikeronayne +

  • mlondschien

  • moink +

  • morrme

  • мшмусклер +

  • mzeitlin11

  • na2 +

  • nofarmishraki +

  • partev

  • patrick

  • ptype

  • перечитать

  • rhshadrach

  • rlukevie +

  • rosagold +

  • саукоиде +

  • sdementen +

  • shawnbrown

  • sstiijn +

  • stphnlyd +

  • sukriti1 +

  • taytzehao

  • theOehrly +

  • theodorju +

  • thordisstella +

  • tonyyyyip +

  • tsinggggg +

  • tushushu +

  • vangorade +

  • vladu +

  • wertha +