Что нового в версии 2.2.0 (19 января 2024)#

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

Предстоящие изменения в pandas 3.0#

pandas 3.0 принесет два более значительных изменения в поведение pandas по умолчанию.

Копирование при записи#

В настоящее время опциональный режим Copy-on-Write будет включен по умолчанию в pandas 3.0. Не будет возможности сохранить текущее поведение включенным. Новая семантика поведения объясняется в руководство пользователя о Copy-on-Write.

Новое поведение можно включить начиная с pandas 2.0 с помощью следующей опции:

pd.options.mode.copy_on_write = True

Это изменение вносит различные изменения в поведение pandas в отношении копий и представлений. Некоторые из этих изменений позволяют четкое устаревание, как изменения в цепочке присваиваний. Другие изменения более тонкие, и поэтому предупреждения скрыты за опцией, которую можно включить в pandas 2.2.

pd.options.mode.copy_on_write = "warn"

Этот режим будет предупреждать во многих различных сценариях, которые на самом деле не имеют отношения к большинству запросов. Мы рекомендуем изучить этот режим, но не обязательно избавляться от всех этих предупреждений. руководство по миграции подробнее объясняет процесс обновления.

Выделенный строковый тип данных (на основе Arrow) по умолчанию#

Исторически pandas представлял строковые столбцы с использованием типа данных NumPy object. Это представление имеет множество проблем, включая низкую производительность и большой объем памяти. Это изменится в pandas 3.0. pandas начнет определять строковые столбцы как новый string тип данных, основанный на Arrow, который представляет строки, расположенные в памяти непрерывно. Это обеспечивает значительное улучшение производительности и использования памяти.

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

In [1]: ser = pd.Series(["a", "b"])
Out[1]:
0    a
1    b
dtype: object

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

In [1]: ser = pd.Series(["a", "b"])
Out[1]:
0    a
1    b
dtype: string

Строковый тип данных, используемый в этих сценариях, в основном будет вести себя как NumPy object, включая семантику пропущенных значений и общие операции с этими столбцами.

Это изменение включает несколько дополнительных изменений в API:

  • В настоящее время указание dtype="string" создаёт тип данных, основанный на строках Python, которые хранятся в массиве NumPy. Это изменится в pandas 3.0, этот тип данных будет создавать столбец строк, основанный на Arrow.

  • Имена столбцов и Index также будут поддерживаться строками Arrow.

  • PyArrow станет обязательной зависимостью в pandas 3.0 для учёта этого изменения.

Эта логика вывода будущих типов данных может быть включена с помощью:

pd.options.future.infer_string = True

Улучшения#

Поддержка драйвера ADBC в to_sql и read_sql#

read_sql() и to_sql() теперь работают с Apache Arrow ADBC drivers. По сравнению с традиционными драйверами, используемыми через SQLAlchemy, драйверы ADBC должны обеспечить значительное повышение производительности, лучшую поддержку типов и более чистую обработку null-значений.

import adbc_driver_postgresql.dbapi as pg_dbapi

df = pd.DataFrame(
    [
        [1, 2, 3],
        [4, 5, 6],
    ],
    columns=['a', 'b', 'c']
)
uri = "postgresql://postgres:postgres@localhost/postgres"
with pg_dbapi.connect(uri) as conn:
    df.to_sql("pandas_table", conn, index=False)

# for round-tripping
with pg_dbapi.connect(uri) as conn:
    df2 = pd.read_sql("pandas_table", conn)

Система типов Arrow предлагает более широкий набор типов, которые могут более точно соответствовать тому, что предлагают базы данных, такие как PostgreSQL. Для иллюстрации обратите внимание на этот (неисчерпывающий) список типов, доступных в разных базах данных и бэкендах pandas:

numpy/pandas

arrow

postgres

sqlite

int16/Int16

int16

SMALLINT

INTEGER

int32/Int32

int32

INTEGER

INTEGER

int64/Int64

int64

BIGINT

INTEGER

float32

float32

REAL

REAL

float64

float64

DOUBLE PRECISION

REAL

object

string

TEXT

TEXT

bool

bool_

BOOLEAN

datetime64[ns]

timestamp(us)

ВРЕМЕННАЯ МЕТКА

datetime64[ns,tz]

timestamp(us,tz)

TIMESTAMPTZ

date32

ДАТА

month_day_nano_interval

INTERVAL

бинарный

BINARY

BLOB

decimal128

DECIMAL [1]

list

ARRAY [1]

struct

СОСТАВНОЙ ТИП

[1]

Сноски

Если вы заинтересованы в максимально возможном сохранении типов базы данных на протяжении всего жизненного цикла вашего DataFrame, пользователям рекомендуется использовать dtype_backend="pyarrow" аргумент read_sql()

# for round-tripping
with pg_dbapi.connect(uri) as conn:
    df2 = pd.read_sql("pandas_table", conn, dtype_backend="pyarrow")

Это предотвратит преобразование ваших данных в традиционную систему типов pandas/NumPy, которая часто преобразует SQL-типы таким образом, что делает невозможным их обратное преобразование.

Полный список драйверов ADBC и их статус разработки см. в Статус реализации драйвера ADBC документация.

Создать pandas Series на основе одного или нескольких условий#

The Series.case_when() функция была добавлена для создания объекта Series на основе одного или нескольких условий. (GH 39154)

In [1]: import pandas as pd

In [2]: df = pd.DataFrame(dict(a=[1, 2, 3], b=[4, 5, 6]))

In [3]: default=pd.Series('default', index=df.index)

In [4]: default.case_when(
   ...:      caselist=[
   ...:          (df.a == 1, 'first'),                              # condition, replacement
   ...:          (df.a.gt(1) & df.b.eq(5), 'second'),  # condition, replacement
   ...:      ],
   ...: )
   ...: 
Out[4]: 
0      first
1     second
2    default
dtype: object

to_numpy для nullable-типов NumPy и Arrow преобразует в подходящий dtype NumPy#

to_numpy для nullable типов NumPy и Arrow теперь будет преобразовываться в подходящий dtype NumPy вместо object dtype для nullable и PyArrow-backed extension dtypes.

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

In [1]: ser = pd.Series([1, 2, 3], dtype="Int64")
In [2]: ser.to_numpy()
Out[2]: array([1, 2, 3], dtype=object)

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

In [5]: ser = pd.Series([1, 2, 3], dtype="Int64")

In [6]: ser.to_numpy()
Out[6]: array([1, 2, 3])

In [7]: ser = pd.Series([1, 2, 3], dtype="timestamp[ns][pyarrow]")

In [8]: ser.to_numpy()
Out[8]: 
array(['1970-01-01T00:00:00.000000001', '1970-01-01T00:00:00.000000002',
       '1970-01-01T00:00:00.000000003'], dtype='datetime64[ns]')

Тип данных NumPy по умолчанию (без аргументов) определяется следующим образом:

  • типы данных float преобразуются в NumPy floats

  • целочисленные типы данных без пропущенных значений преобразуются в целочисленные типы данных NumPy

  • целочисленные dtypes с пропущенными значениями приводятся к NumPy float dtypes и NaN используется как индикатор пропущенного значения

  • логические типы данных без пропущенных значений приводятся к типу данных NumPy bool

  • булевы типы данных с пропущенными значениями сохраняют объектный тип данных

  • типы datetime и timedelta преобразуются в типы Numpy datetime64 и timedelta64 соответственно и NaT используется как индикатор пропущенного значения

Series.struct аксессор для структурированных данных PyArrow#

The Series.struct аксессор предоставляет атрибуты и методы для обработки данных с struct[pyarrow] Series типа dtype. Например, Series.struct.explode() преобразует структурированные данные PyArrow в pandas DataFrame. (GH 54938)

In [9]: import pyarrow as pa

In [10]: series = pd.Series(
   ....:     [
   ....:         {"project": "pandas", "version": "2.2.0"},
   ....:         {"project": "numpy", "version": "1.25.2"},
   ....:         {"project": "pyarrow", "version": "13.0.0"},
   ....:     ],
   ....:     dtype=pd.ArrowDtype(
   ....:         pa.struct([
   ....:             ("project", pa.string()),
   ....:             ("version", pa.string()),
   ....:         ])
   ....:     ),
   ....: )
   ....: 

In [11]: series.struct.explode()
Out[11]: 
   project version
0   pandas   2.2.0
1    numpy  1.25.2
2  pyarrow  13.0.0

Используйте Series.struct.field() для индексации в (возможно вложенное) поле структуры.

In [12]: series.struct.field("project")
Out[12]: 
0     pandas
1      numpy
2    pyarrow
Name: project, dtype: string[pyarrow]

Аксессор Series.list для данных PyArrow list#

The Series.list аксессор предоставляет атрибуты и методы для обработки данных с list[pyarrow] Series типа dtype. Например, Series.list.__getitem__() позволяет индексировать списки pyarrow в Series. (GH 55323)

In [13]: import pyarrow as pa

In [14]: series = pd.Series(
   ....:     [
   ....:         [1, 2, 3],
   ....:         [4, 5],
   ....:         [6],
   ....:     ],
   ....:     dtype=pd.ArrowDtype(
   ....:         pa.list_(pa.int64())
   ....:     ),
   ....: )
   ....: 

In [15]: series.list[0]
Out[15]: 
0    1
1    4
2    6
dtype: int64[pyarrow]

Движок Calamine для read_excel()#

The calamine движок был добавлен в read_excel(). Он использует python-calamine, который предоставляет привязки Python для библиотеки Rust calamine. Этот движок поддерживает файлы Excel (.xlsx, .xlsm, .xls, .xlsb) и электронных таблиц OpenDocument (.ods) (GH 50395).

Есть два преимущества этого движка:

  1. Calamine часто быстрее других движков, некоторые тесты показывают результаты до 5 раз быстрее, чем 'openpyxl', 20 раз - 'odf', 4 раза - 'pyxlsb' и 1.5 раза - 'xlrd'. Но 'openpyxl' и 'pyxlsb' быстрее при чтении нескольких строк из больших файлов из-за ленивой итерации по строкам.

  2. Calamine поддерживает распознавание даты и времени в .xlsb файлы, в отличие от 'pyxlsb', который является единственным другим движком в pandas, способным читать .xlsb файлы.

pd.read_excel("path_to_file.xlsb", engine="calamine")

Для получения дополнительной информации см. Calamine (файлы Excel и ODS) в руководстве пользователя по инструментам ввода-вывода.

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

  • to_sql() с параметром method, установленным в multi работает с Oracle на бэкенде

  • Series.attrs / DataFrame.attrs теперь использует deepcopy для распространения attrs (GH 54134).

  • get_dummies() теперь возвращает типы данных расширений boolean или bool[pyarrow] которые совместимы с входным типом данных (GH 56273)

  • read_csv() теперь поддерживает on_bad_lines параметр с engine="pyarrow" (GH 54480)

  • read_sas() возвращает datetime64 типы данных с разрешениями, лучше соответствующими тем, которые хранятся нативно в SAS, и избегает возврата object-dtype в случаях, которые не могут быть сохранены с datetime64[ns] тип данных (GH 56127)

  • read_spss() теперь возвращает DataFrame который хранит метаданные в DataFrame.attrs (GH 54264)

  • tseries.api.guess_datetime_format() теперь является частью публичного API (GH 54727)

  • DataFrame.apply() теперь позволяет использование numba (через engine="numba") для JIT-компиляции переданной функции, позволяя потенциально ускорить выполнение (GH 54666)

  • ExtensionArray._explode() метод интерфейса добавлен для реализации расширенных типов explode метод (GH 54833)

  • ExtensionArray.duplicated() добавлено для реализации расширенных типов duplicated метод (GH 55255)

  • Series.ffill(), Series.bfill(), DataFrame.ffill(), и DataFrame.bfill() получили аргумент limit_area; сторонние ExtensionArray авторам нужно добавить этот аргумент в метод _pad_or_backfill (GH 56492)

  • Разрешить передачу read_only, data_only и keep_links аргументы для openpyxl с использованием engine_kwargs of read_excel() (GH 55027)

  • Реализовать Series.interpolate() и DataFrame.interpolate() для ArrowDtype и маскированные типы данных (GH 56267)

  • Реализовать маскированные алгоритмы для Series.value_counts() (GH 54984)

  • Реализовано Series.dt() методы и атрибуты для ArrowDtype с pyarrow.duration тип (GH 52284)

  • Реализовано Series.str.extract() для ArrowDtype (GH 56268)

  • Улучшено сообщение об ошибке, которое появляется в DatetimeIndex.to_period() с частотами, которые не поддерживаются как периодические частоты, например "BMS" (GH 56243)

  • Улучшено сообщение об ошибке при создании Period с недопустимыми смещениями, такими как "QS" (GH 55785)

  • Типы данных string[pyarrow] и string[pyarrow_numpy] теперь оба используют large_string тип из PyArrow, чтобы избежать переполнения для длинных столбцов (GH 56259)

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

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

merge() и DataFrame.join() теперь последовательно следуют задокументированному поведению сортировки#

В предыдущих версиях pandas, merge() и DataFrame.join() не всегда возвращал результат, соответствующий задокументированному поведению сортировки. Теперь pandas следует задокументированному поведению сортировки в операциях слияния и объединения (GH 54611, GH 56426, GH 56443).

Как задокументировано, sort=True сортирует ключи соединения лексикографически в результирующем DataFrame. С sort=False, порядок ключей соединения зависит от типа соединения (how ключевое слово):

  • how="left": сохранить порядок левых ключей

  • how="right": сохранить порядок правых ключей

  • how="inner": сохранить порядок левых ключей

  • how="outer": сортировка ключей лексикографически

Один пример с изменяющимся поведением — внутренние объединения с неуникальными ключами левого объединения и sort=False:

In [16]: left = pd.DataFrame({"a": [1, 2, 1]})

In [17]: right = pd.DataFrame({"a": [1, 2]})

In [18]: result = pd.merge(left, right, how="inner", on="a", sort=False)

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

In [5]: result
Out[5]:
   a
0  1
1  1
2  2

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

In [19]: result
Out[19]: 
   a
0  1
1  2
2  1

merge() и DataFrame.join() больше не переупорядочивает уровни при различии уровней#

В предыдущих версиях pandas, merge() и DataFrame.join() переупорядочивал уровни индекса при объединении двух индексов с разными уровнями (GH 34133).

In [20]: left = pd.DataFrame({"left": 1}, index=pd.MultiIndex.from_tuples([("x", 1), ("x", 2)], names=["A", "B"]))

In [21]: right = pd.DataFrame({"right": 2}, index=pd.MultiIndex.from_tuples([(1, 1), (2, 2)], names=["B", "C"]))

In [22]: left
Out[22]: 
     left
A B      
x 1     1
  2     1

In [23]: right
Out[23]: 
     right
B C       
1 1      2
2 2      2

In [24]: result = left.join(right)

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

In [5]: result
Out[5]:
       left  right
B A C
1 x 1     1      2
2 x 2     1      2

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

In [25]: result
Out[25]: 
       left  right
A B C             
x 1 1     1      2
  2 2     1      2

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

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

Пакет

Новая минимальная версия

beautifulsoup4

4.11.2

blosc

1.21.3

bottleneck

1.3.6

fastparquet

2022.12.0

fsspec

2022.11.0

gcsfs

2022.11.0

lxml

4.9.2

matplotlib

3.6.3

numba

0.56.4

numexpr

2.8.4

qtpy

2.3.0

openpyxl

3.1.0

psycopg2

2.9.6

pyreadstat

1.2.0

pytables

3.8.0

pyxlsb

1.0.10

s3fs

2022.11.0

scipy

1.10.0

sqlalchemy

2.0.0

tabulate

0.9.0

xarray

2022.12.0

xlsxwriter

3.0.5

zstandard

0.19.0

pyqt5

5.15.8

tzdata

2022.7

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

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

  • Хэш-значения расширенных типов данных с поддержкой NULL изменились для повышения производительности операции хэширования (GH 56507)

  • check_exact теперь действует только для типов данных с плавающей запятой в testing.assert_frame_equal() и testing.assert_series_equal(). В частности, целочисленные типы данных всегда проверяются точно (GH 55882)

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

Цепное присваивание#

В рамках подготовки к крупным предстоящим изменениям в поведении копирования / представления в pandas 3.0 (Copy-on-Write (CoW), PDEP-7), мы начали устаревание цепное присваивание.

Цепное присваивание происходит, когда вы пытаетесь обновить DataFrame или Series pandas через две последовательные операции индексирования. В зависимости от типа и порядка этих операций это в настоящее время работает или не работает.

Типичный пример выглядит следующим образом:

df = pd.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]})

# first selecting rows with a mask, then assigning values to a column
# -> this has never worked and raises a SettingWithCopyWarning
df[df["bar"] > 5]["foo"] = 100

# first selecting the column, and then assigning to a subset of that column
# -> this currently works
df["foo"][df["bar"] > 5] = 100

Этот второй пример цепочечного присваивания в настоящее время работает для обновления исходного df. Это больше не будет работать в pandas 3.0, поэтому мы начали устаревание этого:

>>> df["foo"][df["bar"] > 5] = 100
FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!
You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.
A typical example is when you are setting values in a column of a DataFrame, like:

df["col"][row_indexer] = value

Use `df.loc[row_indexer, "col"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

Вы можете исправить это предупреждение и убедиться, что ваш код готов для pandas 3.0, удалив использование цепочечного присваивания. Обычно это можно сделать, выполнив присваивание в один шаг, используя, например, .loc. Для примера выше мы можем сделать:

df.loc[df["bar"] > 5, "foo"] = 100

Такое же устаревание применяется к методам inplace, выполняемым цепочкой, например:

>>> df["foo"].fillna(0, inplace=True)
FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.
The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.

For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.

Когда цель — обновить столбец в DataFrame df, альтернатива здесь — вызвать метод на df самого себя, например, df.fillna({"foo": 0}, inplace=True).

Подробнее см. в руководство по миграции.

Устарели псевдонимы M, Q, Y, и т.д. в пользу ME, QE, YE, и т.д. для смещений#

Устарели следующие псевдонимы частот (GH 9586):

смещения

устаревшие псевдонимы

новые псевдонимы

MonthEnd

M

ME

BusinessMonthEnd

BM

BME

SemiMonthEnd

SM

SME

CustomBusinessMonthEnd

CBM

CBME

QuarterEnd

Q

QE

BQuarterEnd

BQ

BQE

YearEnd

Y

YE

BYearEnd

BY

BYE

Например:

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

In [8]: pd.date_range('2020-01-01', periods=3, freq='Q-NOV')
Out[8]:
DatetimeIndex(['2020-02-29', '2020-05-31', '2020-08-31'],
              dtype='datetime64[ns]', freq='Q-NOV')

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

In [26]: pd.date_range('2020-01-01', periods=3, freq='QE-NOV')
Out[26]: DatetimeIndex(['2020-02-29', '2020-05-31', '2020-08-31'], dtype='datetime64[ns]', freq='QE-NOV')

Устаревшее автоматическое понижение типа#

Устарел автоматический понижающий кастинг результатов типа object в ряде методов. Это молча изменяло dtype труднопредсказуемым образом, поскольку поведение зависело от значений. Кроме того, pandas отходит от молчаливых изменений dtype (GH 54710, GH 54261).

Эти методы:

Явный вызов DataFrame.infer_objects() для воспроизведения текущего поведения в будущем.

result = result.infer_objects(copy=False)

Или явно преобразуйте все числа с плавающей точкой в целые с помощью astype.

Установите следующую опцию, чтобы перейти на будущее поведение:

In [9]: pd.set_option("future.no_silent_downcasting", True)

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

  • Изменено Timedelta.resolution_string() для возврата h, min, s, ms, us, и ns вместо H, T, S, L, U, и N, для совместимости с соответствующими устареваниями в псевдонимах частоты (GH 52536)

  • Устаревший offsets.Day.delta, offsets.Hour.delta, offsets.Minute.delta, offsets.Second.delta, offsets.Milli.delta, offsets.Micro.delta, offsets.Nano.delta, используйте pd.Timedelta(obj) вместо (GH 55498)

  • Устаревший pandas.api.types.is_interval() и pandas.api.types.is_period(), используйте isinstance(obj, pd.Interval) и isinstance(obj, pd.Period) вместо (GH 55264)

  • Устаревший read_gbq() и DataFrame.to_gbq(). Используйте pandas_gbq.read_gbq и pandas_gbq.to_gbq вместо https://pandas-gbq.readthedocs.io/en/latest/api.html (GH 55525)

  • Устаревший DataFrameGroupBy.fillna() и SeriesGroupBy.fillna(); используйте DataFrameGroupBy.ffill(), DataFrameGroupBy.bfill() для заполнения вперед и назад или DataFrame.fillna() для заполнения одним значением (или эквиваленты Series) (GH 55718)

  • Устаревший DateOffset.is_anchored(), используйте obj.n == 1 для неподклассов Tick (для Tick это всегда было False) (GH 55388)

  • Устаревший DatetimeArray.__init__() и TimedeltaArray.__init__(), используйте array() вместо (GH 55623)

  • Устаревший Index.format(), используйте index.astype(str) или index.map(formatter) вместо (GH 55413)

  • Устаревший Series.ravel(), базовый массив уже одномерный, поэтому ravel не нужен (GH 52511)

  • Устаревший Series.resample() и DataFrame.resample() с PeriodIndex (и ключевое слово 'convention'), преобразовать в DatetimeIndex.to_timestamp()) перед повторной выборкой вместо (GH 53481). Примечание: это устаревание было позже отменено в pandas 2.3.3 (GH 57033)

  • Устаревший Series.view(), используйте Series.astype() вместо этого для изменения типа данных (GH 20251)

  • Устаревший offsets.Tick.is_anchored(), используйте False вместо (GH 55388)

  • Устаревший core.internals члены Block, ExtensionBlock, и DatetimeTZBlock, используйте публичные API вместо (GH 55139)

  • Устаревший year, month, quarter, day, hour, minute, и second ключевые слова в PeriodIndex конструктор, используйте PeriodIndex.from_fields() вместо (GH 55960)

  • Устарело принятие типа в качестве аргумента в Index.view(), вызывайте без аргументов (GH 55709)

  • Устарело разрешение нецелочисленных periods аргумент в date_range(), timedelta_range(), period_range(), и interval_range() (GH 56036)

  • Устарело разрешение неключевых аргументов в DataFrame.to_clipboard() (GH 54229)

  • Устарело разрешение неключевых аргументов в DataFrame.to_csv() кроме path_or_buf (GH 54229)

  • Устарело разрешение неключевых аргументов в DataFrame.to_dict() (GH 54229)

  • Устарело разрешение неключевых аргументов в DataFrame.to_excel() кроме excel_writer (GH 54229)

  • Устарело разрешение неключевых аргументов в DataFrame.to_gbq() кроме destination_table (GH 54229)

  • Устарело разрешение неключевых аргументов в DataFrame.to_hdf() кроме path_or_buf (GH 54229)

  • Устарело разрешение неключевых аргументов в DataFrame.to_html() кроме buf (GH 54229)

  • Устарело разрешение неключевых аргументов в DataFrame.to_json() кроме path_or_buf (GH 54229)

  • Устарело разрешение неключевых аргументов в DataFrame.to_latex() кроме buf (GH 54229)

  • Устарело разрешение неключевых аргументов в DataFrame.to_markdown() кроме buf (GH 54229)

  • Устарело разрешение неключевых аргументов в DataFrame.to_parquet() кроме path (GH 54229)

  • Устарело разрешение неключевых аргументов в DataFrame.to_pickle() кроме path (GH 54229)

  • Устарело разрешение неключевых аргументов в DataFrame.to_string() кроме buf (GH 54229)

  • Устарело разрешение неключевых аргументов в DataFrame.to_xml() кроме path_or_buffer (GH 54229)

  • Устарело разрешение передачи BlockManager объекты в DataFrame или SingleBlockManager объекты в Series (GH 52419)

  • Устаревшее поведение Index.insert() с индексом object-dtype, неявно выполняющим вывод типа для результата, явно вызовите result.infer_objects(copy=False) для старого поведения вместо (GH 51363)

  • Устаревшее приведение не-датаподобных значений (в основном строк) в Series.isin() и Index.isin() с datetime64, timedelta64, и PeriodDtype типы данных (GH 53111)

  • Устаревший вывод типа данных в Index, Series и DataFrame конструкторы при передаче pandas-ввода, вызывают .infer_objects на входе для сохранения текущего поведения (GH 56012)

  • Устаревший вывод типа данных при установке Index в DataFrame, выполните явное приведение вместо этого (GH 56102)

  • Устарело: включение групп в вычисления при использовании DataFrameGroupBy.apply() и DataFrameGroupBy.resample(); передать include_groups=False для исключения групп (GH 7155)

  • Устаревшее индексирование Index с булевым индексатором нулевой длины (GH 55820)

  • Устарело: не передавать кортеж в DataFrameGroupBy.get_group или SeriesGroupBy.get_group при группировке по списку длиной 1 (GH 25971)

  • Устаревшая строка AS обозначая частоту в YearBegin и строки AS-DEC, AS-JAN, и т.д., обозначающие годовые частоты с различными началами финансового года (GH 54275)

  • Устаревшая строка A обозначая частоту в YearEnd и строки A-DEC, A-JAN, и т.д., обозначающие годовые частоты с различными концами финансового года (GH 54275)

  • Устаревшая строка BAS обозначая частоту в BYearBegin и строки BAS-DEC, BAS-JAN, и т.д., обозначающие годовые частоты с различными началами финансового года (GH 54275)

  • Устаревшая строка BA обозначая частоту в BYearEnd и строки BA-DEC, BA-JAN, и т.д., обозначающие годовые частоты с различными концами финансового года (GH 54275)

  • Устаревшие строки H, BH, и CBH обозначая частоты в Hour, BusinessHour, CustomBusinessHour (GH 52536)

  • Устаревшие строки H, S, U, и N обозначая единицы в to_timedelta() (GH 52536)

  • Устаревшие строки H, T, S, L, U, и N обозначая единицы в Timedelta (GH 52536)

  • Устаревшие строки T, S, L, U, и N обозначая частоты в Minute, Second, Milli, Micro, Nano (GH 52536)

  • Устаревшая поддержка объединения разобранных столбцов даты и времени в read_csv() вместе с keep_date_col ключевое слово (GH 55569)

  • Устарел DataFrameGroupBy.grouper и SeriesGroupBy.grouper; эти атрибуты будут удалены в будущей версии pandas (GH 56521)

  • Устарел Grouping атрибуты group_index, result_index, и group_arraylike; они будут удалены в будущей версии pandas (GH 56148)

  • Устарел delim_whitespace ключевое слово в read_csv() и read_table(), используйте sep="\\s+" вместо (GH 55569)

  • Устарел errors="ignore" опция в to_datetime(), to_timedelta(), и to_numeric(); явно перехватывайте исключения вместо (GH 54467)

  • Устарел fastpath ключевое слово в Series конструктор (GH 20110)

  • Устарел kind ключевое слово в Series.resample() и DataFrame.resample(), явно привести index вместо (GH 55895)

  • Устарел ordinal ключевое слово в PeriodIndex, используйте PeriodIndex.from_ordinals() вместо (GH 55960)

  • Устарел unit ключевое слово в TimedeltaIndex конструкция, используйте to_timedelta() вместо (GH 55499)

  • Устарел verbose ключевое слово в read_csv() и read_table() (GH 55569)

  • Устаревшее поведение DataFrame.replace() и Series.replace() с CategoricalDtype; в будущей версии replace будет изменять значения, сохраняя категории. Для изменения категорий используйте ser.cat.rename_categories вместо (GH 55147)

  • Устаревшее поведение Series.value_counts() и Index.value_counts() с типом данных object; в будущей версии они не будут выполнять определение типа данных для результирующего Index, сделайте result.index = result.index.infer_objects() для сохранения старого поведения (GH 56161)

  • Устаревшее значение по умолчанию для observed=False в DataFrame.pivot_table(); будет True в будущей версии (GH 56236)

  • Устаревшие классы тестов расширений BaseNoReduceTests, BaseBooleanReduceTests, и BaseNumericReduceTests, используйте BaseReduceTests вместо (GH 54663)

  • Устаревшая опция mode.data_manager и ArrayManager; только BlockManager будет доступно в будущих версиях (GH 55043)

  • Устаревшая предыдущая реализация DataFrame.stack; укажите future_stack=True для принятия будущей версии (GH 53515)

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

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

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

  • Categorical.isin() вызов InvalidIndexError для категориальных, содержащих перекрывающиеся Interval значения (GH 34974)

  • Ошибка в CategoricalDtype.__eq__() возвращая False для неупорядоченных категориальных данных со смешанными типами (GH 55468)

  • Ошибка при приведении типа pa.dictionary to CategoricalDtype используя pa.DictionaryArray как категории (GH 56672)

Datetimelike#

  • Ошибка в DatetimeIndex конструкция при передаче одновременно tz и либо dayfirst или yearfirst игнорируя dayfirst/yearfirst (GH 55813)

  • Ошибка в DatetimeIndex при передаче ndarray типа object из объектов float и tz неправильная локализация результата (GH 55780)

  • Ошибка в Series.isin() с DatetimeTZDtype тип данных и значения сравнения, которые все NaT некорректно возвращал все-False даже если серия содержит NaT записи (GH 56427)

  • Ошибка в concat() вызов AttributeError при конкатенации полностью NA DataFrame с DatetimeTZDtype dtype DataFrame (GH 52093)

  • Ошибка в testing.assert_extension_array_equal() что могло использовать неправильную единицу измерения при сравнении разрешений (GH 55730)

  • Ошибка в to_datetime() и DatetimeIndex при передаче списка смешанных строковых и числовых типов, ошибочно вызывая (GH 55780)

  • Ошибка в to_datetime() и DatetimeIndex при передаче объектов смешанного типа с миксом часовых поясов или миксом учёта часовых поясов, не удаётся поднять ValueError (GH 55693)

  • Ошибка в Tick.delta() с очень большими делениями, вызывая OverflowError вместо OutOfBoundsTimedelta (GH 55503)

  • Ошибка в DatetimeIndex.shift() с разрешением не в наносекундах, некорректно возвращающий с разрешением в наносекундах (GH 56117)

  • Ошибка в DatetimeIndex.union() возвращение типа object для индексов с учётом часового пояса с одинаковым часовым поясом, но разными единицами измерения (GH 55238)

  • Ошибка в Index.is_monotonic_increasing() и Index.is_monotonic_decreasing() всегда кэшировать Index.is_unique() как True когда первое значение в индексе NaT (GH 55755)

  • Ошибка в Index.view() в тип данных datetime64 с неподдерживаемым разрешением, неправильно вызывая (GH 55710)

  • Ошибка в Series.dt.round() с разрешением, отличным от наносекунд, и NaT записи, ошибочно вызывающие OverflowError (GH 56158)

  • Ошибка в Series.fillna() с типами данных с разрешением не в наносекундах и векторными значениями более высокого разрешения, возвращающими некорректные (внутренне повреждённые) результаты (GH 56410)

  • Ошибка в Timestamp.unit() неправильно выводился из строки формата ISO8601 с разрешением в минуты или часы и смещением часового пояса (GH 56208)

  • Ошибка в .astype преобразование из более высокого разрешения datetime64 тип данных с более низким разрешением datetime64 тип данных (например, datetime64[us]->datetime64[ms]) тихо переполняется значениями, близкими к нижней границе реализации (GH 55979)

  • Ошибка при добавлении или вычитании Week смещение к datetime64 Series, Index, или DataFrame столбец с разрешением не в наносекундах возвращает некорректные результаты (GH 55583)

  • Ошибка в сложении или вычитании BusinessDay смещение с offset атрибут к не-наносекундному Index, Series, или DataFrame столбец выдает некорректные результаты (GH 55608)

  • Ошибка в сложении или вычитании DateOffset объектов с микросекундными компонентами в datetime64 Index, Series, или DataFrame столбцы с разрешением, отличным от наносекундного (GH 55595)

  • Ошибка при сложении или вычитании очень больших Tick объекты с Timestamp или Timedelta объекты, вызывающие OverflowError вместо OutOfBoundsTimedelta (GH 55503)

  • Ошибка при создании Index, Series, или DataFrame с не-наносекундным DatetimeTZDtype и входные данные, которые выходят за пределы с наносекундным разрешением, некорректно вызывают OutOfBoundsDatetime (GH 54620)

  • Ошибка при создании Index, Series, или DataFrame с не-наносекундным datetime64 (или DatetimeTZDtype) из смешанно-числовых входных данных, обрабатывая их как наносекунды вместо кратных единице dtype (что происходило бы с не смешанными числовыми входными данными) (GH 56004)

  • Ошибка при создании Index, Series, или DataFrame с не-наносекундным datetime64 dtype и входные данные, которые выходят за пределы для datetime64[ns] некорректное возбуждение OutOfBoundsDatetime (GH 55756)

  • Ошибка при парсинге строк даты и времени с наносекундным разрешением в не-ISO8601 форматах, некорректно обрезающая субмикросекундные компоненты (GH 56051)

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

  • Ошибка в результатах to_datetime() с аргументом типа с плавающей запятой с unit не соответствует поточечным результатам Timestamp (GH 56037)

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

Timedelta#

  • Ошибка в Timedelta construction raising OverflowError вместо OutOfBoundsTimedelta (GH 55503)

  • Ошибка в отображении (__repr__) из TimedeltaIndex и Series со значениями timedelta64 с разрешением не в наносекундах, где все записи являются кратными 24 часам, не использующими компактное представление, применяемое в случаях с наносекундами (GH 55405)

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

  • Ошибка в AbstractHolidayCalendar где данные часового пояса не распространялись при вычислении праздничных дней (GH 54580)

  • Ошибка в Timestamp конструкция с неоднозначным значением и pytz часовой пояс не вызывал ошибку pytz.AmbiguousTimeError (GH 55657)

  • Ошибка в Timestamp.tz_localize() с nonexistent="shift_forward вокруг UTC+0 во время перехода на летнее время (GH 51501)

Числовой#

  • Ошибка в read_csv() с engine="pyarrow" вызывая ошибки округления для больших целых чисел (GH 52505)

  • Ошибка в Series.__floordiv__() и Series.__truediv__() для ArrowDtype с целочисленными типами данных, вызывающая ошибку для больших делителей (GH 56706)

  • Ошибка в Series.__floordiv__() для ArrowDtype с целочисленными dtypes, вызывающими для больших значений (GH 56645)

  • Ошибка в Series.pow() неправильное заполнение пропущенных значений (GH 55512)

  • Ошибка в Series.replace() и DataFrame.replace() соответствующий float 0.0 с False и наоборот (GH 55398)

  • Ошибка в Series.round() вызов для обнуляемого булевого типа данных (GH 55936)

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

  • Ошибка в DataFrame.astype() при вызове с str на распакованном массиве - массив может измениться на месте (GH 54654)

  • Ошибка в DataFrame.astype() где errors="ignore" не имел эффекта для типов расширений (GH 54654)

  • Ошибка в Series.convert_dtypes() не преобразовывать все столбцы с NA в null[pyarrow] (GH 55346)

  • Ошибка в :meth:DataFrame.loc не выдавал "предупреждение о несовместимом dtype" (см. PDEP6) при присвоении Series с другим типом данных с использованием полного сеттера столбца (например, df.loc[:, 'a'] = incompatible_value) (GH 39584)

Строки#

Interval#

  • Ошибка в Interval __repr__ не отображает смещения UTC для Timestamp границы. Кроме того, теперь будут отображаться компоненты часа, минуты и секунды (GH 55015)

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

  • Ошибка в IntervalIndex.from_arrays() при передаче datetime64 или timedelta64 массивы с несовпадающим разрешением, создающие недопустимый IntervalArray объект (GH 55714)

  • Ошибка в IntervalIndex.from_tuples() вызов исключения, если подтип является нуллабельным расширенным типом данных (GH 56765)

  • Ошибка в IntervalIndex.get_indexer() с интервалами datetime или timedelta, некорректно сопоставляющими целочисленные цели (GH 47772)

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

  • Ошибка при установке значений на Series с IntervalIndex использование среза неправильно вызывает (GH 54722)

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

  • Ошибка в DataFrame.loc() изменение булева индексатора при DataFrame имеет MultiIndex (GH 56635)

  • Ошибка в DataFrame.loc() при установке Series преобразование типа данных расширения в тип данных NumPy (GH 55604)

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

  • Ошибка при установке Categorical значения в DataFrame с типами данных numpy, вызывающими RecursionError (GH 52927)

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

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

  • Ошибка в DataFrame.update() не обновлялся на месте для типов datetime64 с учётом часового пояса (GH 56227)

MultiIndex#

  • Ошибка в MultiIndex.get_indexer() не вызывая ValueError когда method предоставлен и индекс немонотонный (GH 53452)

I/O#

  • Ошибка в read_csv() где engine="python" не учитывал chunksize аргумент, когда skiprows был указан (GH 56323)

  • Ошибка в read_csv() где engine="python" вызывал TypeError когда вызываемый объект skiprows и был указан размер чанка (GH 55677)

  • Ошибка в read_csv() где on_bad_lines="warn" будет записывать в stderr вместо вызова предупреждения Python; теперь это дает errors.ParserWarning (GH 54296)

  • Ошибка в read_csv() с engine="pyarrow" где quotechar игнорировался (GH 52266)

  • Ошибка в read_csv() с engine="pyarrow" где usecols не работал с CSV без заголовков (GH 54459)

  • Ошибка в read_excel(), с engine="xlrd" (xls файлы) выдают ошибку, когда файл содержит NaN или Inf (GH 54564)

  • Ошибка в read_json() не обрабатывает преобразование dtype правильно, если infer_string установлен (GH 56195)

  • Ошибка в DataFrame.to_excel(), с OdsWriter (ods файлы) запись логического/строкового значения (GH 54994)

  • Ошибка в DataFrame.to_hdf() и read_hdf() с datetime64 dtypes с разрешением не в наносекундах не корректно сохраняются при сериализации (GH 55622)

  • Ошибка в DataFrame.to_stata() вызов для типов данных расширений (GH 54671)

  • Ошибка в read_excel() с engine="odf" (ods файлы) когда строковая ячейка содержит аннотацию (GH 55200)

  • Ошибка в read_excel() с файлом ODS без кэшированной форматированной ячейки для значений с плавающей запятой (GH 55219)

  • Ошибка, где DataFrame.to_json() вызовет OverflowError вместо TypeError с неподдерживаемыми типами NumPy (GH 55403)

Period#

  • Ошибка в PeriodIndex построение, когда более одного из data, ordinal и **fields передаются, не вызывая ошибку ValueError (GH 55961)

  • Ошибка в Period тихое заворачивание при сложении вместо вызова исключения OverflowError (GH 55503)

  • Ошибка при приведении из PeriodDtype с astype to datetime64 или DatetimeTZDtype с нексекундной единицей измерения, неправильно возвращающие с наносекундной единицей (GH 55958)

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

  • Ошибка в DataFrame.plot.box() с vert=False и Matplotlib Axes создан с помощью sharey=True (GH 54941)

  • Ошибка в DataFrame.plot.scatter() отбрасывание строковых столбцов (GH 56142)

  • Ошибка в Series.plot() при повторном использовании ax объект не вызывает ошибку, когда how ключевое слово передано (GH 55953)

Groupby/resample/rolling#

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

  • Ошибка в concat() игнорируя sort параметр при передаче DatetimeIndex индексы (GH 54769)

  • Ошибка в concat() переименование Series когда ignore_index=False (GH 15047)

  • Ошибка в merge_asof() вызов TypeError когда by dtype не является object, int64, или uint64 (GH 22794)

  • Ошибка в merge_asof() вызов некорректной ошибки для строкового типа данных (GH 56444)

  • Ошибка в merge_asof() при использовании Timedelta допуск на ArrowDtype столбец (GH 56486)

  • Ошибка в merge() не вызывая исключение при слиянии столбцов datetime со столбцами timedelta (GH 56455)

  • Ошибка в merge() не вызывает ошибку при слиянии строковых столбцов с числовыми столбцами (GH 56441)

  • Ошибка в merge() не сортировка для нового строкового типа данных (GH 56442)

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

  • Ошибка в DataFrame.melt() где возникало исключение, если var_name не был строкой (GH 55948)

  • Ошибка в DataFrame.melt() где это не сохранило бы дату и время (GH 55254)

  • Ошибка в DataFrame.pivot_table() где поле строки некорректно, когда столбцы имеют числовые имена (GH 26568)

  • Ошибка в DataFrame.pivot() с числовыми столбцами и расширенным типом данных для данных (GH 56528)

  • Ошибка в DataFrame.stack() с future_stack=True не сохранял значения NA в индексе (GH 56573)

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

  • Ошибка в arrays.SparseArray.take() при использовании другого значения заполнения, чем значение заполнения массива (GH 55181)

Другие#

  • DataFrame.__dataframe__() не поддерживал большие строки pyarrow (GH 56702)

  • Ошибка в DataFrame.describe() при форматировании процентилей в результате процентиль 99.999% округляется до 100% (GH 55765)

  • Ошибка в api.interchange.from_dataframe() где возникла ошибка NotImplementedError при обработке пустых строковых столбцов (GH 56703)

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

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

  • Ошибка в infer_freq() и DatetimeIndex.inferred_freq() с недельными частотами и разрешениями не в наносекундах (GH 55609)

  • Ошибка в DataFrame.apply() где передача raw=True игнорируется args передается в применяемую функцию (GH 55009)

  • Ошибка в DataFrame.from_dict() что всегда будет сортировать строки созданного DataFrame. (GH 55683)

  • Ошибка в DataFrame.sort_index() при передаче axis="columns" и ignore_index=True вызов ValueError (GH 56478)

  • Ошибка в отображении inf значения внутри DataFrame с use_inf_as_na опция включена (GH 55483)

  • Ошибка при отображении Series с MultiIndex когда имя одного из уровней индекса равно 0, и это имя не отображается (GH 55415)

  • Ошибка в сообщении об ошибке при присвоении пустого DataFrame в столбец (GH 55956)

  • Ошибка, когда строки, похожие на время, приводились к ArrowDtype с pyarrow.time64 тип (GH 56463)

  • Исправлено ложное предупреждение об устаревании от numba >= 0.58.0 при передаче numpy ufunc в core.window.Rolling.apply с engine="numba" (GH 55247)

Участники#

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

  • AG

  • Aaron Rahman +

  • Abdullah Ihsan Secer +

  • Абхиджит Део +

  • Adrian D’Alessandro

  • Ахмад Мустафа Анис +

  • Amanda Bizzinotto

  • Amith KK +

  • Aniket Patil +

  • Antonio Fonseca +

  • Артур Барсегян

  • Ben Greiner

  • Bill Blum +

  • Boyd Kane

  • Damian Kula

  • Dan King +

  • Даниэль Вайндл +

  • Daniele Nicolodi

  • David Poznik

  • David Toneian +

  • Dea María Léon

  • Deepak George +

  • Dmitriy +

  • Dominique Garmier +

  • Donald Thevalingam +

  • Doug Davis +

  • Dukastlik +

  • Elahe Sharifi +

  • Eric Han +

  • Fangchen Li

  • Francisco Alfaro +

  • Гадеа Отрик +

  • Guillaume Lemaitre

  • Hadi Abdi Khojasteh

  • Hedeer El Showk +

  • Huanghz2001 +

  • Isaac Virshup

  • Issam +

  • Itay Azolay +

  • Itayazolay +

  • Jaca +

  • Джек МакИвор +

  • JackCollins91 +

  • James Spencer +

  • Jay

  • Jessica Greene

  • Jirka Borovec +

  • Йоханна Трост +

  • John C +

  • Joris Van den Bossche

  • José Lucas Mayer +

  • José Lucas Silva Mayer +

  • Жуан Андраде +

  • Kai Mühlbauer

  • Катарина Тилкинг, MD +

  • Kazuto Haruguchi +

  • Kevin

  • Lawrence Mitchell

  • Linus +

  • Linus Sommer +

  • Louis-Émile Robitaille +

  • Люк Мэнли

  • Lumberbot (он же Джек)

  • Maggie Liu +

  • MainHanzo +

  • Марк Гарсия

  • Marco Edward Gorelli

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

  • Martin Šícho +

  • Mateusz Sokół

  • Matheus Felipe +

  • Мэтью Рёшке

  • Маттиас Бюссонье

  • Maxwell Bileschi +

  • Michael Tiemann

  • Michał Górny

  • Molly Bowers +

  • Moritz Schubert +

  • NNLNR +

  • Natalia Mokeeva

  • Nils Müller-Wendt +

  • Omar Elbaz

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

  • Paras Gupta +

  • Parthi

  • Patrick Hoefler

  • Paul Pellissier +

  • Paul Uhlenbruck +

  • Филип Майер

  • Philippe THOMY +

  • Quang Nguyễn

  • Raghav

  • Rajat Subhra Mukherjee

  • Ralf Gommers

  • Randolf Scholz +

  • Richard Shadrach

  • Rob +

  • Rohan Jain +

  • Ryan Gibson +

  • Sai-Suraj-27 +

  • Samuel Oranyeli +

  • Sara Bonati +

  • Себастьян Берг

  • Sergey Zakharov +

  • Shyamala Venkatakrishnan +

  • StEmGeo +

  • Stefanie Molin

  • Стейн де Гойер +

  • Тьяго Гариани +

  • Thomas A Caswell

  • Thomas Baumann +

  • Thomas Guillet +

  • Томас Лазарус +

  • Thomas Li

  • Tim Hoffmann

  • Tim Swast

  • Tom Augspurger

  • Toro +

  • Torsten Wörtwein

  • Ville Aikas +

  • Vinita Parasrampuria +

  • Vyas Ramasubramani +

  • William Andrea

  • William Ayd

  • Willian Wang +

  • Xiao Yuan

  • Yao Xiao

  • Yves Delley

  • Zemux1613 +

  • Ziad Kermadi +

  • aaron-robeson-8451 +

  • aram-cinnamon +

  • caneff +

  • ccccjone +

  • chris-caballero +

  • кобальт

  • color455nm +

  • denisrei +

  • dependabot[bot]

  • jbrockmendel

  • jfadia +

  • johanna.trost +

  • kgmuzungu +

  • mecopur +

  • mhb143 +

  • morotti +

  • mvirts +

  • omar-elbaz

  • paulreece

  • pre-commit-ci[bot]

  • raj-thapa

  • rebecca-palmer

  • rmhowe425

  • rohanjain101

  • shiersansi +

  • smij720

  • srkds +

  • taytzehao

  • torext

  • vboxuser +

  • xzmeng +

  • yashb +