Версия 0.17.1 (21 ноября 2015)#

Примечание

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

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

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

  • Поддержка условного HTML-форматирования, см. здесь

  • Освобождение GIL в csv reader и других операциях, см. здесь

  • Исправлена регрессия в DataFrame.drop_duplicates с версии 0.16.2, вызывая некорректные результаты для целочисленных значений (GH 11376)

Новые возможности#

Условное HTML-форматирование#

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

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

Мы добавили экспериментальный поддержка условного HTML-форматирования: визуальное оформление DataFrame на основе данных. Оформление осуществляется с помощью HTML и CSS. Доступ к классу styler через pandas.DataFrame.style, атрибут, экземпляр Styler с прикрепленными вашими данными.

Вот краткий пример:

In [1]: np.random.seed(123)

In [2]: df = pd.DataFrame(np.random.randn(10, 5), columns=list("abcde"))

In [3]: html = df.style.background_gradient(cmap="viridis", low=0.5)

Мы можем отрендерить HTML, чтобы получить следующую таблицу.

a b c d e
0 -1.085631 0.997345 0.282978 -1.506295 -0.5786
1 1.651437 -2.426679 -0.428913 1.265936 -0.86674
2 -0.678886 -0.094709 1.49139 -0.638902 -0.443982
3 -0.434351 2.20593 2.186786 1.004054 0.386186
4 0.737369 1.490732 -0.935834 1.175829 -1.253881
5 -0.637752 0.907105 -1.428681 -0.140069 -0.861755
6 -0.255619 -2.798589 -1.771533 -0.699877 0.927462
7 -0.173636 0.002846 0.688223 -0.879536 0.283627
8 -0.805367 -1.727669 -0.3909 0.573806 0.338589
9 -0.01183 2.392365 0.412912 0.978736 2.238143

Styler хорошо взаимодействует с Jupyter Notebook. См. документация подробнее.

Улучшения#

  • DatetimeIndex теперь поддерживает преобразование в строки с astype(str) (GH 10442)

  • Поддержка compression (gzip/bz2) в pandas.DataFrame.to_csv() (GH 7615)

  • pd.read_* функции теперь также могут принимать pathlib.Path, или py:py._path.local.LocalPath объекты для filepath_or_buffer аргумент. (GH 11033) - The DataFrame и Series функции .to_csv(), .to_html() и .to_latex() теперь может обрабатывать пути, начинающиеся с тильды (например, ~/Documents/) (GH 11438)

  • DataFrame теперь использует поля namedtuple в качестве столбцов, если столбцы не предоставлены (GH 11181)

  • DataFrame.itertuples() теперь возвращает namedtuple объекты, когда это возможно. (GH 11269, GH 11625)

  • Добавлен axvlines_kwds к графику параллельных координат (GH 10709)

  • Опция для .info() и .memory_usage() для обеспечения глубокого интроспективного анализа потребления памяти. Обратите внимание, что это может быть дорогостоящим для вычисления и поэтому является необязательным параметром. (GH 11595)

    In [4]: df = pd.DataFrame({"A": ["foo"] * 1000})  # noqa: F821
    
    In [5]: df["B"] = df["A"].astype("category")
    
    # shows the '+' as we have object dtypes
    In [6]: df.info()
    
    RangeIndex: 1000 entries, 0 to 999
    Data columns (total 2 columns):
     #   Column  Non-Null Count  Dtype   
    ---  ------  --------------  -----   
     0   A       1000 non-null   object  
     1   B       1000 non-null   category
    dtypes: category(1), object(1)
    memory usage: 9.0+ KB
    
    # we have an accurate memory assessment (but can be expensive to compute this)
    In [7]: df.info(memory_usage="deep")
    
    RangeIndex: 1000 entries, 0 to 999
    Data columns (total 2 columns):
     #   Column  Non-Null Count  Dtype   
    ---  ------  --------------  -----   
     0   A       1000 non-null   object  
     1   B       1000 non-null   category
    dtypes: category(1), object(1)
    memory usage: 59.9 KB
    
  • Index теперь имеет fillna метод (GH 10089)

    In [8]: pd.Index([1, np.nan, 3]).fillna(2)
    Out[8]: Index([1.0, 2.0, 3.0], dtype='float64')
    
  • Series типа category теперь делает .str.<...> и .dt.<...> методы доступа / свойства доступны, если категории относятся к этому типу. (GH 10661)

    In [9]: s = pd.Series(list("aabb")).astype("category")
    
    In [10]: s
    Out[10]: 
    0    a
    1    a
    2    b
    3    b
    Length: 4, dtype: category
    Categories (2, object): ['a', 'b']
    
    In [11]: s.str.contains("a")
    Out[11]: 
    0     True
    1     True
    2    False
    3    False
    Length: 4, dtype: bool
    
    In [12]: date = pd.Series(pd.date_range("1/1/2015", periods=5)).astype("category")
    
    In [13]: date
    Out[13]: 
    0   2015-01-01
    1   2015-01-02
    2   2015-01-03
    3   2015-01-04
    4   2015-01-05
    Length: 5, dtype: category
    Categories (5, datetime64[ns]): [2015-01-01, 2015-01-02, 2015-01-03, 2015-01-04, 2015-01-05]
    
    In [14]: date.dt.day
    Out[14]: 
    0    1
    1    2
    2    3
    3    4
    4    5
    Length: 5, dtype: int32
    
  • pivot_table теперь имеет margins_name аргумент, чтобы можно было использовать что-то отличное от значения по умолчанию ‘All’ (GH 3335)

  • Реализовать экспорт datetime64[ns, tz] типы данных с фиксированным хранилищем HDF5 (GH 11411)

  • Красивый вывод множеств (например, в ячейках DataFrame) теперь использует синтаксис литералов множеств ({x, y}) вместо устаревшего синтаксиса Python (set([x, y])) (GH 11215)

  • Улучшить сообщение об ошибке в pandas.io.gbq.to_gbq() когда потоковая вставка завершается неудачей (GH 11285) и когда DataFrame не соответствует схеме таблицы назначения (GH 11359)

Изменения API#

  • raise NotImplementedError в Index.shift для неподдерживаемых типов индексов (GH 8038)

  • min и max редукции на datetime64 и timedelta64 серии с типом данных теперь приводят к NaT и не nan (GH 11245).

  • Индексирование с нулевым ключом вызовет TypeError, вместо ValueError (GH 11356)

  • Series.ptp теперь по умолчанию игнорирует пропущенные значения (GH 11163)

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

  • The pandas.io.ga модуль, который реализует google-analytics поддержка устарела и будет удалена в будущей версии (GH 11308)

  • Устаревает engine ключевое слово в .to_csv(), который будет удален в будущей версии (GH 11274)

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

  • Проверка монотонности перед сортировкой по индексу (GH 11080)

  • Series.dropna улучшение производительности, когда его тип данных не может содержать NaN (GH 11159)

  • Освободить GIL для большинства операций с полями даты и времени (например, DatetimeIndex.year, Series.dt.year), нормализация и преобразование в и из Period, DatetimeIndex.to_period и PeriodIndex.to_timestamp (GH 11263)

  • Освобождение GIL в некоторых алгоритмах скользящего окна: rolling_median, rolling_mean, rolling_max, rolling_min, rolling_var, rolling_kurt, rolling_skew (GH 11450)

  • Освободить GIL при чтении и парсинге текстовых файлов в read_csv, read_table (GH 11272)

  • Улучшена производительность rolling_median (GH 11450)

  • Улучшена производительность to_excel (GH 11352)

  • Ошибка производительности в repr для Categorical категории, которые отображали строки перед их обрезкой для показа (GH 11305)

  • Улучшение производительности в Categorical.remove_unused_categories, (GH 11643).

  • Улучшена производительность Series конструктор без данных и DatetimeIndex (GH 11433)

  • Улучшена производительность shift, cumprod, и cumsum с groupby (GH 4095)

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

  • SparseArray.__iter__() теперь не вызывает PendingDeprecationWarning в Python 3.5 (GH 11622)

  • Регрессия с версии 0.16.2 для форматирования вывода длинных чисел с плавающей точкой/nan, восстановлена в (GH 11302)

  • Series.sort_index() теперь корректно обрабатывает inplace опция (GH 11402)

  • Неправильно распределенный .c файл в сборке на PyPi при чтении csv с числами с плавающей точкой и передаче na_values= scalar> будет показывать исключение (GH 11374)

  • Ошибка в .to_latex() вывод нарушен, когда индекс имеет имя (GH 10660)

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

  • Ошибка при слиянии datetime64[ns, tz] типы данных (GH 11405)

  • Ошибка в HDFStore.select при сравнении со скаляром numpy в условии where (GH 11283)

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

  • Ошибка в date_range с неоднозначными конечными точками (GH 11626)

  • Запретить добавление новых атрибутов к аксессорам .str, .dt и .cat. Получение такого значения было невозможно, поэтому выдать ошибку при установке. (GH 10673)

  • Ошибка в преобразованиях часовых поясов с неоднозначным временем и .dt аксессоры (GH 11295)

  • Ошибка в форматировании вывода при использовании индекса неоднозначных времен (GH 11619)

  • Ошибка в сравнениях Series с list-likes (GH 11339)

  • Ошибка в DataFrame.replace с datetime64[ns, tz] и несовместимый to_replace (GH 11326, GH 11153)

  • Ошибка в isnull где numpy.datetime64('NaT') в numpy.array не был определён как null(GH 11206)

  • Ошибка при индексировании по списку со смешанным целочисленным Index (GH 11320)

  • Ошибка в pivot_table с margins=True когда индексы имеют Categorical тип данных (GH 10993)

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

  • Регрессия в DataFrame.drop_duplicates с версии 0.16.2, вызывая некорректные результаты для целочисленных значений (GH 11376)

  • Ошибка в pd.eval где унарные операции в списке вызывают ошибку (GH 11235)

  • Ошибка в squeeze() с массивами нулевой длины (GH 11230, GH 8999)

  • Ошибка в describe() удаление имён столбцов для иерархических индексов (GH 11517)

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

  • Ошибка в .to_csv() когда передаётся смесь целочисленных и строковых имён столбцов в качестве columns параметр (GH 11637)

  • Ошибка при индексации с range, (GH 11652)

  • Ошибка в определении скаляров numpy и сохранении типа данных при установке столбцов (GH 11638)

  • Ошибка в to_sql использование имен столбцов в Unicode вызывает UnicodeEncodeError с (GH 11431).

  • Исправлена регрессия в установке xticks в plot (GH 11529).

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

  • Исправить проблемы построения графиков при наличии простых Axes экземпляры вместо SubplotAxes (GH 11520, GH 11556).

  • Ошибка в DataFrame.to_latex() создает дополнительное правило, когда header=False (GH 7124)

  • Ошибка в df.groupby(...).apply(func) когда функция возвращает Series содержащий новый столбец типа даты/времени (GH 11324)

  • Ошибка в pandas.json когда загружаемый файл большой (GH 11344)

  • Ошибки в to_excel с дублирующимися столбцами (GH 11007, GH 10982, GH 10970)

  • Исправлена ошибка, препятствовавшая созданию пустой серии типа данных datetime64[ns, tz] (GH 11245).

  • Ошибка в read_excel с MultiIndex, содержащим целые числа (GH 11317)

  • Ошибка в to_excel с openpyxl 2.2+ и слиянием (GH 11408)

  • Ошибка в DataFrame.to_dict() создаёт np.datetime64 объект вместо Timestamp когда в данных присутствует только datetime (GH 11327)

  • Ошибка в DataFrame.corr() вызывает исключение при вычислении корреляции Кендалла для DataFrame с булевыми и не булевыми столбцами (GH 11560)

  • Ошибка в ошибке времени компоновки, вызванной C inline функции на FreeBSD 10+ (с clang) (GH 10510)

  • Ошибка в DataFrame.to_csv в передаче аргументов для форматирования MultiIndexes, включая date_format (GH 7791)

  • Ошибка в DataFrame.join() с how='right' производя TypeError (GH 11519)

  • Ошибка в Series.quantile с пустыми результатами списка имеет Index с object тип данных (GH 11588)

  • Ошибка в pd.merge приводит к пустому Int64Index вместо Index(dtype=object) когда результат слияния пуст (GH 11588)

  • Ошибка в Categorical.remove_unused_categories при наличии NaN значения (GH 11599)

  • Ошибка в DataFrame.to_sparse() теряет имена столбцов для MultiIndex (GH 11600)

  • Ошибка в DataFrame.round() с неуникальным индексом столбцов, вызывающее фатальную ошибку Python (GH 11611)

  • Ошибка в DataFrame.round() с decimals неуникальный индексированный Series, создающий дополнительные столбцы (GH 11618)

Участники#

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

  • Александр Дрозд +

  • Alex Chase +

  • Anthonios Partheniou

  • BrenBarn +

  • Brian J. McGuirk +

  • Chris

  • Christian Berendt +

  • Кристиан Перес +

  • Cody Piersall +

  • Эксперт по данным и коду, экспериментирующий с кодом на данных

  • DrIrv +

  • Evan Wright

  • Guillaume Gay

  • Hamed Saljooghinejad +

  • Iblis Lin +

  • Jake VanderPlas

  • Ян Шульц

  • Jean-Mathieu Deschenes +

  • Jeff Reback

  • Джимми Каллин +

  • Joris Van den Bossche

  • K.-Michael Aye

  • Ka Wo Chen

  • Loïc Séguin-C +

  • Luo Yicheng +

  • Magnus Jöud +

  • Manuel Leonhardt +

  • Мэттью Гилберт

  • Maximilian Roos

  • Michael +

  • Nicholas Stahl +

  • Nicolas Bonnotte +

  • Pastafarianist +

  • Петра Чонг +

  • Phil Schaf +

  • Philipp A +

  • Rob deCarvalho +

  • Roman Khomenko +

  • Rémy Léone +

  • Sebastian Bank +

  • Sinhrks

  • Stephan Hoyer

  • Thierry Moisan

  • Tom Augspurger

  • Tux1 +

  • Varun +

  • Wieland Hoffmann +

  • Winterflower

  • Yoav Ram +

  • Younggun Kim

  • Zeke +

  • ajcr

  • azuranski +

  • behzad nouri

  • cel4

  • emilydolson +

  • hironow +

  • лексический

  • llllllllll +

  • rockg

  • silentquasar +

  • sinhrks

  • taeold +