Версия 0.16.1 (11 мая 2015)#

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

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

  • Поддержка CategoricalIndex, категориальный индекс, см. здесь

  • Новый раздел о том, как внести вклад в pandas, см. здесь

  • Пересмотренная документация «Слияние, объединение и конкатенация», включая графические примеры для упрощения понимания каждой операции, см. здесь

  • Новый метод sample для получения случайных выборок из Series, DataFrames и Panels. См. здесь

  • По умолчанию Index печать изменилась на более единообразный формат, см. здесь

  • BusinessHour datetime-offset теперь поддерживается, см. здесь

  • Дальнейшее улучшение .str аксессор для упрощения строковых операций, см. здесь

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

В pandas 0.17.0 подпакет pandas.io.data будет удален в пользу отдельно устанавливаемого пакета (GH 8961).

Улучшения#

CategoricalIndex#

Мы представляем CategoricalIndex, новый тип объекта индекса, полезный для поддержки индексирования с дубликатами. Это контейнер вокруг Categorical (введено в v0.15.0) и позволяет эффективное индексирование и хранение индекса с большим количеством дублирующихся элементов. До версии 0.16.1, установка индекса DataFrame/Series с category dtype преобразует это в обычный объектный Index.

In [1]: df = pd.DataFrame({'A': np.arange(6),
   ...:                    'B': pd.Series(list('aabbca'))
   ...:                           .astype('category', categories=list('cab'))
   ...:                    })
   ...:

In [2]: df
Out[2]:
   A  B
0  0  a
1  1  a
2  2  b
3  3  b
4  4  c
5  5  a

In [3]: df.dtypes
Out[3]:
A       int64
B    category
dtype: object

In [4]: df.B.cat.categories
Out[4]: Index(['c', 'a', 'b'], dtype='object')

установка индекса создаст CategoricalIndex

In [5]: df2 = df.set_index('B')

In [6]: df2.index
Out[6]: CategoricalIndex(['a', 'a', 'b', 'b', 'c', 'a'], categories=['c', 'a', 'b'], ordered=False, name='B', dtype='category')

индексирование с __getitem__/.iloc/.loc/.ix работает аналогично Index с дубликатами. Индексаторы ДОЛЖНЫ быть в категории, иначе операция вызовет исключение.

In [7]: df2.loc['a']
Out[7]:
   A
B
a  0
a  1
a  5

и сохраняет CategoricalIndex

In [8]: df2.loc['a'].index
Out[8]: CategoricalIndex(['a', 'a', 'a'], categories=['c', 'a', 'b'], ordered=False, name='B', dtype='category')

сортировка будет упорядочивать по порядку категорий

In [9]: df2.sort_index()
Out[9]:
   A
B
c  4
a  0
a  1
a  5
b  2
b  3

операции groupby по индексу сохранят природу индекса, а также

In [10]: df2.groupby(level=0).sum()
Out[10]:
   A
B
c  4
a  6
b  5

In [11]: df2.groupby(level=0).sum().index
Out[11]: CategoricalIndex(['c', 'a', 'b'], categories=['c', 'a', 'b'], ordered=False, name='B', dtype='category')

операции переиндексации вернут результирующий индекс на основе типа переданного индексатора, что означает, что передача списка вернёт обычныйIndex; индексирование с помощью а Categorical вернёт CategoricalIndex, индексированный в соответствии с категориями ПЕРЕДАННОГО Categorical dtype. Это позволяет произвольно индексировать их даже с значениями НЕ из категорий, аналогично тому, как можно переиндексировать ЛЮБОЙ индекс pandas.

In [12]: df2.reindex(['a', 'e'])
Out[12]:
     A
B
a  0.0
a  1.0
a  5.0
e  NaN

In [13]: df2.reindex(['a', 'e']).index
Out[13]: pd.Index(['a', 'a', 'a', 'e'], dtype='object', name='B')

In [14]: df2.reindex(pd.Categorical(['a', 'e'], categories=list('abcde')))
Out[14]:
     A
B
a  0.0
a  1.0
a  5.0
e  NaN

In [15]: df2.reindex(pd.Categorical(['a', 'e'], categories=list('abcde'))).index
Out[15]: pd.CategoricalIndex(['a', 'a', 'a', 'e'],
                             categories=['a', 'b', 'c', 'd', 'e'],
                             ordered=False, name='B',
                             dtype='category')

См. документация для получения дополнительной информации. (GH 7629, GH 10038, GH 10039)

Пример#

Series, DataFrames и Panels теперь имеют новый метод: sample(). Метод принимает определённое количество строк или столбцов для возврата, или долю от общего количества строк или столбцов. Он также имеет опции для выборки с возвращением или без, для передачи столбца с весами для неравномерной выборки, и для установки значений seed для облегчения воспроизводимости. (GH 2419)

In [1]: example_series = pd.Series([0, 1, 2, 3, 4, 5])

# When no arguments are passed, returns 1
In [2]: example_series.sample()
Out[2]: 
3    3
Length: 1, dtype: int64

# One may specify either a number of rows:
In [3]: example_series.sample(n=3)
Out[3]: 
2    2
1    1
0    0
Length: 3, dtype: int64

# Or a fraction of the rows:
In [4]: example_series.sample(frac=0.5)
Out[4]: 
1    1
5    5
3    3
Length: 3, dtype: int64

# weights are accepted.
In [5]: example_weights = [0, 0, 0.2, 0.2, 0.2, 0.4]

In [6]: example_series.sample(n=3, weights=example_weights)
Out[6]: 
2    2
4    4
3    3
Length: 3, dtype: int64

# weights will also be normalized if they do not sum to one,
# and missing values will be treated as zeros.
In [7]: example_weights2 = [0.5, 0, 0, 0, None, np.nan]

In [8]: example_series.sample(n=1, weights=example_weights2)
Out[8]: 
0    0
Length: 1, dtype: int64

При применении к DataFrame можно передать имя столбца для указания весов выборки при выборке строк.

In [9]: df = pd.DataFrame({"col1": [9, 8, 7, 6], "weight_column": [0.5, 0.4, 0.1, 0]})

In [10]: df.sample(n=3, weights="weight_column")
Out[10]: 
   col1  weight_column
0     9            0.5
1     8            0.4
2     7            0.1

[3 rows x 2 columns]

Улучшения строковых методов#

Продолжение с версии v0.16.0, следующие улучшения делают строковые операции проще и более согласованными со стандартными строковыми операциями Python.

  • Добавлен StringMethods (.str аксессор) для Index (GH 9068)

    The .str аксессор теперь доступен для обоих Series и Index.

    In [11]: idx = pd.Index([" jack", "jill ", " jesse ", "frank"])
    
    In [12]: idx.str.strip()
    Out[12]: Index(['jack', 'jill', 'jesse', 'frank'], dtype='object')
    

    Один особый случай для .str аксессор на Index заключается в том, что если строковый метод возвращает bool, .str аксессор вернет np.array вместо булевого значения Index (GH 8875). Это позволяет следующему выражению работать естественно:

    In [13]: idx = pd.Index(["a1", "a2", "b1", "b2"])
    
    In [14]: s = pd.Series(range(4), index=idx)
    
    In [15]: s
    Out[15]: 
    a1    0
    a2    1
    b1    2
    b2    3
    Length: 4, dtype: int64
    
    In [16]: idx.str.startswith("a")
    Out[16]: array([ True,  True, False, False])
    
    In [17]: s[s.index.str.startswith("a")]
    Out[17]: 
    a1    0
    a2    1
    Length: 2, dtype: int64
    
  • Следующие новые методы доступны через .str аксессор для применения функции к каждому значению. (GH 9766, GH 9773, GH 10031, GH 10045, GH 10052)

    Методы

    capitalize()

    swapcase()

    normalize()

    partition()

    rpartition()

    index()

    rindex()

    translate()

  • split теперь принимает expand ключевое слово для указания, следует ли расширять размерность. return_type устарело. (GH 9847)

    In [18]: s = pd.Series(["a,b", "a,c", "b,c"])
    
    # return Series
    In [19]: s.str.split(",")
    Out[19]: 
    0    [a, b]
    1    [a, c]
    2    [b, c]
    Length: 3, dtype: object
    
    # return DataFrame
    In [20]: s.str.split(",", expand=True)
    Out[20]: 
       0  1
    0  a  b
    1  a  c
    2  b  c
    
    [3 rows x 2 columns]
    
    In [21]: idx = pd.Index(["a,b", "a,c", "b,c"])
    
    # return Index
    In [22]: idx.str.split(",")
    Out[22]: Index([['a', 'b'], ['a', 'c'], ['b', 'c']], dtype='object')
    
    # return MultiIndex
    In [23]: idx.str.split(",", expand=True)
    Out[23]: 
    MultiIndex([('a', 'b'),
                ('a', 'c'),
                ('b', 'c')],
               )
    
  • Улучшено extract и get_dummies методы для Index.str (GH 9980)

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

  • BusinessHour смещение теперь поддерживается, которое представляет рабочие часы с 09:00 до 17:00 в BusinessDay по умолчанию. См. Здесь для подробностей. (GH 7905)

    In [24]: pd.Timestamp("2014-08-01 09:00") + pd.tseries.offsets.BusinessHour()
    Out[24]: Timestamp('2014-08-01 10:00:00')
    
    In [25]: pd.Timestamp("2014-08-01 07:00") + pd.tseries.offsets.BusinessHour()
    Out[25]: Timestamp('2014-08-01 10:00:00')
    
    In [26]: pd.Timestamp("2014-08-01 16:30") + pd.tseries.offsets.BusinessHour()
    Out[26]: Timestamp('2014-08-04 09:30:00')
    
  • DataFrame.diff теперь принимает axis параметр, определяющий направление дифференцирования (GH 9727)

  • Разрешить clip, clip_lower, и clip_upper для принятия аргументов, подобных массиву, в качестве пороговых значений (Это регрессия с версии 0.11.0). Эти методы теперь имеют axis параметр, который определяет, как Series или DataFrame будет выровнен с пороговыми значениями. (GH 6966)

  • DataFrame.mask() и Series.mask() теперь поддерживает те же ключевые слова, что и where (GH 8801)

  • drop функция теперь может принимать errors ключевое слово для подавления ValueError вызывается, когда какая-либо метка не существует в целевых данных. (GH 6736)

    In [27]: df = pd.DataFrame(np.random.randn(3, 3), columns=["A", "B", "C"])
    
    In [28]: df.drop(["A", "X"], axis=1, errors="ignore")
    Out[28]: 
              B         C
    0 -0.706771 -1.039575
    1 -0.424972  0.567020
    2 -1.087401 -0.673690
    
    [3 rows x 2 columns]
    
  • Добавить поддержку разделения лет и кварталов с помощью тире, например 2014-Q1. (GH 9688)

  • Разрешить преобразование значений с типом данных datetime64 или timedelta64 в строки с использованием astype(str) (GH 9757)

  • get_dummies функция теперь принимает sparse ключевое слово. Если установлено в True, возвращаемый DataFrame является разреженным, например SparseDataFrame. (GH 8823)

  • Period теперь принимает datetime64 как входное значение. (GH 9054)

  • Разрешить преобразование строки timedelta, когда ведущий ноль отсутствует в определении времени, т.е. 0:00:00 против 00:00:00. (GH 9570)

  • Разрешить Panel.shift с axis='items' (GH 9890)

  • Попытка записи файла Excel теперь вызывает исключение NotImplementedError если DataFrame имеет MultiIndex вместо записи поврежденного файла Excel. (GH 9794)

  • Разрешить Categorical.add_categories принимать Series или np.array. (GH 9927)

  • Добавить/удалить str/dt/cat доступники динамически из __dir__. (GH 9910)

  • Добавить normalize в качестве dt метод доступа. (GH 10047)

  • DataFrame и Series теперь имеют _constructor_expanddim свойство как переопределяемый конструктор для данных на одну размерность выше. Это следует использовать только тогда, когда это действительно необходимо, см. здесь

  • pd.lib.infer_dtype теперь возвращает 'bytes' в Python 3, где это уместно. (GH 10032)

Изменения API#

  • При передаче ax в df.plot( ..., ax=ax), sharex kwarg теперь по умолчанию будет False. В результате видимость xlabels и xticklabels больше не будет изменяться. Вы должны сделать это самостоятельно для правых осей на вашем графике или установить sharex=True явно (но это изменяет видимость для всех осей на рисунке, а не только для той, которая передана!). Если pandas создаёт подграфики самостоятельно (например, не передано ax kwarg), тогда по умолчанию все равно sharex=True и изменения видимости применяются.

  • assign() теперь вставляет новые столбцы в алфавитном порядке. Ранее порядок был произвольным. (GH 9777)

  • По умолчанию, read_csv и read_table теперь будет пытаться определить тип сжатия на основе расширения файла. Установите compression=None чтобы восстановить предыдущее поведение (без декомпрессии). (GH 9770)

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

  • Series.str.split’s return_type ключевое слово было удалено в пользу expand (GH 9847)

Представление индекса#

Строковое представление Index и его подклассы теперь унифицированы. Они будут отображаться в одну строку, если значений мало; в многострочном формате с переносами для большого количества значений (но менее чем display.max_seq_items; если много элементов (> display.max_seq_items) покажет усеченное отображение (начало и конец данных). Форматирование для MultiIndex остается неизменным (многострочное отображение с переносом). Ширина отображения реагирует на опцию display.max_seq_items, который по умолчанию равен 100. (GH 6482)

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

In [2]: pd.Index(range(4), name='foo')
Out[2]: Int64Index([0, 1, 2, 3], dtype='int64')

In [3]: pd.Index(range(104), name='foo')
Out[3]: Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, ...], dtype='int64')

In [4]: pd.date_range('20130101', periods=4, name='foo', tz='US/Eastern')
Out[4]:

[2013-01-01 00:00:00-05:00, ..., 2013-01-04 00:00:00-05:00]
Length: 4, Freq: D, Timezone: US/Eastern

In [5]: pd.date_range('20130101', periods=104, name='foo', tz='US/Eastern')
Out[5]:

[2013-01-01 00:00:00-05:00, ..., 2013-04-14 00:00:00-04:00]
Length: 104, Freq: D, Timezone: US/Eastern

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

In [29]: pd.set_option("display.width", 80)

In [30]: pd.Index(range(4), name="foo")
Out[30]: RangeIndex(start=0, stop=4, step=1, name='foo')

In [31]: pd.Index(range(30), name="foo")
Out[31]: RangeIndex(start=0, stop=30, step=1, name='foo')

In [32]: pd.Index(range(104), name="foo")
Out[32]: RangeIndex(start=0, stop=104, step=1, name='foo')

In [33]: pd.CategoricalIndex(["a", "bb", "ccc", "dddd"], ordered=True, name="foobar")
Out[33]: CategoricalIndex(['a', 'bb', 'ccc', 'dddd'], categories=['a', 'bb', 'ccc', 'dddd'], ordered=True, dtype='category', name='foobar')

In [34]: pd.CategoricalIndex(["a", "bb", "ccc", "dddd"] * 10, ordered=True, name="foobar")
Out[34]: 
CategoricalIndex(['a', 'bb', 'ccc', 'dddd', 'a', 'bb', 'ccc', 'dddd', 'a',
                  'bb', 'ccc', 'dddd', 'a', 'bb', 'ccc', 'dddd', 'a', 'bb',
                  'ccc', 'dddd', 'a', 'bb', 'ccc', 'dddd', 'a', 'bb', 'ccc',
                  'dddd', 'a', 'bb', 'ccc', 'dddd', 'a', 'bb', 'ccc', 'dddd',
                  'a', 'bb', 'ccc', 'dddd'],
                 categories=['a', 'bb', 'ccc', 'dddd'], ordered=True, dtype='category', name='foobar')

In [35]: pd.CategoricalIndex(["a", "bb", "ccc", "dddd"] * 100, ordered=True, name="foobar")
Out[35]: 
CategoricalIndex(['a', 'bb', 'ccc', 'dddd', 'a', 'bb', 'ccc', 'dddd', 'a',
                  'bb',
                  ...
                  'ccc', 'dddd', 'a', 'bb', 'ccc', 'dddd', 'a', 'bb', 'ccc',
                  'dddd'],
                 categories=['a', 'bb', 'ccc', 'dddd'], ordered=True, dtype='category', name='foobar', length=400)

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

In [37]: pd.date_range("20130101", periods=25, freq="D")
Out[37]: 
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
               '2013-01-05', '2013-01-06', '2013-01-07', '2013-01-08',
               '2013-01-09', '2013-01-10', '2013-01-11', '2013-01-12',
               '2013-01-13', '2013-01-14', '2013-01-15', '2013-01-16',
               '2013-01-17', '2013-01-18', '2013-01-19', '2013-01-20',
               '2013-01-21', '2013-01-22', '2013-01-23', '2013-01-24',
               '2013-01-25'],
              dtype='datetime64[ns]', freq='D')

In [38]: pd.date_range("20130101", periods=104, name="foo", tz="US/Eastern")
Out[38]: 
DatetimeIndex(['2013-01-01 00:00:00-05:00', '2013-01-02 00:00:00-05:00',
               '2013-01-03 00:00:00-05:00', '2013-01-04 00:00:00-05:00',
               '2013-01-05 00:00:00-05:00', '2013-01-06 00:00:00-05:00',
               '2013-01-07 00:00:00-05:00', '2013-01-08 00:00:00-05:00',
               '2013-01-09 00:00:00-05:00', '2013-01-10 00:00:00-05:00',
               ...
               '2013-04-05 00:00:00-04:00', '2013-04-06 00:00:00-04:00',
               '2013-04-07 00:00:00-04:00', '2013-04-08 00:00:00-04:00',
               '2013-04-09 00:00:00-04:00', '2013-04-10 00:00:00-04:00',
               '2013-04-11 00:00:00-04:00', '2013-04-12 00:00:00-04:00',
               '2013-04-13 00:00:00-04:00', '2013-04-14 00:00:00-04:00'],
              dtype='datetime64[ns, US/Eastern]', name='foo', length=104, freq='D')

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

  • Улучшена производительность записи csv со смешанными dtypes, включая даты и время, до 5 раз (GH 9940)

  • Улучшена производительность записи csv в целом в 2 раза (GH 9940)

  • Улучшена производительность pd.lib.max_len_string_array в 5-7 раз (GH 10024)

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

  • Ошибка, при которой метки неправильно отображались в легенде DataFrame.plot(), передавая label= аргументы работают, и индексы Series больше не изменяются. (GH 9542)

  • Ошибка в сериализации JSON, вызывающая segfault при нулевой длине фрейма. (GH 9805)

  • Ошибка в read_csv где отсутствие завершающих разделителей может вызвать ошибку сегментации (GH 5664)

  • Ошибка сохранения имени индекса при добавлении (GH 9862)

  • Ошибка в scatter_matrix рисует неожиданные метки делений оси (GH 5662)

  • Исправлена ошибка в StataWriter приводя к изменениям во входных данных DataFrame при сохранении (GH 9795).

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

  • Ошибка в equals вызывая ложные отрицания при изменении порядка блоков (GH 9330)

  • Ошибка при группировке с несколькими pd.Grouper где один не основан на времени (GH 10063)

  • Ошибка в read_sql_table ошибка при чтении таблицы PostgreSQL с часовым поясом (GH 7139)

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

  • Ошибка, где TimdeltaIndex не были правильно сериализованы в фиксированном HDFStore (GH 9635)

  • Ошибка с TimedeltaIndex конструктор игнорирует name при задании другого TimedeltaIndex в качестве данных (GH 10025).

  • Ошибка в DataFrameFormatter._get_formatted_index без применения max_colwidth в DataFrame индекс (GH 7856)

  • Ошибка в .loc с источником данных read-only ndarray (GH 10043)

  • Ошибка в groupby.apply() которая вызывала бы ошибку, если переданная пользовательская функция возвращала только None (для всех входных данных). (GH 9685)

  • Всегда используйте временные файлы в тестах pytables (GH 9992)

  • Ошибка при непрерывном построении графиков с использованием secondary_y может неправильно отображать легенду. (GH 9610, GH 9779)

  • Ошибка в DataFrame.plot(kind="hist") приводит к TypeError когда DataFrame содержит нечисловые столбцы (GH 9853)

  • Ошибка, при которой повторное построение графика DataFrame с DatetimeIndex может вызывать TypeError (GH 9852)

  • Ошибка в setup.py что позволяло собрать несовместимую версию Cython (GH 9827)

  • Ошибка в построении графиков secondary_y неправильно присоединяет right_ax свойство для вторичных осей, рекурсивно определяющее само себя. (GH 9861)

  • Ошибка в Series.quantile на пустой Series типа Datetime или Timedelta (GH 9675)

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

  • Ошибка в FloatArrayFormatter где граница принятия решения для отображения «маленьких» чисел с плавающей точкой в десятичном формате смещена на один порядок величины для заданной display.precision (GH 9764)

  • Исправлена ошибка, где DataFrame.plot() вызвал ошибку, когда оба color и style ключевые слова были переданы, и в строке стиля не было символа цвета (GH 9671)

  • Не отображается DeprecationWarning при комбинировании списков с Index (GH 10083)

  • Ошибка в read_csv и read_table при использовании skip_rows параметр, если присутствуют пустые строки. (GH 9832)

  • Ошибка в read_csv() интерпретирует index_col=True как 1 (GH 9798)

  • Ошибка в сравнениях равенства индексов с использованием == ошибка при несовместимости типов Index/MultiIndex (GH 9785)

  • Ошибка, при которой SparseDataFrame не мог принять nan в качестве имени столбца (GH 8822)

  • Ошибка в to_msgpack и read_msgpack поддержка сжатия zlib и blosc (GH 9783)

  • Ошибка GroupBy.size не присваивает имя индексу корректно при группировке по TimeGrouper (GH 9925)

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

  • Ошибка в парсере csv, приводящая к пропуску строк с начальным пробелом и одним непробельным символом. (GH 9710)

  • Ошибка в парсере CSV на C, вызывающая ложные NaN, когда данные начинались с новой строки, за которой следовал пробел. (GH 10022)

  • Ошибка, из-за которой элементы с нулевой группой попадают в конечную группу при группировке по Categorical (GH 9603)

  • Ошибка, при которой поведение .iloc и .loc не согласовано на пустых датафреймах (GH 9964)

  • Ошибка в недопустимом доступе к атрибуту на TimedeltaIndex неправильно вызывалось ValueError вместо AttributeError (GH 9680)

  • Ошибка в неравных сравнениях между категориальными данными и скаляром, который не входит в категории (например, Series(Categorical(list("abc"), ordered=True)) > "d". Это возвращалось False для всех элементов, но теперь вызывает TypeError. Сравнения на равенство теперь также возвращают False для == и True для !=. (GH 9848)

  • Ошибка в DataFrame __setitem__ когда правая сторона является словарем (GH 9874)

  • Ошибка в where когда dtype равен datetime64/timedelta64, но тип данных другого не является (GH 9804)

  • Ошибка в MultiIndex.sortlevel() приводит к разрывам имен уровней в юникоде (GH 9856)

  • Ошибка, при которой groupby.transform неправильно принудительно приводил выходные типы данных к соответствию входным типам данных. (GH 9807)

  • Ошибка в DataFrame конструктор, когда columns параметр установлен, и data является пустым списком (GH 9939)

  • Ошибка в столбчатой диаграмме с log=True вызывает TypeError если все значения меньше 1 (GH 9905)

  • Ошибка в горизонтальной гистограмме игнорирует log=True (GH 9905)

  • Ошибка в запросах PyTables, которые не возвращали корректные результаты при использовании индекса (GH 8265, GH 9676)

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

  • Ошибка, при использовании DataFrames asfreq удалялось имя индекса. (GH 9885)

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

  • Изменено кэширование в AbstractHolidayCalendar должен быть на уровне экземпляра, а не на уровне класса, так как последнее может привести к неожиданному поведению. (GH 9552)

  • Исправлен вывод LaTeX для фреймов данных с MultiIndex (GH 9778)

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

  • Ошибка в скрытии меток делений с подграфиками и общими осями при добавлении нового графика к существующей сетке осей (GH 9158)

  • Ошибка в transform и filter при группировке по категориальной переменной (GH 9921)

  • Ошибка в transform когда группы равны по количеству и типу данных входному индексу (GH 9700)

  • Коннектор Google BigQuery теперь импортирует зависимости на основе каждого метода.(GH 9713)

  • Обновлённый коннектор BigQuery больше не использует устаревший oauth2client.tools.run() (GH 8327)

  • Ошибка в унаследованном DataFrame. Он может не возвращать правильный класс при срезе или подмножестве. (GH 9632)

  • Ошибка в .median() где нечисловые нулевые значения обрабатываются некорректно (GH 10040)

  • Ошибка в Series.fillna(), где возникает исключение, если задана численно преобразуемая строка (GH 10092)

Участники#

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

  • Alfonso MHC +

  • Andy Hayden

  • Artemy Kolchinsky

  • Chris Gilmer +

  • Chris Grinolds +

  • Dan Birken

  • David BROCHART +

  • David Hirschfeld +

  • David Stephens

  • Dr. Leo +

  • Evan Wright +

  • Frans van Dunné +

  • Hatem Nassrat +

  • Henning Sperr +

  • Hugo Herter +

  • Ян Шульц

  • Jeff Blackburne +

  • Jeff Reback

  • Jim Crist +

  • Jonas Abernot +

  • Joris Van den Bossche

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

  • Leo Razoumov +

  • Manuel Riel +

  • Mortada Mehyar

  • Nick Burns +

  • Nick Eubank +

  • Оливье Гризель

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

  • Пьетро Баттистон

  • Roy Hyunjin Han

  • Sam Zhang +

  • Scott Sanderson +

  • Sinhrks +

  • Stephan Hoyer

  • Tiago Antao

  • Tom Ajamian +

  • Tom Augspurger

  • Tomaz Berisa +

  • Vikram Shirgur +

  • Владимир Филимонов

  • William Hogman +

  • Yasin A +

  • Younggun Kim +

  • behzad nouri

  • dsm054

  • floydsoft +

  • flying-sheep +

  • gfr +

  • jnmclarty

  • jreback

  • ksanghai +

  • lucas +

  • mschmohl +

  • ptype +

  • rockg

  • scls19fr +

  • sinhrks