Версия 0.15.2 (12 декабря 2014 г.)#

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

Изменения API#

  • Индексирование в MultiIndex за пределами глубины лексической сортировки теперь поддерживается, хотя лексически отсортированный индекс будет иметь лучшую производительность. (GH 2646)

    In [1]: df = pd.DataFrame({'jim':[0, 0, 1, 1],
       ...:                    'joe':['x', 'x', 'z', 'y'],
       ...:                    'jolie':np.random.rand(4)}).set_index(['jim', 'joe'])
       ...:
    
    In [2]: df
    Out[2]:
                jolie
    jim joe
    0   x    0.126970
        x    0.966718
    1   z    0.260476
        y    0.897237
    
    [4 rows x 1 columns]
    
    In [3]: df.index.lexsort_depth
    Out[3]: 1
    
    # in prior versions this would raise a KeyError
    # will now show a PerformanceWarning
    In [4]: df.loc[(1, 'z')]
    Out[4]:
                jolie
    jim joe
    1   z    0.260476
    
    [1 rows x 1 columns]
    
    # lexically sorting
    In [5]: df2 = df.sort_index()
    
    In [6]: df2
    Out[6]:
                jolie
    jim joe
    0   x    0.126970
        x    0.966718
    1   y    0.897237
        z    0.260476
    
    [4 rows x 1 columns]
    
    In [7]: df2.index.lexsort_depth
    Out[7]: 2
    
    In [8]: df2.loc[(1,'z')]
    Out[8]:
                jolie
    jim joe
    1   z    0.260476
    
    [1 rows x 1 columns]
    
  • Ошибка в unique для Series с category dtype, который возвращал все категории независимо от того, были ли они "использованы" или нет (см. GH 8559 для обсуждения). Предыдущее поведение заключалось в возврате всех категорий:

    In [3]: cat = pd.Categorical(['a', 'b', 'a'], categories=['a', 'b', 'c'])
    
    In [4]: cat
    Out[4]:
    [a, b, a]
    Categories (3, object): [a < b < c]
    
    In [5]: cat.unique()
    Out[5]: array(['a', 'b', 'c'], dtype=object)
    

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

    In [1]: cat = pd.Categorical(['a', 'b', 'a'], categories=['a', 'b', 'c'])
    
    In [2]: cat.unique()
    Out[2]: 
    ['a', 'b']
    Categories (3, object): ['a', 'b', 'c']
    
  • Series.all и Series.any теперь поддерживают level и skipna параметры. Series.all, Series.any, Index.all, и Index.any больше не поддерживает out и keepdims параметры, которые существовали для совместимости с ndarray. Различные типы индексов больше не поддерживают all и any функции агрегации и теперь вызовет TypeError. (GH 8302).

  • Разрешить сравнение на равенство Series с категориальным типом данных и типом object; ранее это вызывало TypeError (GH 8938)

  • Ошибка в NDFrame: конфликтующие имена атрибутов/столбцов теперь ведут себя последовательно между получением и установкой. Ранее, когда и столбец, и атрибут с именем y существовал, data.y вернул бы атрибут, в то время как data.y = z обновит колонку (GH 8994)

    In [3]: data = pd.DataFrame({'x': [1, 2, 3]})
    
    In [4]: data.y = 2
    
    In [5]: data['y'] = [2, 4, 6]
    
    In [6]: data
    Out[6]: 
       x  y
    0  1  2
    1  2  4
    2  3  6
    
    [3 rows x 2 columns]
    
    # this assignment was inconsistent
    In [7]: data.y = 5
    

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

    In [6]: data.y
    Out[6]: 2
    
    In [7]: data['y'].values
    Out[7]: array([5, 5, 5])
    

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

    In [8]: data.y
    Out[8]: 5
    
    In [9]: data['y'].values
    Out[9]: array([2, 4, 6])
    
  • Timestamp('now') теперь эквивалентно Timestamp.now() в том, что возвращает локальное время, а не UTC. Также, Timestamp('today') теперь эквивалентно Timestamp.today() и оба имеют tz как возможный аргумент. (GH 9000)

  • Исправлена поддержка отрицательного шага для срезов на основе меток (GH 8753)

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

    In [1]: s = pd.Series(np.arange(3), ['a', 'b', 'c'])
    Out[1]:
    a    0
    b    1
    c    2
    dtype: int64
    
    In [2]: s.loc['c':'a':-1]
    Out[2]:
    c    2
    dtype: int64
    

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

    In [10]: s = pd.Series(np.arange(3), ['a', 'b', 'c'])
    
    In [11]: s.loc['c':'a':-1]
    Out[11]: 
    c    2
    b    1
    a    0
    Length: 3, dtype: int64
    

Улучшения#

Categorical улучшения:

  • Добавлена возможность экспорта категориальных данных в Stata (GH 8633). См. здесь для ограничений категориальных переменных, экспортируемых в файлы данных Stata.

  • Добавлен флаг order_categoricals to StataReader и read_stata для выбора, упорядочивать ли импортированные категориальные данные (GH 8836). См. здесь для получения дополнительной информации об импорте категориальных переменных из файлов данных Stata.

  • Добавлена возможность экспорта категориальных данных в/из HDF5 (GH 7621). Запросы работают так же, как если бы это был массив объектов. Однако, category данные с типом dtype хранятся более эффективным способом. См. здесь для примера и предостережений относительно предыдущих версий pandas.

  • Добавлена поддержка для searchsorted() на Categorical класс (GH 8420).

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

  • Добавлена возможность указать SQL-тип столбцов при записи DataFrame в базу данных (GH 8778). Например, указание использовать sqlalchemy String тип вместо стандартного Text тип для строковых столбцов:

    from sqlalchemy.types import String
    data.to_sql('data_dtype', engine, dtype={'Col_1': String})  # noqa F821
    
  • Series.all и Series.any теперь поддерживают level и skipna параметры (GH 8302):

    >>> s = pd.Series([False, True, False], index=[0, 0, 1])
    >>> s.any(level=0)
    0     True
    1    False
    dtype: bool
    
  • Panel теперь поддерживает all и any функции агрегации. (GH 8302):

    >>> p = pd.Panel(np.random.rand(2, 5, 4) > 0.1)
    >>> p.all()
           0      1      2     3
    0   True   True   True  True
    1   True  False   True  True
    2   True   True   True  True
    3  False   True  False  True
    4   True   True   True  True
    
  • Добавлена поддержка для utcfromtimestamp(), fromtimestamp(), и combine() на Timestamp класс (GH 5351).

  • Добавлена Google Analytics (pandas.io.ga) базовая документация (GH 8835). См. здесь.

  • Timedelta арифметические операции возвращают NotImplemented в неизвестных случаях, позволяя расширения пользовательскими классами (GH 8813).

  • Timedelta теперь поддерживает арифметические операции с numpy.ndarray объекты соответствующего типа данных (только для numpy 1.8 или новее) (GH 8884).

  • Добавлен Timedelta.to_timedelta64() метод в публичный API (GH 8884).

  • Добавлен gbq.generate_bq_schema() функцию в модуль gbq (GH 8325).

  • Series теперь работает с объектами map так же, как с генераторами (GH 8909).

  • Добавлен контекстный менеджер для HDFStore для автоматического закрытия (GH 8791).

  • to_datetime получает exact ключевое слово, позволяющее формату не требовать точного совпадения с предоставленной строкой формата (если его False). exact по умолчанию True (означает, что точное сопоставление по-прежнему используется по умолчанию) (GH 8904)

  • Добавлен axvlines логическая опция для функции parallel_coordinates plot, определяет, будут ли печататься вертикальные линии, по умолчанию True

  • Добавлена возможность чтения нижних колонтитулов таблиц в read_html (GH 8552)

  • to_sql теперь определяет типы данных не-NA значений для столбцов, которые содержат NA значения и имеют dtype object (GH 8778).

Производительность#

  • Снижение использования памяти, когда skiprows является целым числом в read_csv (GH 8681)

  • Ускорение производительности для to_datetime преобразования с переданным format=должны быть включены в старые категории. Значения, которые были в удаленных категориях, будут установлены в NaN exact=False (GH 8904)

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

  • Ошибка в объединении Series с category dtype, которые приводили к object. (GH 8641)

  • Ошибка в операции Timestamp-Timestamp, не возвращающей тип Timedelta, и операциях с датами с часовыми поясами (GH 8865)

  • Исправлено несоответствие исключений часовых поясов (либо работа с tz и None, либо несовместимые часовые пояса), теперь будет возвращаться TypeError вместо ValueError (только несколько крайних случаев), (GH 8865)

  • Ошибка при использовании pd.Grouper(key=...) без уровня/оси или только с уровнем (GH 8795, GH 8866)

  • Сообщить об TypeError когда переданы недопустимые/отсутствующие параметры в groupby (GH 8015)

  • Ошибка при упаковке pandas с py2app/cx_Freeze (GH 8602, GH 8831)

  • Ошибка в groupby сигнатуры, которые не включали *args или **kwargs (GH 8733).

  • io.data.Options теперь вызывает RemoteDataError когда даты истечения недоступны от Yahoo и когда не получены данные от Yahoo (GH 8761), (GH 8783).

  • Неясное сообщение об ошибке при разборе csv при передаче dtype и names и разобранные данные имеют другой тип данных (GH 8833)

  • Ошибка при срезе MultiIndex с пустым списком и хотя бы одним булевым индексатором (GH 8781)

  • io.data.Options теперь вызывает RemoteDataError когда даты истечения недоступны от Yahoo (GH 8761).

  • Timedelta kwargs теперь могут быть numpy ints и floats (GH 8757).

  • Исправлены несколько существующих ошибок для Timedelta арифметические операции и сравнения (GH 8813, GH 5963, GH 5436).

  • sql_schema теперь генерирует соответствующий диалект CREATE TABLE операторы (GH 8697)

  • slice строковый метод теперь учитывает шаг (GH 8754)

  • Ошибка в BlockManager где установка значений с разным типом нарушит целостность блока (GH 8850)

  • Ошибка в DatetimeIndex при использовании time объект как ключ (GH 8667)

  • Ошибка в merge где how='left' и sort=False не сохранит порядок левого фрейма (GH 7331)

  • Ошибка в MultiIndex.reindex где переиндексация на уровне не переупорядочивала метки (GH 4088)

  • Ошибка в некоторых операциях с часовыми поясами dateutil, проявляющаяся в dateutil 2.3 (GH 8639)

  • Регрессия в итерации DatetimeIndex с фиксированным/локальным смещением часового пояса (GH 8890)

  • Ошибка в to_datetime при разборе наносекунд с использованием %f формат (GH 8989)

  • io.data.Options теперь вызывает RemoteDataError когда даты истечения недоступны от Yahoo и когда не получены данные от Yahoo (GH 8761), (GH 8783).

  • Исправление: Размер шрифта устанавливался только на оси x при вертикальной ориентации или на оси y при горизонтальной. (GH 8765)

  • Исправлено деление на 0 при чтении больших csv-файлов в python 3 (GH 8621)

  • Ошибка при выводе MultiIndex с to_html,index=False что добавляло бы дополнительный столбец (GH 8452)

  • Импортированные категориальные переменные из файлов Stata сохраняют порядковую информацию в исходных данных (GH 8836).

  • Определено .size атрибут через NDFrame объектов для обеспечения совместимости с numpy >= 1.9.1; содержит ошибки с np.array_split (GH 8846)

  • Пропустить тестирование гистограмм для matplotlib <= 1.2 (GH 8648).

  • Ошибка, где get_data_google возвращаемые типы данных объектов (GH 3995)

  • Ошибка в DataFrame.stack(..., dropna=False) когда DataFrame columns является MultiIndex чей labels не ссылаются на все его levels. (GH 8844)

  • Ошибка в том, что контекст Option применялся на __enter__ (GH 8514)

  • Ошибка в resample, вызывающая ValueError при передискретизации за несколько дней и последнее смещение не рассчитывается с начала диапазона (GH 8683)

  • Ошибка, где DataFrame.plot(kind='scatter') ошибка при проверке, находится ли np.array в DataFrame (GH 8852)

  • Ошибка в pd.infer_freq/DataFrame.inferred_freq что препятствовало правильному определению частоты менее суток, когда индекс содержал дни перехода на летнее время (GH 8772).

  • Ошибка, при которой имя индекса всё ещё использовалось при построении графика серии с use_index=False (GH 8558).

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

  • Ошибка в MultiIndex где __contains__ возвращает неверный результат, если индекс не отсортирован лексикографически или не уникален (GH 7724)

  • ОШИБКА CSV: исправлена проблема с конечным пробелом в пропущенных строках, (GH 8679), (GH 8661), (GH 8983)

  • Регрессия в Timestamp не обрабатывает обозначение зоны 'Z' для UTC (GH 8771)

  • Ошибка в StataWriter производит запись строк длиной 244 символа независимо от фактического размера (GH 8969)

  • Исправлена ошибка ValueError, возникавшая при cummin/cummax, когда Series datetime64 содержит NaT. (GH 8965)

  • Ошибка в DataReader возвращает тип object, если есть пропущенные значения (GH 8980)

  • Ошибка при построении графиков, если был включен sharex и индекс был временным рядом, показывала метки на нескольких осях (GH 3964).

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

  • Ошибка в построении графика массива, подобного периоду (GH 9012)

Участники#

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

  • Aaron Staple

  • Angelos Evripiotis +

  • Artemy Kolchinsky

  • Бенуа Пуанте +

  • Brian Jacobowski +

  • Charalampos Papaloizou +

  • Chris Warth +

  • David Stephens

  • Fabio Zanini +

  • Francesc Via +

  • Henry Kleynhans +

  • Jake VanderPlas +

  • Ян Шульц

  • Jeff Reback

  • Jeff Tratner

  • Joris Van den Bossche

  • Кевин Шеппард

  • Мэтт Саггит +

  • Мэтью Бретт

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

  • Руперт Томпсон +

  • Скотт Э. Ласли +

  • Stephan Hoyer

  • Stephen Simmons +

  • Sylvain Corlay +

  • Thomas Grainger +

  • Tiago Antao +

  • Tom Augspurger

  • Trent Hauck

  • Victor Chaves +

  • Victor Salgado +

  • Vikram Bhandoh +

  • WANG Aiyong

  • Will Holmgren +

  • behzad nouri

  • broessli +

  • charalampos papaloizou +

  • immerrr

  • jnmclarty

  • jreback

  • mgilbert +

  • onesandzeroes

  • peadarcoyle +

  • rockg

  • seth-p

  • sinhrks

  • unutbu

  • wavedatalab +

  • Åsmund Hjulstad +