Версия 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) биныПереименовать
FactortoCategoricalи добавить ряд функций для удобства использованияДобавить 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 +