Версия 0.8.0 (29 июня 2012)#

Это основной выпуск с версии 0.7.3 и включает обширную работу по обработке временных рядов и инфраструктуре обработки, а также множество новых функций по всей библиотеке. Он включает более 700 коммитов от более чем 20 различных авторов. Большинство пользователей pandas 0.7.3 и более ранних версий не должны столкнуться с проблемами при обновлении, но из-за перехода на тип данных NumPy datetime64 могут возникнуть некоторые ошибки и несовместимости. Оставшиеся несовместимости будут исправлены как можно скорее в выпуске 0.8.1, если это необходимо. См. полные заметки о выпуске или трекер задач на GitHub для полного списка.

Поддержка неуникальных индексов#

Все объекты теперь могут работать с неуникальными индексами. Операции выравнивания данных / объединения работают в соответствии с семантикой SQL-объединений (включая, если применимо, дублирование индексов в объединениях "многие ко многим")

Тип данных NumPy datetime64 и зависимость от версии 1.6#

Временные ряды теперь представлены с использованием типа данных datetime64 из NumPy; таким образом, pandas 0.8.0 теперь требует как минимум NumPy 1.6. Протестировано и подтверждено, что работает с версией в разработке (1.7+) NumPy, которая включает некоторые значительные изменения в пользовательском API. NumPy 1.6 также имеет ряд ошибок, связанных с данными с наносекундным разрешением, поэтому я рекомендую избегать функций API datetime64 NumPy 1.6 (хотя они и ограничены) и взаимодействовать с этими данными только через интерфейс, предоставляемый pandas.

Смотрите конец раздела 0.8.0 для руководства по "переносу", перечисляющего потенциальные проблемы для пользователей, мигрирующих с устаревших кодовых баз из pandas 0.7 или более ранних версий на 0.8.0.

Исправления ошибок для серии 0.7.x для пользователей устаревшего NumPy < 1.6 будут предоставляться по мере их возникновения. Дальнейшая разработка в 0.7.x, кроме исправления ошибок, не планируется.

Изменения и улучшения в работе с временными рядами#

Примечание

С этим выпуском пользователи legacy scikits.timeseries должны иметь возможность перенести свой код для использования pandas.

Примечание

См. документация для обзора API временных рядов pandas.

  • Новое представление datetime64 ускоряет операции соединения и выравнивание данных, уменьшает использование памяти, и значительно улучшить производительность сериализации / десериализации по сравнению с datetime.datetime

  • Высокая производительность и гибкость resample метод для преобразования из высокой в низкую и из низкой в высокую частоту. Поддерживает интерполяцию, пользовательские функции агрегации и контроль над определением интервалов и маркировкой результатов. Также реализован набор высокопроизводительных функций ресемплинга на основе Cython/C (включая Open-High-Low-Close).

  • Переработка псевдонимы частоты и поддержка для сокращения частоты например, '15min' или '1h30min'

  • Новый Класс DatetimeIndex поддерживает как фиксированную частоту, так и нерегулярные временные ряды. Заменяет устаревший класс DateRange

  • Новый PeriodIndex и Period классы для представления временные промежутки и выполнение логика календаря, включая 12 fiscal quarterly frequencies . Это частичный порт и существенное улучшение элементов кодовой базы scikits.timeseries. Поддержка преобразования между PeriodIndex и DatetimeIndex

  • Новый тип данных Timestamp является подклассом datetime.datetime, предоставляя тот же интерфейс, но позволяя работать с данными с наносекундным разрешением. Также предоставляет лёгкое преобразование часовых поясов.

  • Улучшенная поддержка для часовые пояса. Добавлен tz_convert и tz_localize методы для TimeSeries и DataFrame. Все метки времени хранятся как UTC; Метки времени из объектов DatetimeIndex с установленным часовым поясом будут локализованы в местное время. Преобразования часовых поясов, следовательно, практически бесплатны. Пользователям теперь нужно знать очень мало о библиотеке pytz; требуются только названия часовых поясов в виде строк. Метки времени с учётом часового пояса равны тогда и только тогда, когда их UTC-метки совпадают. Операции между временными рядами с учётом часового пояса с разными часовыми поясами приведут к временному ряду с индексом в UTC.

  • Временные ряды удобства строкового индексирования / сокращения: срезы лет, года и месяца, и индексация значений строками

  • Улучшенные временные ряды построение графиков; адаптация кода построения графиков на основе matplotlib из scikits.timeseries

  • Новый date_range, bdate_range, и period_range фабричные функции

  • Устойчивый определение частоты функция infer_freq и inferred_freq свойство DatetimeIndex с возможностью вывода частоты при создании DatetimeIndex

  • функция to_datetime эффективно разбирает массив строк в DatetimeIndex. DatetimeIndex преобразует массив или список строк в datetime64

  • Оптимизировано поддержка данных типа datetime64 в столбцах Series и DataFrame

  • Новый тип NaT (Not-a-Time) для представления NA в массивах временных меток

  • Оптимизирован Series.asof для поиска «на момент» значения для массивов меток времени

  • Объекты смещения даты Milli, Micro, Nano

  • Можно индексировать временные ряды объектами datetime.time для выбора всех данных в определенное время суток (TimeSeries.at_time) или между двумя временами (TimeSeries.between_time)

  • Добавить tshift метод для опережения/отставания с использованием частоты (если есть) индекса, в отличие от наивного опережения/отставания с использованием shift

Другие новые функции#

  • Новый cut и qcut функции (например, функция cut в R) для вычисления категориальной переменной из непрерывной переменной путем разбиения значений либо на основе значений (cut) или квантиль-основанный (qcut) бины

  • Переименовать Factor to Categorical и добавить ряд функций для удобства использования

  • Добавить limit аргумент для fillna/reindex

  • Более гибкое применение нескольких функций в GroupBy, можно передавать список кортежей (имя, функция) для получения результата в определённом порядке с заданными именами

  • Добавить гибкий replace метод для эффективной замены значений

  • Улучшенный read_csv/read_table для чтения временных рядов и преобразования нескольких столбцов в даты

  • Добавить комментарии опция для функций парсера: read_csv и т.д.

  • Добавить dayfirst опция для функций парсера для разбора международных дат в формате ДД/ММ/ГГГГ

  • Разрешить пользователю указать CSV-ридер диалект для управления кавычками и т.д.

  • Обработка тысячи разделители в read_csv для улучшения разбора целых чисел.

  • Включить развёртывание нескольких уровней за один раз. Облегчить pivot_table ошибки (вводятся пустые столбцы)

  • Переход на хэш-таблицы на основе klib для индексирования; лучшая производительность и меньшее использование памяти по сравнению с dict Python

  • Добавлены оптимизированные функции GroupBy first, last, min, max и prod

  • Новый ordered_merge функция

  • Добавить гибкий сравнение методы экземпляра eq, ne, lt, gt и т.д. для DataFrame, Series

  • Улучшить scatter_matrix функция построения графика и добавление гистограммы или оценок плотности ядра к диагонали

  • Добавить 'kde' опция построения для графиков плотности

  • Поддержка преобразования DataFrame в R data.frame через rpy2

  • Улучшенная поддержка комплексных чисел в Series и DataFrame

  • Добавить pct_change метод для всех структур данных

  • Добавлена опция конфигурации max_colwidth для вывода DataFrame в консоли

  • Интерполировать Значения Series с использованием значений индекса

  • Можно выбрать несколько столбцов из GroupBy

  • Добавить update методы для Series/DataFrame для обновления значений на месте

  • Добавить any и all метод для DataFrame

Новые методы построения графиков#

import pandas as pd

fx = pd.read_pickle("data/fx_prices")
import matplotlib.pyplot as plt

Series.plot теперь поддерживает secondary_y опция:

plt.figure()

fx["FR"].plot(style="g")

fx["IT"].plot(style="k--", secondary_y=True)

Vytautas Jancauskas, участник GSOC 2012 года, добавил много новых типов графиков. Например, 'kde' является новой опцией:

s = pd.Series(
    np.concatenate((np.random.randn(1000), np.random.randn(1000) * 0.5 + 3))
)
plt.figure()
s.hist(density=True, alpha=0.2)
s.plot(kind="kde")

См. страница построения графиков для более подробной информации.

Другие изменения API#

  • Устаревание offset, time_rule, и timeRule имена аргументов в функциях временных рядов. Предупреждения будут выводиться до pandas 0.9 или 1.0.

Потенциальные проблемы переноса для пользователей pandas <= 0.7.3#

Основное изменение, которое может повлиять на вас в pandas 0.8.0, заключается в том, что индексы временных рядов используют datetime64 тип данных вместо dtype=object массивы встроенных типов Python datetime.datetime объекты. DateRange был заменён на DatetimeIndex но в остальном вел себя идентично. Однако, если у вас есть код, который преобразует DateRange или Index объекты, которые раньше содержали datetime.datetime значений в простые массивы NumPy, у вас могут скрываться ошибки в коде, использующем скалярные значения, потому что вы передаете управление NumPy:

In [1]: import datetime

In [2]: rng = pd.date_range("1/1/2000", periods=10)

In [3]: rng[5]
Out[3]: Timestamp('2000-01-06 00:00:00')

In [4]: isinstance(rng[5], datetime.datetime)
Out[4]: True

In [5]: rng_asarray = np.asarray(rng)

In [6]: scalar_val = rng_asarray[5]

In [7]: type(scalar_val)
Out[7]: numpy.datetime64

pandas Timestamp объект является подклассом datetime.datetime который имеет поддержку наносекунд ( nanosecond поле хранит наносекундное значение между 0 и 999). Оно должно напрямую подставляться в любой код, который использовал datetime.datetime значения ранее. Поэтому я рекомендую не приводить DatetimeIndex в обычные массивы NumPy.

Если у вас есть код, который требует массив datetime.datetime объектов, у вас есть несколько вариантов. Во-первых, astype(object) метод DatetimeIndex создает массив из Timestamp объектах:

In [8]: stamp_array = rng.astype(object)

In [9]: stamp_array
Out[9]: 
Index([2000-01-01 00:00:00, 2000-01-02 00:00:00, 2000-01-03 00:00:00,
       2000-01-04 00:00:00, 2000-01-05 00:00:00, 2000-01-06 00:00:00,
       2000-01-07 00:00:00, 2000-01-08 00:00:00, 2000-01-09 00:00:00,
       2000-01-10 00:00:00],
      dtype='object')

In [10]: stamp_array[5]
Out[10]: Timestamp('2000-01-06 00:00:00')

Чтобы получить массив правильных datetime.datetime объектов, используйте to_pydatetime method:

In [11]: dt_array = rng.to_pydatetime()

In [12]: dt_array
Out[12]: 
array([datetime.datetime(2000, 1, 1, 0, 0),
       datetime.datetime(2000, 1, 2, 0, 0),
       datetime.datetime(2000, 1, 3, 0, 0),
       datetime.datetime(2000, 1, 4, 0, 0),
       datetime.datetime(2000, 1, 5, 0, 0),
       datetime.datetime(2000, 1, 6, 0, 0),
       datetime.datetime(2000, 1, 7, 0, 0),
       datetime.datetime(2000, 1, 8, 0, 0),
       datetime.datetime(2000, 1, 9, 0, 0),
       datetime.datetime(2000, 1, 10, 0, 0)], dtype=object)

In [13]: dt_array[5]
Out[13]: datetime.datetime(2000, 1, 6, 0, 0)

matplotlib умеет обрабатывать datetime.datetime но не объекты Timestamp Хотя я рекомендую строить графики временных рядов с использованием TimeSeries.plot, вы можете использовать либо to_pydatetime или зарегистрируйте конвертер для типа Timestamp. См. документация matplotlib для получения дополнительной информации об этом.

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

В пользовательском API есть ошибки с единицей наносекунд datetime64 в NumPy 1.6. В частности, строковая версия массива показывает мусорные значения, а преобразование в dtype=object аналогично не работает.

In [14]: rng = pd.date_range("1/1/2000", periods=10)

In [15]: rng
Out[15]: 
DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04',
               '2000-01-05', '2000-01-06', '2000-01-07', '2000-01-08',
               '2000-01-09', '2000-01-10'],
              dtype='datetime64[ns]', freq='D')

In [16]: np.asarray(rng)
Out[16]: 
array(['2000-01-01T00:00:00.000000000', '2000-01-02T00:00:00.000000000',
       '2000-01-03T00:00:00.000000000', '2000-01-04T00:00:00.000000000',
       '2000-01-05T00:00:00.000000000', '2000-01-06T00:00:00.000000000',
       '2000-01-07T00:00:00.000000000', '2000-01-08T00:00:00.000000000',
       '2000-01-09T00:00:00.000000000', '2000-01-10T00:00:00.000000000'],
      dtype='datetime64[ns]')

In [17]: converted = np.asarray(rng, dtype=object)

In [18]: converted[5]
Out[18]: Timestamp('2000-01-06 00:00:00')

Поверьте мне: не паникуйте. Если вы используете NumPy 1.6 и ограничиваете взаимодействие с datetime64 значения в API pandas будут в порядке. Нет ничего плохого в типе данных (64-битное целое число внутри); вся важная обработка данных происходит в pandas и тщательно тестируется. Я настоятельно рекомендую вам не работают напрямую с массивами datetime64 в NumPy 1.6 и использовать только pandas API.

Поддержка неуникальных индексов: В последнем случае у вас может быть код внутри try:... catch: блок, который не выполнился из-за неуникальности индекса. Во многих случаях он больше не будет завершаться ошибкой (некоторые методы, такие как append все еще проверяет на уникальность, если не отключено). Однако не все потеряно: вы можете проверить index.is_unique и явно вызывает исключение, если это False или перейти в другую ветку кода.

Участники#

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

  • Adam Klein

  • Chang She

  • David Zaslavsky +

  • Eric Chlebek +

  • Jacques Kvam

  • Kamil Kisiel

  • Kelsey Jordahl +

  • Kieran O’Mahony +

  • Lorenzo Bolla +

  • Luca Beltrame

  • Marc Abramowitz +

  • Mark Wiebe +

  • Paddy Mullen +

  • Peng Yu +

  • Roy Hyunjin Han +

  • RuiDC +

  • Senthil Palanisami +

  • Skipper Seabold

  • Stefan van der Walt +

  • Takafumi Arakaki +

  • Томас Клуйвер

  • Vytautas Jancauskas +

  • Wes McKinney

  • Wouter Overmeire

  • Yaroslav Halchenko

  • thuske +

  • timmie +