Что нового в версии 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:

  1. Вы можете случайно сохранить смесь строк и не-строк в object массив dtype. A StringArray может хранить только строки.

  2. object dtype нарушает операции, специфичные для dtype, такие как DataFrame.select_dtypes(). Нет чёткого способа выбрать просто текст, исключая не-текст, но всё ещё столбцы типа object.

  3. При чтении кода содержимое 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 сохраняет ExtensionArray dtype с 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):

  1. Строковые данные (включая пропущенные значения) теперь возвращают arrays.StringArray.

  2. Целочисленные данные (включая пропущенные значения) теперь возвращают arrays.IntegerArray.

  3. Логические данные (включая пропущенные значения) теперь возвращают новый 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 из True to "auto" (GH 18720). Теперь пользовательские форматтеры pandas будут применяться только к графикам, созданным pandas, через plot()Ранее форматирование pandas применялось ко всем создаваемым графикам после a plot(). См. регистрация единиц подробнее.

  • Series.dropna() удалил свой **kwargs аргумент в пользу единого how параметр. Предоставление чего-либо, кроме how to **kwargs вызывал TypeError ранее (GH 29388)

  • При тестировании pandas новая минимальная требуемая версия pytest — 5.0.1 (GH 29664)

  • Series.str.__iter__() был устаревшим и будет удален в будущих релизах (GH 28277).

  • Добавлен в список значений NA по умолчанию для read_csv() (GH 30821)

Улучшения документации#

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

  • Series.item() и Index.item() были _сняты с устаревания_ (GH 29250)

  • Index.set_value был объявлен устаревшим. Для заданного индекса idx, массив arr, значение в idx of idx_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_only of Categorical.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 и _step of RangeIndex теперь вызывает FutureWarning вместо DeprecationWarning (GH 26581)

  • The pandas.util.testing модуль устарел. Используйте публичный API в pandas.testing документировано в Функции утверждения (GH 16232).

  • pandas.SparseArray был устаревшим. Используйте pandas.arrays.SparseArray (arrays.SparseArray) вместо этого. (GH 30642)

  • Параметр is_copy of Series.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() из False to True (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() из None to False (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() с Categorical dtype (или 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() из None to True (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() из None to False (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)

  • Передача типа данных с плавающей точкой codes to Categorical.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() из True to False (GH 20841)

  • Изменено значение по умолчанию для raw аргумент в Series.rolling().apply(), DataFrame.rolling().apply(), Series.expanding().apply(), и DataFrame.expanding().apply() из None to False (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 из None to False (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-aware Series и 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") to np.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 или timedelta64 dtype, 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 с CategoricalIndex of IntervalIndex столбцы некорректно вызывали 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 вернет object dtype вместо bool (GH 29624)

Interval#

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

  • Ошибка при присваивании с использованием обратного среза (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_depth if verify_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 для tolerance kwarg (GH 28098)

  • Ошибка в merge(), не добавлял суффиксы корректно с MultiIndex (GH 28518)

  • qcut() и cut() теперь обрабатывает булевый ввод (GH 20303)

  • Исправление для обеспечения возможности использования всех целочисленных типов данных в 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#

  • Ошибка в arrays.PandasArray при установке скалярной строки (GH 28118, GH 28150).

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

  • Ошибка, где DataFrame конструктор вызывал ValueError с данными типа list и dtype указано (GH 30280)

Другие#

  • Попытка установить 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 конструктор при передаче 2D ndarray и расширенным 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 +