Что нового в версии 1.0.0 (29 января 2020)#
Это изменения в pandas 1.0.0. См. Примечания к выпуску для полного списка изменений, включая другие версии pandas.
Примечание
Выпуск pandas 1.0 удалил множество функций, которые были устаревшими в предыдущих релизах (см. ниже для обзора). Рекомендуется сначала обновить до pandas 0.25 и убедиться, что ваш код работает без предупреждений, прежде чем обновлять до pandas 1.0.
Новая политика устаревания#
Начиная с pandas 1.0.0, pandas примет вариант SemVer в релизы версий. Вкратце,
Устаревания будут вводиться в минорных релизах (например, 1.1.0, 1.2.0, 2.1.0, …)
Устаревания будут применяться в основных выпусках (например, 1.0.0, 2.0.0, 3.0.0, …)
Критические изменения API будут вноситься только в основных релизах (за исключением экспериментальных функций)
См. Политика версий подробнее.
Улучшения#
Использование Numba в rolling.apply и expanding.apply#
Мы добавили engine ключевое слово для apply() и apply()
который позволяет пользователю выполнить процедуру с использованием Numba вместо Cython.
Использование движка Numba может дать значительный прирост производительности, если функция apply может работать с массивами numpy и
набор данных больше (1 миллион строк или более). Для получения более подробной информации см.
документация по rolling apply (GH 28987, GH 30936)
Определение пользовательских окон для операций скользящего окна#
Мы добавили pandas.api.indexers.BaseIndexer() класс, который позволяет пользователям определять, как
создаются границы окон во время rolling операции. Пользователи могут определять свои собственные get_window_bounds
метод на pandas.api.indexers.BaseIndexer() подкласс, который будет генерировать начальные и конечные
индексы, используемые для каждого окна во время скользящей агрегации. Для получения дополнительных сведений и примеров использования см.
документация по пользовательскому скользящему окну
Преобразование в markdown#
Мы добавили to_markdown() для создания таблицы в формате markdown (GH 11052)
In [1]: df = pd.DataFrame({"A": [1, 2, 3], "B": [1, 2, 3]}, index=['a', 'a', 'b'])
In [2]: print(df.to_markdown())
| | A | B |
|:---|----:|----:|
| a | 1 | 1 |
| a | 2 | 2 |
| b | 3 | 3 |
Экспериментальные новые функции#
Экспериментальный NA скаляр для обозначения пропущенных значений#
Новый pd.NA значение (синглтон) вводится для представления скалярных пропущенных значений. До сих пор pandas использовал несколько значений для представления пропущенных данных: np.nan используется для этого для данных с плавающей точкой, np.nan или
None для данных object-dtype и pd.NaT для данных типа datetime. Цель pd.NA предоставляет индикатор "пропущенных" значений, который можно использовать
последовательно для всех типов данных. pd.NA в настоящее время используется для целочисленных и булевых типов данных с поддержкой null, а также для нового строкового типа данных (GH 28095).
Предупреждение
Экспериментально: поведение pd.NA всё ещё может измениться без предупреждения.
Например, создание Series с использованием nullable integer dtype:
In [3]: s = pd.Series([1, 2, None], dtype="Int64")
In [4]: s
Out[4]:
0 1
1 2
2
Length: 3, dtype: Int64
In [5]: s[2]
Out[5]:
По сравнению с np.nan, pd.NA ведет себя по-разному в определенных операциях.
Помимо арифметических операций, pd.NA также распространяется как "отсутствующий" или "неизвестный" в операциях сравнения:
In [6]: np.nan > 1
Out[6]: False
In [7]: pd.NA > 1
Out[7]:
Для логических операций, pd.NA следует правилам
трехзначная логика (или
Логика Клини). Например:
In [8]: pd.NA | True
Out[8]: True
Для получения дополнительной информации см. раздел NA -NaN
Специализированный строковый тип данных#
Мы добавили StringDtype, тип расширения, предназначенный для строковых данных.
Ранее строки обычно хранились в массивах NumPy с типом object. (GH 29975)
Предупреждение
StringDtype в настоящее время считается экспериментальным. Реализация
и части API могут измениться без предупреждения.
The 'string' тип расширения решает несколько проблем с массивами NumPy типа object-dtype:
Вы можете случайно сохранить смесь строк и не-строк в
objectмассив dtype. AStringArrayможет хранить только строки.objectdtype нарушает операции, специфичные для dtype, такие какDataFrame.select_dtypes(). Нет чёткого способа выбрать просто текст, исключая не-текст, но всё ещё столбцы типа object.При чтении кода содержимое
objectмассив dtype менее понятен чемstring.
In [9]: pd.Series(['abc', None, 'def'], dtype=pd.StringDtype())
Out[9]:
0 abc
1
2 def
Length: 3, dtype: string
Вы можете использовать псевдоним "string" также.
In [10]: s = pd.Series(['abc', None, 'def'], dtype="string")
In [11]: s
Out[11]:
0 abc
1
2 def
Length: 3, dtype: string
Обычные методы доступа к строкам работают. Там, где это уместно, тип возвращаемого значения Series или столбцов DataFrame также будет иметь строковый тип данных.
In [12]: s.str.upper()
Out[12]:
0 ABC
1
2 DEF
Length: 3, dtype: string
In [13]: s.str.split('b', expand=True).dtypes
Out[13]:
0 string[python]
1 string[python]
Length: 2, dtype: object
Методы строкового аксессора, возвращающие целые числа, будут возвращать значение с Int64Dtype
In [14]: s.str.count("a")
Out[14]:
0 1
1
2 0
Length: 3, dtype: Int64
Мы рекомендуем явно использовать string тип данных при работе со строками.
См. Текстовые типы данных подробнее.
Логический тип данных с поддержкой пропущенных значений#
Мы добавили BooleanDtype / BooleanArray, расширенного
типа, предназначенного для булевых данных, который может содержать пропущенные значения. По умолчанию
bool тип данных на основе bool-типа массива NumPy, столбец может содержать только
True или False, и не пропущенные значения. Это новое BooleanArray
может хранить пропущенные значения, отслеживая их в отдельной маске.
(GH 29555, GH 30095, GH 31131)
In [15]: pd.Series([True, False, None], dtype=pd.BooleanDtype())
Out[15]:
0 True
1 False
2
Length: 3, dtype: boolean
Вы можете использовать псевдоним "boolean" также.
In [16]: s = pd.Series([True, False, None], dtype="boolean")
In [17]: s
Out[17]:
0 True
1 False
2
Length: 3, dtype: boolean
Метод convert_dtypes для упрощения использования поддерживаемых типов данных расширений#
Чтобы поощрить использование типов данных расширений StringDtype,
BooleanDtype, Int64Dtype, Int32Dtype, и т.д., которые поддерживают pd.NA, методы DataFrame.convert_dtypes() и Series.convert_dtypes()
были введены. (GH 29752) (GH 30929)
Пример:
In [18]: df = pd.DataFrame({'x': ['abc', None, 'def'],
....: 'y': [1, 2, np.nan],
....: 'z': [True, False, True]})
....:
In [19]: df
Out[19]:
x y z
0 abc 1.0 True
1 None 2.0 False
2 def NaN True
[3 rows x 3 columns]
In [20]: df.dtypes
Out[20]:
x object
y float64
z bool
Length: 3, dtype: object
In [21]: converted = df.convert_dtypes()
In [22]: converted
Out[22]:
x y z
0 abc 1 True
1 2 False
2 def True
[3 rows x 3 columns]
In [23]: converted.dtypes
Out[23]:
x string[python]
y Int64
z boolean
Length: 3, dtype: object
Это особенно полезно после чтения данных с помощью таких ридеров, как read_csv()
и read_excel().
См. здесь для описания.
Другие улучшения#
DataFrame.to_string()добавилmax_colwidthпараметр для управления обрезкой широких столбцов (GH 9784)Добавлен
na_valueаргумент дляSeries.to_numpy(),Index.to_numpy()иDataFrame.to_numpy()для управления значением, используемым для отсутствующих данных (GH 30322)MultiIndex.from_product()выводит имена уровней из входных данных, если они не предоставлены явно (GH 27292)DataFrame.to_latex()теперь принимаетcaptionиlabelаргументы (GH 25436)DataFrames с nullable integer, новый строковый тип данных и тип данных периода теперь можно преобразовать в
pyarrow(>=0.15.0), что означает поддержку записи в формат Parquet при использованииpyarrowдвижок (GH 28368). Полный цикл до parquet (запись и чтение обратно сto_parquet()/read_parquet()) поддерживается начиная с pyarrow >= 0.16 (GH 20612).to_parquet()теперь корректно обрабатываетschemaаргумент для пользовательских схем в движке pyarrow. (GH 30270)DataFrame.to_json()теперь принимаетindentцелочисленный аргумент для включения красивого вывода JSON (GH 12004)read_stata()может читать файлы Stata 119 dta. (GH 28250)Реализовано
Window.var()иWindow.std()функции (GH 26597)Добавлен
encodingаргумент дляDataFrame.to_string()для не-ASCII текста (GH 28766)Добавлен
encodingаргумент дляDataFrame.to_html()для не-ASCII текста (GH 28663)Styler.background_gradient()теперь принимаетvminиvmaxаргументы (GH 12145)Styler.format()добавилna_repпараметр для форматирования пропущенных значений (GH 21527, GH 28358)read_excel()теперь можно читать двоичные файлы Excel (.xlsb) файлы, передаваяengine='pyxlsb'. Для получения дополнительных подробностей и примеров использования см. Документация по двоичным файлам Excel. Закрывает GH 8540.The
partition_colsаргумент вDataFrame.to_parquet()теперь принимает строку (GH 27117)pandas.read_json()теперь анализируетNaN,Infinityи-Infinity(GH 12213)Конструктор DataFrame сохраняет
ExtensionArraydtype сExtensionArray(GH 11363)DataFrame.sort_values()иSeries.sort_values()получилиignore_indexключевое слово для возможности сброса индекса после сортировки (GH 30114)DataFrame.sort_index()иSeries.sort_index()получилиignore_indexключевое слово для сброса индекса (GH 30114)DataFrame.drop_duplicates()получилignore_indexключевое слово для сброса индекса (GH 30114)Добавлен новый модуль записи для экспорта файлов Stata dta в версиях 118 и 119,
StataWriterUTF8. Эти форматы файлов поддерживают экспорт строк, содержащих символы Unicode. Формат 119 поддерживает наборы данных с более чем 32 767 переменными (GH 23573, GH 30959)Series.map()теперь принимаетcollections.abc.Mappingподклассы в качестве маппера (GH 29733)Добавлен экспериментальный
attrsдля хранения глобальных метаданных о наборе данных (GH 29062)Timestamp.fromisocalendar()теперь совместим с Python 3.8 и выше (GH 28115)DataFrame.to_pickle()иread_pickle()теперь принимают URL (GH 30163)
Обратно несовместимые изменения API#
Избегайте использования имен из MultiIndex.levels#
В рамках более крупного рефакторинга для MultiIndex имена уровней теперь хранятся отдельно от уровней (GH 27242). Мы рекомендуем использовать
MultiIndex.names для доступа к именам, и Index.set_names()
для обновления имен.
Для обратной совместимости вы всё ещё можете доступ имена через уровни.
In [24]: mi = pd.MultiIndex.from_product([[1, 2], ['a', 'b']], names=['x', 'y'])
In [25]: mi.levels[0].name
Out[25]: 'x'
Однако больше невозможно update имена MultiIndex
через уровень.
In [26]: mi.levels[0].name = "new name"
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
Cell In[26], line 1
----> 1 mi.levels[0].name = "new name"
File ~/work/pandas/pandas/pandas/core/indexes/base.py:1697, in Index.name(self, value)
1693 @name.setter
1694 def name(self, value: Hashable) -> None:
1695 if self._no_setting_name:
1696 # Used in MultiIndex.levels to avoid silently ignoring name updates.
-> 1697 raise RuntimeError(
1698 "Cannot set name on a level of a MultiIndex. Use "
1699 "'MultiIndex.set_names' instead."
1700 )
1701 maybe_extract_name(value, None, type(self))
1702 self._name = value
RuntimeError: Cannot set name on a level of a MultiIndex. Use 'MultiIndex.set_names' instead.
In [27]: mi.names
Out[27]: FrozenList(['x', 'y'])
Для обновления используйте MultiIndex.set_names, который возвращает новый MultiIndex.
In [28]: mi2 = mi.set_names("new name", level=0)
In [29]: mi2.names
Out[29]: FrozenList(['new name', 'y'])
Новое представление для IntervalArray#
pandas.arrays.IntervalArray принимает новый __repr__ в соответствии с другими классами массивов (GH 25022)
pandas 0.25.x
In [1]: pd.arrays.IntervalArray.from_tuples([(0, 1), (2, 3)])
Out[2]:
IntervalArray([(0, 1], (2, 3]],
closed='right',
dtype='interval[int64]')
pandas 1.0.0
In [30]: pd.arrays.IntervalArray.from_tuples([(0, 1), (2, 3)])
Out[30]:
[(0, 1], (2, 3]]
Length: 2, dtype: interval[int64, right]
DataFrame.rename теперь принимает только один позиционный аргумент#
DataFrame.rename() ранее принимал позиционные аргументы, которые могли привести
к неоднозначному или неопределенному поведению. Начиная с pandas 1.0, только первый аргумент, который
сопоставляет метки с их новыми именами вдоль оси по умолчанию, может быть передан по позиции
(GH 29136).
pandas 0.25.x
In [1]: df = pd.DataFrame([[1]])
In [2]: df.rename({0: 1}, {0: 2})
Out[2]:
FutureWarning: ...Use named arguments to resolve ambiguity...
2
1 1
pandas 1.0.0
In [3]: df.rename({0: 1}, {0: 2})
Traceback (most recent call last):
...
TypeError: rename() takes from 1 to 2 positional arguments but 3 were given
Обратите внимание, что теперь ошибки будут возникать при предоставлении конфликтующих или потенциально неоднозначных аргументов.
pandas 0.25.x
In [4]: df.rename({0: 1}, index={0: 2})
Out[4]:
0
1 1
In [5]: df.rename(mapper={0: 1}, index={0: 2})
Out[5]:
0
2 1
pandas 1.0.0
In [6]: df.rename({0: 1}, index={0: 2})
Traceback (most recent call last):
...
TypeError: Cannot specify both 'mapper' and any of 'index' or 'columns'
In [7]: df.rename(mapper={0: 1}, index={0: 2})
Traceback (most recent call last):
...
TypeError: Cannot specify both 'mapper' and any of 'index' or 'columns'
Вы всё ещё можете изменить ось, вдоль которой применяется первый позиционный аргумент,
указав axis аргумент ключевого слова.
In [31]: df.rename({0: 1})
Out[31]:
0
1 1
[1 rows x 1 columns]
In [32]: df.rename({0: 1}, axis=1)
Out[32]:
1
0 1
[1 rows x 1 columns]
Если вы хотите обновить как метки индекса, так и метки столбцов, обязательно используйте соответствующие ключевые слова.
In [33]: df.rename(index={0: 1}, columns={0: 2})
Out[33]:
2
1 1
[1 rows x 1 columns]
Расширенный подробный вывод информации для DataFrame#
DataFrame.info() теперь показывает номера строк для сводки столбцов (GH 17304)
pandas 0.25.x
In [1]: df = pd.DataFrame({"int_col": [1, 2, 3],
... "text_col": ["a", "b", "c"],
... "float_col": [0.0, 0.1, 0.2]})
In [2]: df.info(verbose=True)
RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
int_col 3 non-null int64
text_col 3 non-null object
float_col 3 non-null float64
dtypes: float64(1), int64(1), object(1)
memory usage: 152.0+ bytes
pandas 1.0.0
In [34]: df = pd.DataFrame({"int_col": [1, 2, 3],
....: "text_col": ["a", "b", "c"],
....: "float_col": [0.0, 0.1, 0.2]})
....:
In [35]: df.info(verbose=True)
RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 int_col 3 non-null int64
1 text_col 3 non-null object
2 float_col 3 non-null float64
dtypes: float64(1), int64(1), object(1)
memory usage: 200.0+ bytes
pandas.array() изменения в определении#
pandas.array() теперь определяет новые типы расширений pandas в нескольких случаях (GH 29791):
Строковые данные (включая пропущенные значения) теперь возвращают
arrays.StringArray.Целочисленные данные (включая пропущенные значения) теперь возвращают
arrays.IntegerArray.Логические данные (включая пропущенные значения) теперь возвращают новый
arrays.BooleanArray
pandas 0.25.x
In [1]: pd.array(["a", None])
Out[1]:
['a', None]
Length: 2, dtype: object
In [2]: pd.array([1, None])
Out[2]:
[1, None]
Length: 2, dtype: object
pandas 1.0.0
In [36]: pd.array(["a", None])
Out[36]:
['a', ]
Length: 2, dtype: string
In [37]: pd.array([1, None])
Out[37]:
[1, ]
Length: 2, dtype: Int64
Напоминаем, что вы можете указать dtype чтобы отключить все выводы типов.
arrays.IntegerArray теперь использует pandas.NA#
arrays.IntegerArray теперь использует pandas.NA вместо
numpy.nan в качестве маркера пропущенного значения (GH 29964).
pandas 0.25.x
In [1]: a = pd.array([1, 2, None], dtype="Int64")
In [2]: a
Out[2]:
[1, 2, NaN]
Length: 3, dtype: Int64
In [3]: a[2]
Out[3]:
nan
pandas 1.0.0
In [38]: a = pd.array([1, 2, None], dtype="Int64")
In [39]: a
Out[39]:
[1, 2, ]
Length: 3, dtype: Int64
In [40]: a[2]
Out[40]:
Это имеет несколько последствий, нарушающих API.
Преобразование в NumPy ndarray
При преобразовании в массив NumPy пропущенные значения будут pd.NA, который не может быть преобразован в число с плавающей точкой. Поэтому вызов np.asarray(integer_array, dtype="float")
теперь будет вызывать исключение.
pandas 0.25.x
In [1]: np.asarray(a, dtype="float")
Out[1]:
array([ 1., 2., nan])
pandas 1.0.0
In [41]: np.asarray(a, dtype="float")
Out[41]: array([ 1., 2., nan])
Используйте arrays.IntegerArray.to_numpy() с явным na_value вместо этого.
In [42]: a.to_numpy(dtype="float", na_value=np.nan)
Out[42]: array([ 1., 2., nan])
Редукции могут возвращать pd.NA
При выполнении операции редукции, такой как суммирование, с skipna=False, результат
теперь будет pd.NA вместо np.nan при наличии пропущенных значений
(GH 30958).
pandas 0.25.x
In [1]: pd.Series(a).sum(skipna=False)
Out[1]:
nan
pandas 1.0.0
In [43]: pd.Series(a).sum(skipna=False)
Out[43]:
value_counts возвращает nullable integer dtype
Series.value_counts() с обнуляемым целочисленным типом данных теперь возвращает обнуляемый
целочисленный тип данных для значений.
pandas 0.25.x
In [1]: pd.Series([2, 1, 1, None], dtype="Int64").value_counts().dtype
Out[1]:
dtype('int64')
pandas 1.0.0
In [44]: pd.Series([2, 1, 1, None], dtype="Int64").value_counts().dtype
Out[44]: Int64Dtype()
См. семантика NA подробнее о различиях между pandas.NA
и numpy.nan.
arrays.IntegerArray возврат сравнений arrays.BooleanArray#
Операции сравнения на arrays.IntegerArray теперь возвращает
arrays.BooleanArray вместо массива NumPy (GH 29964).
pandas 0.25.x
In [1]: a = pd.array([1, 2, None], dtype="Int64")
In [2]: a
Out[2]:
[1, 2, NaN]
Length: 3, dtype: Int64
In [3]: a > 1
Out[3]:
array([False, True, False])
pandas 1.0.0
In [45]: a = pd.array([1, 2, None], dtype="Int64")
In [46]: a > 1
Out[46]:
[False, True, ]
Length: 3, dtype: boolean
Обратите внимание, что пропущенные значения теперь распространяются, а не всегда считаются неравными, как numpy.nan. См. семантика NA подробнее.
По умолчанию Categorical.min() теперь возвращает минимум вместо np.nan#
Когда Categorical содержит np.nan,
Categorical.min() больше не возвращают np.nan по умолчанию (skipna=True) (GH 25303)
pandas 0.25.x
In [1]: pd.Categorical([1, 2, np.nan], ordered=True).min()
Out[1]: nan
pandas 1.0.0
In [47]: pd.Categorical([1, 2, np.nan], ordered=True).min()
Out[47]: 1
Тип данных по умолчанию для пустых pandas.Series#
Инициализация пустого pandas.Series без указания типа данных вызовет DeprecationWarning сейчас
(GH 17261). Тип данных по умолчанию изменится с float64 to object в будущих выпусках, чтобы это было
согласовано с поведением DataFrame и Index.
pandas 1.0.0
In [1]: pd.Series()
Out[2]:
DeprecationWarning: The default dtype for empty Series will be 'object' instead of 'float64' in a future version. Specify a dtype explicitly to silence this warning.
Series([], dtype: float64)
Изменения в выводе типа данных для операций resample#
Правила для типа данных результата в DataFrame.resample() агрегации изменились для типов расширений (GH 31359).
Ранее pandas пытался преобразовать результат обратно к исходному типу данных, возвращаясь к обычным
правилам вывода, если это было невозможно. Теперь pandas будет возвращать результат исходного типа данных только если
скалярные значения в результате являются экземплярами скалярного типа расширенного типа данных.
In [48]: df = pd.DataFrame({"A": ['a', 'b']}, dtype='category',
....: index=pd.date_range('2000', periods=2))
....:
In [49]: df
Out[49]:
A
2000-01-01 a
2000-01-02 b
[2 rows x 1 columns]
pandas 0.25.x
In [1]> df.resample("2D").agg(lambda x: 'a').A.dtype
Out[1]:
CategoricalDtype(categories=['a', 'b'], ordered=False)
pandas 1.0.0
In [50]: df.resample("2D").agg(lambda x: 'a').A.dtype
Out[50]: CategoricalDtype(categories=['a', 'b'], ordered=False, categories_dtype=object)
Это исправляет несоответствие между resample и groupby.
Это также исправляет потенциальную ошибку, где values результата может измениться
в зависимости от того, как результаты преобразуются обратно в исходный dtype.
pandas 0.25.x
In [1] df.resample("2D").agg(lambda x: 'c')
Out[1]:
A
0 NaN
pandas 1.0.0
In [51]: df.resample("2D").agg(lambda x: 'c')
Out[51]:
A
2000-01-01 c
[1 rows x 1 columns]
Повышена минимальная версия Python#
pandas 1.0.0 поддерживает Python 3.6.1 и выше (GH 29212).
Повышенные минимальные версии для зависимостей#
Некоторые минимальные поддерживаемые версии зависимостей были обновлены (GH 29766, GH 29723). Если установлено, теперь требуется:
Пакет |
Минимальная версия |
Обязательно |
Изменено |
|---|---|---|---|
numpy |
1.13.3 |
X |
|
pytz |
2015.4 |
X |
|
python-dateutil |
2.6.1 |
X |
|
bottleneck |
1.2.1 |
||
numexpr |
2.6.2 |
||
pytest (разработка) |
4.0.2 |
Для дополнительные библиотеки общая рекомендация — использовать последнюю версию. Следующая таблица перечисляет минимальную версию для каждой библиотеки, которая в настоящее время тестируется в ходе разработки pandas. Опциональные библиотеки ниже минимальной тестируемой версии могут всё ещё работать, но не считаются поддерживаемыми.
Пакет |
Минимальная версия |
Изменено |
|---|---|---|
beautifulsoup4 |
4.6.0 |
|
fastparquet |
0.3.2 |
X |
gcsfs |
0.2.2 |
|
lxml |
3.8.0 |
|
matplotlib |
2.2.2 |
|
numba |
0.46.0 |
X |
openpyxl |
2.5.7 |
X |
pyarrow |
0.13.0 |
X |
pymysql |
0.7.1 |
|
pytables |
3.4.2 |
|
s3fs |
0.3.0 |
X |
scipy |
0.19.0 |
|
sqlalchemy |
1.1.4 |
|
xarray |
0.8.2 |
|
xlrd |
1.1.0 |
|
xlsxwriter |
0.9.8 |
|
xlwt |
1.2.0 |
См. Зависимости и Необязательные зависимости подробнее.
Изменения сборки#
pandas добавил pyproject.toml файл и больше не будет включать
скомпилированные Cython файлы в исходное распределение, загружаемое на PyPI (GH 28341, GH 20775). Если вы устанавливаете
собранный дистрибутив (wheel) или через conda, это не должно на вас влиять. Если вы собираете pandas из
исходного кода, вам больше не нужно устанавливать Cython в вашу среду сборки перед вызовом pip install pandas.
Другие изменения API#
DataFrameGroupBy.transform()иSeriesGroupBy.transform()теперь вызывает ошибку при недопустимых названиях операций (GH 27489)pandas.api.types.infer_dtype()теперь возвращает "integer-na" для целочисленных иnp.nanсмешивать (GH 27283)MultiIndex.from_arrays()больше не будет выводить имена из массивов, еслиnames=Noneявно указан (GH 27292)Для улучшения автодополнения pandas не включает большинство устаревших атрибутов при интроспекции объекта pandas с помощью
dir(например,dir(df)). Чтобы увидеть, какие атрибуты исключены, см. объект_deprecationsатрибут, напримерpd.DataFrame._deprecations(GH 28805).Возвращаемый тип данных
unique()теперь соответствует входному dtype. (GH 27874)Изменено значение конфигурации по умолчанию для
options.matplotlib.register_convertersизTrueto"auto"(GH 18720). Теперь пользовательские форматтеры pandas будут применяться только к графикам, созданным pandas, черезplot()Ранее форматирование pandas применялось ко всем создаваемым графикам после aplot(). См. регистрация единиц подробнее.Series.dropna()удалил свой**kwargsаргумент в пользу единогоhowпараметр. Предоставление чего-либо, кромеhowto**kwargsвызывалTypeErrorранее (GH 29388)При тестировании pandas новая минимальная требуемая версия pytest — 5.0.1 (GH 29664)
Series.str.__iter__()был устаревшим и будет удален в будущих релизах (GH 28277).Добавлен
в список значений NA по умолчанию дляread_csv()(GH 30821)
Улучшения документации#
Добавлен новый раздел о Масштабирование до больших наборов данных (GH 28315).
Добавлен подраздел о Запрос MultiIndex для наборов данных HDF5 (GH 28791).
Устаревшие функции#
Series.item()иIndex.item()были _сняты с устаревания_ (GH 29250)Index.set_valueбыл объявлен устаревшим. Для заданного индексаidx, массивarr, значение вidxofidx_valи новое значениеval,idx.set_value(arr, idx_val, val)эквивалентноarr[idx.get_loc(idx_val)] = val, который следует использовать вместо (GH 28621).is_extension_type()устарел,is_extension_array_dtype()следует использовать вместо (GH 29457)eval()аргумент ключевого слова “truediv” устарел и будет удалён в будущей версии (GH 29812)DateOffset.isAnchored()иDatetOffset.onOffset()устарели и будут удалены в будущей версии, используйтеDateOffset.is_anchored()иDateOffset.is_on_offset()вместо (GH 30340)pandas.tseries.frequencies.get_offsetустарел и будет удален в будущей версии, используйтеpandas.tseries.frequencies.to_offsetвместо (GH 4205)Categorical.take_nd()иCategoricalIndex.take_nd()устарели, используйтеCategorical.take()иCategoricalIndex.take()вместо (GH 27745)Параметр
numeric_onlyofCategorical.min()иCategorical.max()устарел и заменен наskipna(GH 25303)Параметр
labelвlreshape()устарел и будет удален в будущей версии (GH 29742)pandas.core.indexбыл объявлен устаревшим и будет удален в будущей версии, публичные классы доступны в пространстве имен верхнего уровня (GH 19711)pandas.json_normalize()теперь доступен в пространстве имен верхнего уровня. Использованиеjson_normalizeкакpandas.io.json.json_normalizeтеперь устарел и рекомендуется использоватьjson_normalizeкакpandas.json_normalize()вместо (GH 27586).The
numpyаргументpandas.read_json()устарел (GH 28512).DataFrame.to_stata(),DataFrame.to_feather(), иDataFrame.to_parquet()аргумент "fname" устарел, используйте "path" вместо (GH 23574)Устаревшие внутренние атрибуты
_start,_stopи_stepofRangeIndexтеперь вызываетFutureWarningвместоDeprecationWarning(GH 26581)The
pandas.util.testingмодуль устарел. Используйте публичный API вpandas.testingдокументировано в Функции утверждения (GH 16232).pandas.SparseArrayбыл устаревшим. Используйтеpandas.arrays.SparseArray(arrays.SparseArray) вместо этого. (GH 30642)Параметр
is_copyofSeries.take()иDataFrame.take()был объявлен устаревшим и будет удален в будущей версии. (GH 27357)Поддержка многомерного индексирования (например,
index[:, None]) наIndexустарел и будет удален в будущей версии, преобразуйте в массив numpy перед индексированием (GH 30588)The
pandas.npподмодуль теперь устарел. Импортируйте numpy напрямую вместо этого (GH 30296)The
pandas.datetimeкласс теперь устарел. Импортируйте изdatetimeвместо (GH 30610)diffвызоветTypeErrorвместо неявной потери типа расширений в будущем. Преобразуйте в правильный тип перед вызовомdiffвместо (GH 31025)
Выбор столбцов из сгруппированного DataFrame
При выборе столбцов из DataFrameGroupBy объект, передача отдельных ключей (или кортежа ключей) внутри одинарных скобок устарела, вместо этого следует использовать список элементов. (GH 23566) Например:
df = pd.DataFrame({
"A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"],
"B": np.random.randn(8),
"C": np.random.randn(8),
})
g = df.groupby('A')
# single key, returns SeriesGroupBy
g['B']
# tuple of single key, returns SeriesGroupBy
g[('B',)]
# tuple of multiple keys, returns DataFrameGroupBy, raises FutureWarning
g[('B', 'C')]
# multiple keys passed directly, returns DataFrameGroupBy, raises FutureWarning
# (implicitly converts the passed strings into a single tuple)
g['B', 'C']
# proper way, returns DataFrameGroupBy
g[['B', 'C']]
Удаление устаревших функций/изменений предыдущих версий#
Удалены SparseSeries и SparseDataFrame
SparseSeries, SparseDataFrame и DataFrame.to_sparse метод
были удалены (GH 28425). Мы рекомендуем использовать Series или
DataFrame со значениями sparse вместо.
Регистрация единиц Matplotlib
Ранее pandas регистрировал конвертеры в matplotlib как побочный эффект импорта pandas (GH 18720).
Это изменило вывод графиков, созданных через matplotlib после импорта pandas, даже если вы использовали
matplotlib напрямую, а не plot().
Чтобы использовать форматтеры pandas с графиком matplotlib, укажите
In [1]: import pandas as pd
In [2]: pd.options.plotting.matplotlib.register_converters = True
Обратите внимание, что графики, созданные DataFrame.plot() и Series.plot() делать автоматически регистрировать конвертеры.
Единственное изменение в поведении — при построении графика объекта, похожего на дату, через matplotlib.pyplot.plot
или matplotlib.Axes.plot. См. Пользовательские форматтеры для графиков временных рядов подробнее.
Другие удаления
Удален ранее устаревший ключевой параметр "index" из
read_stata(),StataReader, иStataReader.read(), используйте “index_col” вместо (GH 17328)Удалено
StataReader.dataметод, используйтеStataReader.read()вместо (GH 9493)Удалено
pandas.plotting._matplotlib.tsplot, используйтеSeries.plot()вместо (GH 19980)pandas.tseries.converter.registerбыл перемещен вpandas.plotting.register_matplotlib_converters()(GH 18307)Series.plot()больше не принимает позиционные аргументы, передавайте именованные аргументы вместо этого (GH 30003)DataFrame.hist()иSeries.hist()больше не разрешаетfigsize="default", укажите размер фигуры, передав кортеж вместо (GH 30003)Целочисленное деление массива с целочисленным типом данных на
Timedeltaтеперь вызываетTypeError(GH 21036)TimedeltaIndexиDatetimeIndexбольше не принимает строки типа данных, отличные от наносекунд, такие как "timedelta64" или "datetime64", используйте вместо этого "timedelta64[ns]" и "datetime64[ns]" (GH 24806)Изменён аргумент по умолчанию “skipna” в
pandas.api.types.infer_dtype()изFalsetoTrue(GH 24050)Удалено
Series.ixиDataFrame.ix(GH 26438)Удалено
Index.summary(GH 18217)Удалён ранее устаревший ключевой параметр "fastpath" из
Indexконструктор (GH 23110)Удалено
Series.get_value,Series.set_value,DataFrame.get_value,DataFrame.set_value(GH 17739)Удалено
Series.compoundиDataFrame.compound(GH 26405)Изменил аргумент по умолчанию "inplace" в
DataFrame.set_index()иSeries.set_axis()изNonetoFalse(GH 27600)Удалено
Series.cat.categorical,Series.cat.index,Series.cat.name(GH 24751)Удален ранее устаревший ключевой параметр “box” из
to_datetime()иto_timedelta(); кроме того, они теперь всегда возвращаютDatetimeIndex,TimedeltaIndex,Index,Series, илиDataFrame(GH 24486)to_timedelta(),Timedelta, иTimedeltaIndexбольше не разрешает "M", "y" или "Y" для аргумента "unit" (GH 23264)Удален ранее устаревший ключевой параметр “time_rule” из (непубличных)
offsets.generate_range, который был перемещён вcore.arrays._ranges.generate_range()(GH 24157)DataFrame.loc()илиSeries.loc()с listlike индексаторами и отсутствующими метками больше не будет переиндексации (GH 17295)DataFrame.to_excel()иSeries.to_excel()с несуществующими столбцами больше не будет переиндексировать (GH 17295)Удален ранее устаревший ключевой параметр "join_axes" из
concat(); используйтеreindex_likeвместо этого на результате (GH 22318)Удалено ранее устаревшее ключевое слово "by" из
DataFrame.sort_index(), используйтеDataFrame.sort_values()вместо (GH 10726)Удалена поддержка вложенного переименования в
DataFrame.aggregate(),Series.aggregate(),core.groupby.DataFrameGroupBy.aggregate(),core.groupby.SeriesGroupBy.aggregate(),core.window.rolling.Rolling.aggregate()(GH 18529)Передача
datetime64данные вTimedeltaIndexилиtimedelta64данные вDatetimeIndexтеперь вызываетTypeError(GH 23539, GH 23937)Передача
int64значения вDatetimeIndexи часовой пояс теперь интерпретирует значения как наносекундные метки времени в UTC, а не как локальное время в заданном часовом поясе (GH 24559)Кортеж, переданный в
DataFrame.groupby()теперь исключительно рассматривается как единый ключ (GH 18314)Удалено
Index.contains, используйтеkey in indexвместо (GH 30103)Сложение и вычитание
intили целочисленных массивов больше не разрешено вTimestamp,DatetimeIndex,TimedeltaIndex, используйтеobj + n * obj.freqвместоobj + n(GH 22535)Удалено
Series.ptp(GH 21614)Удалено
Series.from_array(GH 18258)Удалено
DataFrame.from_items(GH 18458)Удалено
DataFrame.as_matrix,Series.as_matrix(GH 18458)Удалено
Series.asobject(GH 18477)Удалено
DataFrame.as_blocks,Series.as_blocks,DataFrame.blocks,Series.blocks(GH 17656)pandas.Series.str.cat()теперь по умолчанию выравниваетothers, используяjoin='left'(GH 27611)pandas.Series.str.cat()не принимает списки внутри списко-подобных объектов больше (GH 27611)Series.where()сCategoricaldtype (илиDataFrame.where()сCategoricalстолбец) больше не позволяет устанавливать новые категории (GH 24114)Удалены ранее устаревшие ключевые слова "start", "end" и "periods" из
DatetimeIndex,TimedeltaIndex, иPeriodIndexконструкторы; используйтеdate_range(),timedelta_range(), иperiod_range()вместо (GH 23919)Удален ранее устаревший ключевой параметр “verify_integrity” из
DatetimeIndexиTimedeltaIndexконструкторы (GH 23919)Удален ранее устаревший ключевой параметр «fastpath» из
pandas.core.internals.blocks.make_block(GH 19265)Удален ранее устаревший ключевой параметр "dtype" из
Block.make_block_same_class()(GH 19434)Удалено
ExtensionArray._formatting_values. ИспользуйтеExtensionArray._formatterвместо этого. (GH 23601)Удалено
MultiIndex.to_hierarchical(GH 21613)Удалено
MultiIndex.labels, используйтеMultiIndex.codesвместо (GH 23752)Удален ранее устаревший ключевое слово "labels" из
MultiIndexконструктор, используйте "codes" вместо (GH 23752)Удалено
MultiIndex.set_labels, используйтеMultiIndex.set_codes()вместо (GH 23752)Удален ранее устаревший ключевой параметр "labels" из
MultiIndex.set_codes(),MultiIndex.copy(),MultiIndex.drop(), используйте “codes” вместо (GH 23752)Удалена поддержка устаревших форматов HDF5 (GH 29787)
Передача псевдонима типа данных (например, 'datetime64[ns, UTC]') в
DatetimeTZDtypeбольше не разрешено, используйтеDatetimeTZDtype.construct_from_string()вместо (GH 23990)Удалён ранее устаревший ключевой параметр "skip_footer" из
read_excel(); используйте "skipfooter" вместо (GH 18836)read_excel()больше не допускает целочисленное значение для параметраusecols, вместо этого передайте список целых чисел от 0 доusecolsвключительно (GH 23635)Удалён ранее устаревший ключевой параметр "convert_datetime64" из
DataFrame.to_records()(GH 18902)Удалено
IntervalIndex.from_intervalsв пользуIntervalIndexконструктор (GH 19263)Изменен аргумент по умолчанию “keep_tz” в
DatetimeIndex.to_series()изNonetoTrue(GH 23739)Удалено
api.types.is_periodиapi.types.is_datetimetz(GH 23917)Возможность чтения пиклов, содержащих
Categoricalэкземпляры, созданные с версией pandas до 0.16, были удалены (GH 27538)Удалено
pandas.tseries.plotting.tsplot(GH 18627)Удалены ранее устаревшие ключевые слова 'reduce' и 'broadcast' из
DataFrame.apply()(GH 18577)Удалена ранее устаревшая
assert_raises_regexфункция вpandas._testing(GH 29174)Удалена ранее устаревшая
FrozenNDArrayкласс вpandas.core.indexes.frozen(GH 29335)Удалён ранее устаревший ключевой параметр “nthreads” из
read_feather(), используйте "use_threads" вместо (GH 23053)Удалено
Index.is_lexsorted_for_tuple(GH 29305)Удалена поддержка вложенного переименования в
DataFrame.aggregate(),Series.aggregate(),core.groupby.DataFrameGroupBy.aggregate(),core.groupby.SeriesGroupBy.aggregate(),core.window.rolling.Rolling.aggregate()(GH 29608)Удалено
Series.valid; используйтеSeries.dropna()вместо (GH 18800)Удалено
DataFrame.is_copy,Series.is_copy(GH 18812)Удалено
DataFrame.get_ftype_counts,Series.get_ftype_counts(GH 18243)Удалено
DataFrame.ftypes,Series.ftypes,Series.ftype(GH 26744)Удалено
Index.get_duplicates, используйтеidx[idx.duplicated()].unique()вместо (GH 20239)Удалено
Series.clip_upper,Series.clip_lower,DataFrame.clip_upper,DataFrame.clip_lower(GH 24203)Удалена возможность изменять
DatetimeIndex.freq,TimedeltaIndex.freq, илиPeriodIndex.freq(GH 20772)Удалено
DatetimeIndex.offset(GH 20730)Удалено
DatetimeIndex.asobject,TimedeltaIndex.asobject,PeriodIndex.asobject, используйтеastype(object)вместо (GH 29801)Удален ранее устаревший ключевой параметр "order" из
factorize()(GH 19751)Удален ранее устаревший ключевое слово “encoding” из
read_stata()иDataFrame.to_stata()(GH 21400)Изменен аргумент по умолчанию "sort" в
concat()изNonetoFalse(GH 20613)Удалён ранее устаревший ключевой параметр 'raise_conflict' из
DataFrame.update()используйте "errors" вместо (GH 23585)Удалён ранее устаревший ключевой параметр “n” из
DatetimeIndex.shift(),TimedeltaIndex.shift(),PeriodIndex.shift(), используйте "periods" вместо (GH 22458)Удалены ранее устаревшие ключевые слова “how”, “fill_method” и “limit” из
DataFrame.resample()(GH 30139)Передача целого числа в
Series.fillna()илиDataFrame.fillna()сtimedelta64[ns]тип данных теперь вызываетTypeError(GH 24694)Передача нескольких осей в
DataFrame.dropna()больше не поддерживается (GH 20995)Удалено
Series.nonzero, используйтеto_numpy().nonzero()вместо (GH 24048)Передача типа данных с плавающей точкой
codestoCategorical.from_codes()больше не поддерживается, передайтеcodes.astype(np.int64)вместо (GH 21775)Удалён ранее устаревший ключевой параметр "pat" из
Series.str.partition()иSeries.str.rpartition(), используйте "sep" вместо (GH 23767)Удалено
Series.put(GH 27106)Удалено
Series.real,Series.imag(GH 27106)Удалено
Series.to_dense,DataFrame.to_dense(GH 26684)Удалено
Index.dtype_str, используйтеstr(index.dtype)вместо (GH 27106)Categorical.ravel()возвращаетCategoricalвместоndarray(GH 27199)Метод 'outer' для Numpy ufuncs, например,
np.subtract.outerработа сSeriesобъектов больше не поддерживается и вызоветNotImplementedError(GH 27198)Удалено
Series.get_dtype_countsиDataFrame.get_dtype_counts(GH 27145)Изменён аргумент по умолчанию “fill_value” в
Categorical.take()изTruetoFalse(GH 20841)Изменено значение по умолчанию для
rawаргумент вSeries.rolling().apply(),DataFrame.rolling().apply(),Series.expanding().apply(), иDataFrame.expanding().apply()изNonetoFalse(GH 20584)Удалено устаревшее поведение
Series.argmin()иSeries.argmax(), используйтеSeries.idxmin()иSeries.idxmax()для старого поведения (GH 16955)Передача объекта с информацией о часовом поясе
datetime.datetimeилиTimestampвTimestampконструктор сtzаргумент теперь вызываетValueError(GH 23621)Удалено
Series.base,Index.base,Categorical.base,Series.flags,Index.flags,PeriodArray.flags,Series.strides,Index.strides,Series.itemsize,Index.itemsize,Series.data,Index.data(GH 20721)Изменено
Timedelta.resolution()чтобы соответствовать поведению стандартной библиотекиdatetime.timedelta.resolution, для старого поведения используйтеTimedelta.resolution_string()(GH 26839)Удалено
Timestamp.weekday_name,DatetimeIndex.weekday_name, иSeries.dt.weekday_name(GH 18164)Удален ранее устаревший ключевой параметр "errors" в
Timestamp.tz_localize(),DatetimeIndex.tz_localize(), иSeries.tz_localize()(GH 22644)Изменён аргумент по умолчанию "ordered" в
CategoricalDtypeизNonetoFalse(GH 26336)Series.set_axis()иDataFrame.set_axis()теперь требуют "labels" в качестве первого аргумента и "axis" в качестве необязательного именованного параметра (GH 30089)Удалено
to_msgpack,read_msgpack,DataFrame.to_msgpack,Series.to_msgpack(GH 27103)Удалено
Series.compress(GH 21930)Удален ранее устаревший ключевой параметр "fill_value" из
Categorical.fillna(), используйте "value" вместо (GH 19269)Удален ранее устаревший ключевой параметр "data" из
andrews_curves(), используйте "frame" вместо (GH 6956)Удален ранее устаревший ключевой параметр "data" из
parallel_coordinates(), используйте "frame" вместо (GH 6956)Удален ранее устаревший ключевой параметр "colors" из
parallel_coordinates(), используйте "color" вместо (GH 6956)Удалены ранее устаревшие ключевые слова "verbose" и "private_key" из
read_gbq()(GH 30200)Вызов
np.arrayиnp.asarrayна tz-awareSeriesиDatetimeIndexтеперь будет возвращать массив объектов с учетом часового поясаTimestamp(GH 24596)
Улучшения производительности#
Улучшение производительности в
DataFrameарифметические и сравнительные операции со скалярами (GH 24990, GH 29853)Улучшение производительности при индексировании с неуникальным
IntervalIndex(GH 27489)Улучшение производительности в
MultiIndex.is_monotonic(GH 27495)Улучшение производительности в
cut()когдаbinsявляетсяIntervalIndex(GH 27668)Улучшение производительности при инициализации
DataFrameиспользуяrange(GH 30171)Улучшение производительности в
DataFrame.corr()когдаmethodявляется"spearman"(GH 28139)Улучшение производительности в
DataFrame.replace()когда предоставлен список значений для замены (GH 28099)Улучшение производительности в
DataFrame.select_dtypes()используя векторизацию вместо итерации по циклу (GH 28317)Улучшение производительности в
Categorical.searchsorted()иCategoricalIndex.searchsorted()(GH 28795)Улучшение производительности при сравнении
Categoricalсо скаляром, и скаляр не найден в категориях (GH 29750)Улучшение производительности при проверке наличия значений в
Categoricalравны, равны или больше, или больше заданного скаляра. Улучшение отсутствует, если проверяется, является лиCategoricalменьше или меньше или равно скаляру (GH 29820)Улучшение производительности в
Index.equals()иMultiIndex.equals()(GH 29134)Улучшение производительности в
infer_dtype()когдаskipnaявляетсяTrue(GH 28814)
Исправления ошибок#
Категориальный#
Добавлен тест для проверки
fillna()вызывает правильноеValueErrorсообщение, когда значение не является значением из категорий (GH 13628)Ошибка в
Categorical.astype()гдеNaNзначения обрабатывались некорректно при приведении к int (GH 28406)DataFrame.reindex()сCategoricalIndexзавершалась ошибкой, когда цели содержали дубликаты, и не завершалась ошибкой, если источник содержал дубликаты (GH 28107)Ошибка в
Categorical.astype()не допуская преобразования в расширенные dtypes (GH 28668)Ошибка, где
merge()не мог выполнить соединение по категориальным столбцам и столбцам с расширенным типом данных (GH 28668)Categorical.searchsorted()иCategoricalIndex.searchsorted()теперь также работают на неупорядоченных категориальных переменных (GH 21667)Добавлен тест для проверки циклического преобразования в parquet с
DataFrame.to_parquet()илиread_parquet()сохранит категориальные типы данных для строковых типов (GH 27955)Изменено сообщение об ошибке в
Categorical.remove_categories()всегда показывать недопустимые удаления как множество (GH 28669)Использование аксессоров даты на категориальном типе данных
Seriesдат не возвращал объект того же типа, как если бы использовалсяstr.()/dt.()наSeriesэтого типа. Например, при доступе кSeries.dt.tz_localize()наCategoricalс дублирующимися записями, аксессор пропускал дубликаты (GH 27952)Ошибка в
DataFrame.replace()иSeries.replace()который давал бы некорректные результаты на категориальных данных (GH 26988)Ошибка, при которой вызов
Categorical.min()илиCategorical.max()на пустой Categorical вызывало бы исключение numpy (GH 30227)Следующие методы теперь также корректно выводят значения для ненаблюдаемых категорий при вызове через
groupby(..., observed=False)(GH 17605) *core.groupby.SeriesGroupBy.count()*core.groupby.SeriesGroupBy.size()*core.groupby.SeriesGroupBy.nunique()*core.groupby.SeriesGroupBy.nth()
Datetimelike#
Ошибка в
Series.__setitem__()некорректное приведение типовnp.timedelta64("NaT")tonp.datetime64("NaT")при вставке вSeriesс типом datetime64 (GH 27311)Ошибка в
Series.dt()поиск свойств, когда базовые данные доступны только для чтения (GH 27529)Ошибка в
HDFStore.__getitem__неправильное чтение атрибута tz, созданного в Python 2 (GH 26443)Ошибка в
to_datetime()где передача массивов с некорректным форматомstrс errors=”coerce” могло некорректно приводить к вызовуValueError(GH 28299)Ошибка в
core.groupby.SeriesGroupBy.nunique()гдеNaTзначения мешали подсчёту уникальных значений (GH 27951)Ошибка в
Timestampвычитание при вычитанииTimestampизnp.datetime64объект некорректно вызываетTypeError(GH 28286)Сложение и вычитание целочисленных массивов или массивов с целочисленным типом данных с
Timestampтеперь будет вызыватьNullFrequencyErrorвместоValueError(GH 28268)Ошибка в
SeriesиDataFrameс целочисленным dtype, не вызывающийTypeErrorпри добавлении или вычитанииnp.datetime64объект (GH 28080)Ошибка в
Series.astype(),Index.astype(), иDataFrame.astype()не удалось обработатьNaTпри приведении к целочисленному типу данных (GH 28492)Ошибка в
Weekсweekdayнекорректное возбуждениеAttributeErrorвместоTypeErrorпри добавлении или вычитании недопустимого типа (GH 28530)Ошибка в
DataFrameарифметические операции при работе сSeriesс типом данных'timedelta64[ns]'(GH 28049)Ошибка в
core.groupby.generic.SeriesGroupBy.apply()вызовValueErrorкогда столбец в исходном DataFrame является датой и времени, а метки столбцов не являются стандартными целыми числами (GH 28247)Ошибка в
pandas._config.localization.get_locales()гдеlocales -aкодирует список локалей как windows-1252 (GH 23638, GH 24760, GH 27368)Ошибка в
Series.var()не удалось вызватьTypeErrorпри вызове сtimedelta64[ns]тип данных (GH 28289)Ошибка в
DatetimeIndex.strftime()иSeries.dt.strftime()гдеNaTбыл преобразован в строку'NaT'вместоnp.nan(GH 29578)Ошибка при маскировании массивов типа datetime булевой маской неправильной длины, не вызывающая
IndexError(GH 30308)Ошибка в
Timestamp.resolutionбудучи свойством вместо атрибута класса (GH 29910)Ошибка в
pandas.to_datetime()при вызове сNoneвызовTypeErrorвместо возвратаNaT(GH 30011)Ошибка в
pandas.to_datetime()завершается с ошибкой дляdequeобъекты при использованииcache=True(по умолчанию) (GH 29403)Ошибка в
Series.item()сdatetime64илиtimedelta64dtype,DatetimeIndex.item(), иTimedeltaIndex.item()возвращая целое число вместоTimestampилиTimedelta(GH 30175)Ошибка в
DatetimeIndexдополнение при добавлении неоптимизированногоDateOffsetнеправильное удаление информации о часовом поясе (GH 30336)Ошибка в
DataFrame.drop()где попытка удалить несуществующие значения из DatetimeIndex приводила к запутанному сообщению об ошибке (GH 30399)Ошибка в
DataFrame.append()удалит информацию о часовом поясе у новых данных (GH 30238)Ошибка в
Series.cummin()иSeries.cummax()с timezone-aware dtype неправильно удаляющим свою временную зону (GH 15553)Ошибка в
DatetimeArray,TimedeltaArray, иPeriodArrayгде операции сложения и вычитания на месте фактически не выполнялись на месте (GH 24115)Ошибка в
pandas.to_datetime()при вызове сSeriesхранениеIntegerArrayвызовTypeErrorвместо возвратаSeries(GH 30050)Ошибка в
date_range()с пользовательскими рабочими часами какfreqи заданное количествоperiods(GH 30593)Ошибка в
PeriodIndexсравнения с некорректным приведением целых чисел кPeriodобъекты, что не согласуется сPeriodповедение сравнения (GH 30722)Ошибка в
DatetimeIndex.insert()вызовValueErrorвместоTypeErrorпри попытке вставить данные с учётом часового поясаTimestampв не учитывающий часовой поясDatetimeIndex, или наоборот (GH 30806)
Timedelta#
Ошибка при вычитании
TimedeltaIndexилиTimedeltaArrayизnp.datetime64объект (GH 29558)
Часовые пояса#
Числовой#
Ошибка в
DataFrame.quantile()с нулевым столбцомDataFrameнеправильное возникновение (GH 23925)DataFrameметоды гибкого сравнения неравенств (DataFrame.lt(),DataFrame.le(),DataFrame.gt(),DataFrame.ge()) с типом object иcomplexзаписи, не вызывающие ошибкуTypeErrorкак ихSeriesаналоги (GH 28079)Ошибка в
DataFrameлогические операции (&,|,^) не совпадаетSeriesповедение путем заполнения NA значений (GH 28741)Ошибка в
DataFrame.interpolate()где указание оси по имени ссылается на переменную до ее присваивания (GH 29142)Ошибка в
Series.var()не вычисляет правильное значение с nullable integer dtype series, не передавая аргумент ddof (GH 29128)Улучшено сообщение об ошибке при использовании
frac> 1 иreplace= False (GH 27451)Ошибка в числовых индексах приводила к возможности создания
Int64Index,UInt64Index, илиFloat64Indexс недопустимым типом данных (например, datetime-like) (GH 29539)Ошибка в
UInt64Indexпотеря точности при построении из списка со значениями вnp.uint64диапазон (GH 29526)Ошибка в
NumericIndexконструкции, которая вызывала сбой индексирования при наличии целых чисел вnp.uint64диапазон использовался (GH 28023)Ошибка в
NumericIndexконструкция, которая вызывалаUInt64Indexдля приведения кFloat64Indexкогда целые числа вnp.uint64диапазон использовался для индексацииDataFrame(GH 28279)Ошибка в
Series.interpolate()при использовании method=`index` с несортированным индексом, ранее возвращались некорректные результаты. (GH 21037)Ошибка в
DataFrame.round()гдеDataFrameсCategoricalIndexofIntervalIndexстолбцы некорректно вызывалиTypeError(GH 30063)Ошибка в
Series.pct_change()иDataFrame.pct_change()когда есть дублирующиеся индексы (GH 30463)Ошибка в
DataFrameкумулятивные операции (например, cumsum, cummax) некорректное приведение к object-dtype (GH 19296)Ошибка в
diffпотеря типа данных для типов расширений (GH 30889)Ошибка в
DataFrame.diffвызовIndexErrorкогда один из столбцов имел целочисленный тип данных с поддержкой NULL (GH 30967)
Преобразование#
Строки#
Вызов
Series.str.isalnum()(и других "ismethods") на пустомSeriesвернетobjectdtype вместоbool(GH 29624)
Interval#
Ошибка в
IntervalIndex.get_indexer()гдеCategoricalилиCategoricalIndextargetнеправильно вызывал быTypeError(GH 30063)Ошибка в
pandas.core.dtypes.cast.infer_dtype_from_scalarгде передачаpandas_dtype=Trueне выводилIntervalDtype(GH 30337)Ошибка в
Seriesконструктор, где создаетсяSeriesизlistofIntervalобъектов приводило кobjectdtype вместоIntervalDtype(GH 23563)Ошибка в
IntervalDtypeгдеkindатрибут был некорректно установлен какNoneвместо"O"(GH 30568)Ошибка в
IntervalIndex,IntervalArray, иSeriesс интервальными данными, где сравнения на равенство были некорректными (GH 24112)
Индексирование#
Ошибка при присваивании с использованием обратного среза (GH 26939)
Ошибка в
DataFrame.explode()дублировал бы фрейм при наличии дубликатов в индексе (GH 28010)Ошибка при переиндексации
PeriodIndex()с другим типом индекса, который содержалPeriod(GH 28323) (GH 28337)Исправление назначения столбца через
.locс numpy не-ns типом datetime (GH 27395)Ошибка в
Float64Index.astype()гдеnp.infне обрабатывался должным образом при приведении к целочисленному типу данных (GH 28475)Index.union()могло завершиться неудачей, когда левая часть содержала дубликаты (GH 28257)Ошибка при индексировании с
.locгде индекс былCategoricalIndexс нестроковыми категориями не работало (GH 17569, GH 30225)Index.get_indexer_non_unique()мог завершиться ошибкой сTypeErrorв некоторых случаях, например, при поиске целых чисел в строковом индексе (GH 28257)Ошибка в
Float64Index.get_loc()некорректное возбуждениеTypeErrorвместоKeyError(GH 29189)Ошибка в
DataFrame.loc()с некорректным типом данных при установке категориального значения в DataFrame с 1 строкой (GH 25495)MultiIndex.get_loc()не может найти пропущенные значения, когда входные данные включают пропущенные значения (GH 19132)Ошибка в
Series.__setitem__()неправильное присвоение значений с булевым индексатором, когда длина новых данных соответствует количествуTrueзначения и новые данные не являютсяSeriesилиnp.array(GH 30567)Ошибка при индексации с
PeriodIndexнекорректное принятие целых чисел, представляющих годы, используйте, например,ser.loc["2007"]вместоser.loc[2007](GH 30763)
Отсутствует#
MultiIndex#
Конструктор для
MultiIndexпроверяет, что заданныйsortorderсовместим с фактическимlexsort_depthifverify_integrityпараметрTrue(по умолчанию) (GH 28735)Series и MultiIndex
.dropсMultiIndexвызвать исключение, если метки не указаны на уровне (GH 8594)
Ввод-вывод#
read_csv()теперь принимает файловые буферы в бинарном режиме при использовании движка Python csv (GH 23779)Ошибка в
DataFrame.to_json()где использование кортежа как значения столбца или индекса и использованиеorient="columns"илиorient="index"будет создавать недопустимый JSON (GH 20500)Улучшить парсинг бесконечности.
read_csv()теперь интерпретируетInfinity,+Infinity,-Infinityкак значения с плавающей точкой (GH 10065)Ошибка в
DataFrame.to_csv()где значения обрезались, когда длинаna_repбыл короче, чем входные текстовые данные. (GH 25099)Ошибка в
DataFrame.to_string()где значения были усечены с использованием параметров отображения вместо вывода полного содержимого (GH 9784)Ошибка в
DataFrame.to_json()где метка столбца с датой и временем не выводилась в формате ISO сorient="table"(GH 28130)Ошибка в
DataFrame.to_parquet()где запись в GCS завершилась бы ошибкой сengine='fastparquet'если файл ещё не существовал (GH 28326)Ошибка в
read_hdf()закрытие хранилищ, которые не были открыты при возникновении исключений (GH 28699)Ошибка в
DataFrame.read_json()где использованиеorient="index"не сохранит порядок (GH 28557)Ошибка в
DataFrame.to_html()где длинаformattersаргумент не проверялся (GH 28469)Ошибка в
DataFrame.read_excel()сengine='ods'когдаsheet_nameаргумент ссылается на несуществующий лист (GH 27676)Ошибка в
pandas.io.formats.style.Styler()форматирование для значений с плавающей точкой не отображает десятичные знаки правильно (GH 13257)Ошибка в
DataFrame.to_html()при использованииformatters=иmax_colsвместе. (GH 25955)Ошибка в
Styler.background_gradient()не может работать с типом данныхInt64(GH 28869)Ошибка в
DataFrame.to_clipboard()что не работало надежно в ipython (GH 22707)Ошибка в
read_json()где кодировка по умолчанию не была установлена вutf-8(GH 29565)Ошибка в
PythonParserгде строки и байты смешивались при работе с десятичным полем (GH 29650)read_gbq()теперь принимаетprogress_bar_typeдля отображения индикатора выполнения во время загрузки данных. (GH 29857)Ошибка в
pandas.io.json.json_normalize()где пропущенное значение в местоположении, указанномrecord_pathвызоветTypeError(GH 30148)read_excel()теперь принимает двоичные данные (GH 15914)Ошибка в
read_csv()в котором обработка кодировки была ограничена только строкойutf-16для движка C (GH 24130)
Построение графиков#
Ошибка в
Series.plot()не может отображать булевы значения (GH 23719)Ошибка в
DataFrame.plot()не может построить график при отсутствии строк (GH 27758)Ошибка в
DataFrame.plot()выдавая некорректные маркеры легенды при построении нескольких серий на одной оси (GH 18222)Ошибка в
DataFrame.plot()когдаkind='box'и данные содержат datetime или timedelta данные. Эти типы теперь автоматически удаляются (GH 22799)Ошибка в
DataFrame.plot.line()иDataFrame.plot.area()выдает неправильный xlim на оси X (GH 27686, GH 25160, GH 24784)Ошибка, где
DataFrame.boxplot()не принимал быcolorпараметра, такого какDataFrame.plot.box()(GH 26214)Ошибка в
xticksаргумент игнорируется дляDataFrame.plot.bar()(GH 14119)set_option()теперь проверяет, что бэкенд графика, предоставленный в'plotting.backend'реализует бэкенд, когда опция установлена, а не когда создаётся график (GH 28163)DataFrame.plot()теперь разрешаетbackendаргумент ключевого слова для возможности смены бэкендов в одной сессии (GH 28619).Ошибка в проверке цвета, некорректно вызывающая для нецветовых стилей (GH 29122).
Разрешить
DataFrame.plot.scatter()для построения графикаobjectsиdatetimeтип данных (GH 18755, GH 30391)Ошибка в
DataFrame.hist(),xrot=0не работает сbyи подграфики (GH 30288).
GroupBy/resample/rolling#
Ошибка в
core.groupby.DataFrameGroupBy.apply()показывая вывод только от одной группы, когда функция возвращаетIndex(GH 28652)Ошибка в
DataFrame.groupby()с несколькими группами, гдеIndexErrorбудет вызвано, если любая группа содержала все значения NA (GH 20519)Ошибка в
Resampler.size()иResampler.count()возвращает неправильный тип данных при использовании с пустымSeriesилиDataFrame(GH 28427)Ошибка в
DataFrame.rolling()не позволяет выполнять rolling для дат и времени, когдаaxis=1(GH 28192)Ошибка в
DataFrame.rolling()не позволяя перекатываться по уровням мультииндекса (GH 15584).Ошибка в
DataFrame.rolling()не разрешая скользящие операции по монотонно убывающим временным индексам (GH 19248).Ошибка в
DataFrame.groupby()не предлагая выбор по имени столбца, когдаaxis=1(GH 27614)Ошибка в
core.groupby.DataFrameGroupby.agg()не удалось использовать лямбда-функцию с именованной агрегацией (GH 27519)Ошибка в
DataFrame.groupby()потеря информации о названиях столбцов при группировке по категориальному столбцу (GH 28787)Удалить ошибку, возникающую из-за дублированных входных функций в именованной агрегации в
DataFrame.groupby()иSeries.groupby(). Ранее ошибка возникала, если та же функция применялась к тому же столбцу, а теперь это разрешено, если новые назначенные имена отличаются. (GH 28426)core.groupby.SeriesGroupBy.value_counts()сможет обработать случай, даже когдаGrouperсоздает пустые группы (GH 28479)Ошибка в
core.window.rolling.Rolling.quantile()игнорируяinterpolationаргумент ключевого слова при использовании внутри groupby (GH 28779)Ошибка в
DataFrame.groupby()гдеany,all,nuniqueи функции transform некорректно обрабатывали повторяющиеся метки столбцов (GH 21668)Ошибка в
core.groupby.DataFrameGroupBy.agg()с временной зоной datetime64 столбец неправильно приводит результаты к исходному типу данных (GH 29641)Ошибка в
DataFrame.groupby()при использовании axis=1 и наличии индекса столбцов с одним уровнем (GH 30208)Ошибка в
DataFrame.groupby()при использовании nunique на axis=1 (GH 30253)Ошибка в
DataFrameGroupBy.quantile()иSeriesGroupBy.quantile()с несколькими значениями q в виде списка и целочисленными именами столбцов (GH 30289)Ошибка в
DataFrameGroupBy.pct_change()иSeriesGroupBy.pct_change()вызываетTypeErrorкогдаfill_methodявляетсяNone(GH 30463)Ошибка в
Rolling.count()иExpanding.count()аргумент, гдеmin_periodsигнорировался (GH 26996)
Изменение формы#
Ошибка в
DataFrame.apply()который вызывал некорректный вывод с пустымDataFrame(GH 28202, GH 21959)Ошибка в
DataFrame.stack()неправильная обработка неуникальных индексов при создании MultiIndex (GH 28301)Ошибка в
pivot_table()не возвращает правильный типfloatкогдаmargins=Trueиaggfunc='mean'(GH 24893)Ошибка
merge_asof()не мог использоватьdatetime.timedeltaдляtolerancekwarg (GH 28098)Ошибка в
merge(), не добавлял суффиксы корректно с MultiIndex (GH 28518)Исправление для обеспечения возможности использования всех целочисленных типов данных в
merge_asof()при использовании значения допуска. Ранее каждый тип, отличный от int64, вызывал ошибочноеMergeError(GH 28870).Улучшенное сообщение об ошибке в
get_dummies()когдаcolumnsне является значением типа список (GH 28383)Ошибка в
Index.join()что вызывало ошибку бесконечной рекурсии для несовпадающихMultiIndexпорядки имен. (GH 25760, GH 28956)Ошибка
Series.pct_change()где указание закрепленной частоты вызывалоValueError(GH 28664)Ошибка, где
DataFrame.equals()возвращал True некорректно в некоторых случаях, когда два DataFrame имели одинаковые столбцы в разном порядке (GH 28839)Ошибка в
DataFrame.replace()что приводило к игнорированию типа данных нечислового заменяющего значения (GH 26632)Ошибка в
melt()где передача смешанных строковых и числовых значений дляid_varsилиvalue_varsнеправильно вызывал быValueError(GH 29718)Типы данных теперь сохраняются при транспонировании
DataFrameгде каждый столбец имеет одинаковый тип расширения (GH 30091)Ошибка в
merge_asof()объединение с учетом часового поясаleft_indexиright_onстолбец с информацией о часовом поясе (GH 29864)Улучшено сообщение об ошибке и строка документации в
cut()иqcut()когдаlabels=True(GH 13318)Ошибка в пропущенном
fill_naпараметр дляDataFrame.unstack()со списком уровней (GH 30740)
Разреженный#
Ошибка в
SparseDataFrameарифметические операции некорректно приводили входные данные к типу float (GH 28107)Ошибка в
DataFrame.sparseвозвращаяSeriesкогда был столбец с именемsparseа не аксессор (GH 30758)Исправлено
operator.xor()с булевым типом данныхSparseArray. Теперь возвращает разреженный результат, а не тип данных object (GH 31025)
ExtensionArray#
Другие#
Попытка установить
display.precision,display.max_rowsилиdisplay.max_columnsиспользуяset_option()к чему-либо, кромеNoneили положительное целое число вызоветValueError(GH 23348)Используя
DataFrame.replace()с перекрывающимися ключами во вложенном словаре больше не вызывает ошибку, теперь соответствует поведению плоского словаря (GH 27660)DataFrame.to_csv()иSeries.to_csv()теперь поддерживает словари какcompressionаргумент с ключом'method'является методом сжатия, а другие — дополнительными параметрами сжатия, когда метод сжатия —'zip'. (GH 26023)Ошибка в
Series.diff()где логическая серия ошибочно вызывала быTypeError(GH 17294)Series.append()больше не будет вызыватьTypeErrorпри передаче кортежа изSeries(GH 28410)Исправлено поврежденное сообщение об ошибке при вызове
pandas.libs._json.encode()на 0d массиве (GH 18878)Обратные кавычки в
DataFrame.query()иDataFrame.eval()теперь также может использоваться для недопустимых идентификаторов, таких как имена, начинающиеся с цифры, являющиеся ключевыми словами Python или использующие однобуквенные операторы. (GH 27017)Ошибка в
pd.core.util.hashing.hash_pandas_objectгде массивы, содержащие кортежи, некорректно обрабатывались как нехешируемые (GH 28969)Ошибка в
DataFrame.append()который поднялIndexErrorпри добавлении с пустым списком (GH 28769)Исправление
AbstractHolidayCalendarвозвращать корректные результаты для лет после 2030 (теперь до 2200) (GH 27790)Исправлено
IntegerArrayвозвращаяinfвместоNaNдля операций деления на0(GH 27398)Исправлено
powоперации дляIntegerArrayкогда другое значение равно0или1(GH 29997)Ошибка в
Series.count()вызывает исключение, если включен use_inf_as_na (GH 29478)Ошибка в
Indexгде нехэшируемое имя может быть установлено без вызова исключенияTypeError(GH 29069)Ошибка в
DataFrameконструктор при передаче 2Dndarrayи расширенным dtype (GH 12513)Ошибка в
DataFrame.to_csv()когда передана серия сdtype="string"иna_rep,na_repусекался до 2 символов. (GH 29975)Ошибка, где
DataFrame.itertuples()неправильно определял, можно ли использовать namedtuples для датафреймов из 255 столбцов (GH 28282)Обрабатывать вложенные NumPy
objectмассивы вtesting.assert_series_equal()для реализаций ExtensionArray (GH 30841)Ошибка в
Indexконструктор некорректно разрешал двумерные входные массивы (GH 13601, GH 27125)
Участники#
Всего 308 человек внесли патчи в этот релиз. Люди со знаком «+» рядом с именами внесли патч впервые.
Аадитья Паникат +
Abdullah İhsan Seçer
Abhijeet Krishnan +
Adam J. Stewart
Adam Klaum +
Эддисон Линч
Aivengoe +
Alastair James +
Albert Villanova del Moral
Алекс Кирко +
Alfredo Granja +
Аллен Дауни
Alp Arıbal +
Andreas Buhr +
Andrew Munch +
Andy
Angela Ambroz +
Анируддха Бхаттачарджи +
Ankit Dhankhar +
Antonio Andraues Jr +
Arda Kosar +
Asish Mahapatra +
Austin Hackett +
Avi Kelman +
AyowoleT +
Bas Nijholt +
Ben Thayer
Bharat Raghunathan
Bhavani Ravi
Bhuvana KA +
Big Head
Blake Hawkins +
Bobae Kim +
Brett Naul
Брайан Уигналл
Bruno P. Kinoshita +
Bryant Moscon +
Cesar H +
Chris Stadler
Chris Zimmerman +
Кристофер Уилан
Clemens Brunner
Clemens Tolboom +
Коннор Чарльз +
Даниэль Хенке +
Daniel Saxton
Darin Plutchok +
Дэйв Хьюз
David Stansby
DavidRosen +
Дин +
Deepan Das +
Deepyaman Datta
Дор Амрам +
Dorothy Kabarozi +
Drew Heenan +
Eliza Mae Saret +
Elle +
Endre Mark Borza +
Eric Brassell +
Eric Wong +
Eunseop Jeong +
Eyden Villanueva +
Феликс Диво
ForTimeBeing +
Francesco Truzzi +
Gabriel Corona +
Gabriel Monteiro +
Galuh Sahid +
Георги Байчев +
Gina
GiuPassarelli +
Grigorios Giannakopoulos +
Guilherme Leite +
Guilherme Salomé +
Gyeongjae Choi +
Харшавардхан Бачина +
Harutaka Kawamura +
Хасан Кибириге
Hielke Walinga
Hubert
Hugh Kelley +
Ian Eaves +
Ignacio Santolin +
Igor Filippov +
Ирв Ластиг
Isaac Virshup +
Ivan Bessarabov +
JMBurley +
Jack Bicknell +
Джейкоб Бакхайт +
Jan Koch
Jan Pipek +
Jan Škoda +
Jan-Philip Gehrcke
Jasper J.F. van den Bosch +
Javad +
Jeff Reback
Jeremy Schendel
Jeroen Kant +
Джесси Пардью +
Jethro Cao +
Jiang Yue
Jiaxiang +
Jihyung Moon +
Jimmy Callin
Jinyang Zhou +
Joao Victor Martinelli +
Joaq Almirante +
John G Evans +
John Ward +
Jonathan Larkin +
Joris Van den Bossche
Josh Dimarsky +
Joshua Smith +
Josiah Baker +
Julia Signell +
Jung Dong Ho +
Justin Cole +
Джастин Чжэн
Kaiqi Dong
Karthigeyan +
Katherine Younglove +
Katrin Leinweber
Kee Chong Tan +
Keith Kraus +
Kevin Nguyen +
Кевин Шеппард
Kisekka David +
Кушик +
Kyle Boone +
Kyle McCahill +
Laura Collard, PhD +
LiuSeeker +
Louis Huynh +
Lucas Scarlato Astur +
Luiz Gustavo +
Luke +
jnecus
МХалусова +
Mabel Villalba
Maciej J +
Mak Sze Chun
Manu NALEPA +
Marc
Марк Гарсия
Marco Gorelli +
Marco Neumann +
Martin Winkel +
Martina G. Vilas +
Mateusz +
Мэтью Рёшке
Matthew Tan +
Max Bolingbroke
Max Chen +
MeeseeksMachine
Мигель +
MinGyo Jung +
Mohamed Amine ZGHAL +
Mohit Anand +
MomIsBestFriend +
Naomi Bonnin +
Nathan Abel +
Nico Cernek +
Найджел Марки +
Noritada Kobayashi +
Oktay Sabak +
Oliver Hofkens +
Oluokun Adedayo +
Osman +
Oğuzhan Öğreden +
Команда разработчиков Pandas +
Patrik Hlobil +
Paul Lee +
Paul Siegel +
Petr Baev +
Пьетро Баттистон
Prakhar Pandey +
Puneeth K +
Raghav +
Rajat +
Раджханс Джадхао +
Rajiv Bharadwaj +
Rik-de-Kort +
Roei.r
Rohit Sanjay +
Ronan Lamy +
Roshni +
Roymprog +
Рушб Васани +
Ryan Grout +
Ryan Nazareth
Samesh Lakhotia +
Samuel Sinayoko
Samyak Jain +
Sarah Donehower +
Sarah Masud +
Saul Shanabrook +
Scott Cole +
SdgJlbl +
Seb +
Сергей Ивко +
Shadi Akiki
Shorokhov Sergey
Siddhesh Poyarekar +
Sidharthan Nair +
Simon Gibbons
Simon Hawkins
Simon-Martin Schröder +
Sofiane Mahiou +
Sourav kumar +
Сувик Мандал +
Soyoun Kim +
Sparkle Russell-Puleri +
Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి)
Stuart Berg +
Sumanau Sareen
Шимон Беднарек +
Tambe Tabitha Achere +
Tan Tran
Тан Хэи +
Tanmay Daripa +
Tanya Jain
Терджи Петерсен
Thomas Li +
Тирт Джайн +
Tola A +
Tom Augspurger
Tommy Lynch +
Tomoyuki Suzuki +
Tony Lorenzo
Unprocessable +
Uwe L. Korn
Vaibhav Vishal
Виктория Здановская +
Vijayant +
Vishwak Srinivasan +
WANG Aiyong
Wenhuan
Wes McKinney
Уилл Айд
Will Holmgren
William Ayd
William Blan +
Wouter Overmeire
Wuraola Oyewusi +
YaOzI +
Yash Shukla +
Yu Wang +
Yusei Tahara +
alexander135 +
alimcmaster1
авелинж +
bganglia +
bolkedebruin
bravech +
chinhwee +
cruzzoe +
dalgarno +
daniellebrown +
danielplawrence
est271 +
francisco souza +
ganevgv +
garanews +
gfyoung
h-vetinari
hasnain2808 +
ianzur +
jalbritt +
jbrockmendel
jeschwar +
jlamborn324 +
joy-rosie +
kernc
killerontherun1
krey +
lexy-lixinyu +
lucyleeow +
lukasbk +
maheshbapatu +
mck619 +
nathalier
naveenkaushik2504 +
nlepleux +
nrebena
ohad83 +
pilkibun
pqzx +
proost +
pv8493013j +
qudade +
rhstanton +
rmunjal29 +
sangarshanan +
sardonick +
saskakarsi +
shaido987 +
ssikdar1
steveayers124 +
tadashigaki +
timcera +
tlaytongoogle +
tobycheese
tonywu1999 +
tsvikas +
yogendrasoni +
zys5945 +