Версия 0.11.0 (22 апреля 2013)#
Это основной выпуск с версии 0.10.1, включающий множество новых функций и улучшений, а также большое количество исправлений ошибок. Методы выбора данных получили значительные дополнения, и поддержка типов данных теперь полноценная. Также есть ряд важных изменений API, на которые опытным пользователям pandas следует обратить особое внимание.
В документации появился новый раздел, 10 минут с Pandas, в основном ориентировано на новых пользователей.
В документации появился новый раздел, Кулинарная книга, коллекция полезных рецептов в pandas (и мы хотим вкладов!).
Существует несколько библиотек, которые теперь Рекомендуемые зависимости
Варианты выбора#
Начиная с версии 0.11.0, выбор объектов получил ряд дополнений, запрошенных пользователями, чтобы поддерживать более явное индексирование на основе местоположения. pandas теперь поддерживает три типа многомерного индексирования.
.locстрого основано на метках, вызоветKeyErrorкогда элементы не найдены, допустимые входные данные:Одна метка, например
5или'a', (обратите внимание, что5интерпретируется как метка индекса. Это использование не целочисленная позиция вдоль индекса)Список или массив меток
['a', 'b', 'c']Объект среза с метками
'a':'f', (обратите внимание, что в отличие от обычных срезов Python, оба начало и конец включены!)Логический массив
Подробнее см. Выбор по метке
.ilocстрого основан на целочисленной позиции (от0tolength-1оси), вызоветIndexErrorкогда запрошенные индексы выходят за пределы допустимого диапазона. Допустимые входные данные:Целое число, например
5Список или массив целых чисел
[4, 3, 0]Объект среза с целыми числами
1:7Логический массив
Подробнее см. Выбор по позиции
.ixподдерживает смешанный доступ по целым числам и меткам. В основном он основан на метках, но будет переходить к целочисленному позиционному доступу..ixявляется наиболее общим и будет поддерживать любой из входных данных для.locи.iloc, а также поддержка схем меток с плавающей точкой..ixособенно полезен при работе со смешанными позиционными и меточными иерархическими индексами.При использовании целочисленных срезов с
.ixимеют разное поведение в зависимости от того, интерпретируется ли срез как основанный на позиции или на метке, обычно лучше быть явным и использовать.ilocили.loc.Подробнее см. Расширенная индексация и Расширенная иерархическая.
Устаревшие методы выбора#
Начиная с версии 0.11.0, эти методы может будет устаревать в будущих версиях.
irowicoliget_value
См. раздел Выбор по позиции для замен.
Типы данных#
Числовые типы данных будут распространяться и могут сосуществовать в DataFrames. Если тип данных передаётся (либо напрямую через dtype ключевое слово, переданное ndarray, или переданный Series, тогда он будет сохранён в операциях с DataFrame. Кроме того, различные числовые типы данных будут НЕ можно комбинировать. Следующий пример даст вам представление.
In [1]: df1 = pd.DataFrame(np.random.randn(8, 1), columns=['A'], dtype='float32')
In [2]: df1
Out[2]:
A
0 0.469112
1 -0.282863
2 -1.509058
3 -1.135632
4 1.212112
5 -0.173215
6 0.119209
7 -1.044236
In [3]: df1.dtypes
Out[3]:
A float32
dtype: object
In [4]: df2 = pd.DataFrame({'A': pd.Series(np.random.randn(8), dtype='float16'),
...: 'B': pd.Series(np.random.randn(8)),
...: 'C': pd.Series(range(8), dtype='uint8')})
...:
In [5]: df2
Out[5]:
A B C
0 -0.861816 -0.424972 0
1 -2.105469 0.567020 1
2 -0.494873 0.276232 2
3 1.072266 -1.087401 3
4 0.721680 -0.673690 4
5 -0.706543 0.113648 5
6 -1.040039 -1.478427 6
7 0.271973 0.524988 7
In [6]: df2.dtypes
Out[6]:
A float16
B float64
C uint8
dtype: object
# here you get some upcasting
In [7]: df3 = df1.reindex_like(df2).fillna(value=0.0) + df2
In [8]: df3
Out[8]:
A B C
0 -0.392704 -0.424972 0.0
1 -2.388332 0.567020 1.0
2 -2.003932 0.276232 2.0
3 -0.063367 -1.087401 3.0
4 1.933792 -0.673690 4.0
5 -0.879758 0.113648 5.0
6 -0.920830 -1.478427 6.0
7 -0.772263 0.524988 7.0
In [9]: df3.dtypes
Out[9]:
A float32
B float64
C float64
dtype: object
Преобразование типа данных#
Это приведение к наименьшему общему знаменателю, означающее, что вы получаете тип данных, который может вместить все типы
In [10]: df3.values.dtype
Out[10]: dtype('float64')
Преобразование
In [11]: df3.astype('float32').dtypes
Out[11]:
A float32
B float32
C float32
dtype: object
Смешанное преобразование
In [12]: df3['D'] = '1.'
In [13]: df3['E'] = '1'
In [14]: df3.convert_objects(convert_numeric=True).dtypes
Out[14]:
A float32
B float64
C float64
D float64
E int64
dtype: object
# same, but specific dtype conversion
In [15]: df3['D'] = df3['D'].astype('float16')
In [16]: df3['E'] = df3['E'].astype('int32')
In [17]: df3.dtypes
Out[17]:
A float32
B float64
C float64
D float16
E int32
dtype: object
Принудительное приведение дат (и установка NaT когда не является датой)
In [18]: import datetime
In [19]: s = pd.Series([datetime.datetime(2001, 1, 1, 0, 0), 'foo', 1.0, 1,
....: pd.Timestamp('20010104'), '20010105'], dtype='O')
....:
In [20]: s.convert_objects(convert_dates='coerce')
Out[20]:
0 2001-01-01
1 NaT
2 NaT
3 NaT
4 2001-01-04
5 2001-01-05
dtype: datetime64[ns]
Особенности типов данных#
Особенности платформы
Начиная с версии 0.11.0, создание DataFrame/Series будет использовать типы данных по умолчанию int64 и float64,
независимо от платформы. Это не является явным изменением по сравнению с более ранними версиями pandas. Если вы указываете
dtypes, они БУДЕТ должно соблюдаться, однако (GH 2837)
Все следующие варианты приведут к int64 dtypes
In [21]: pd.DataFrame([1, 2], columns=['a']).dtypes
Out[21]:
a int64
dtype: object
In [22]: pd.DataFrame({'a': [1, 2]}).dtypes
Out[22]:
a int64
dtype: object
In [23]: pd.DataFrame({'a': 1}, index=range(2)).dtypes
Out[23]:
a int64
dtype: object
Имейте в виду, что DataFrame(np.array([1,2])) БУДЕТ приводит к int32 на 32-битных платформах!
Особенности повышения типа данных
Выполнение операций индексирования над данными целочисленного типа может легко повысить тип данных. Тип данных входных данных будет сохранён в случаях, когда nans не вводятся.
In [24]: dfi = df3.astype('int32')
In [25]: dfi['D'] = dfi['D'].astype('int64')
In [26]: dfi
Out[26]:
A B C D E
0 0 0 0 1 1
1 -2 0 1 1 1
2 -2 0 2 1 1
3 0 -1 3 1 1
4 1 0 4 1 1
5 0 0 5 1 1
6 0 -1 6 1 1
7 0 0 7 1 1
In [27]: dfi.dtypes
Out[27]:
A int32
B int32
C int32
D int64
E int32
dtype: object
In [28]: casted = dfi[dfi > 0]
In [29]: casted
Out[29]:
A B C D E
0 NaN NaN NaN 1 1
1 NaN NaN 1.0 1 1
2 NaN NaN 2.0 1 1
3 NaN NaN 3.0 1 1
4 1.0 NaN 4.0 1 1
5 NaN NaN 5.0 1 1
6 NaN NaN 6.0 1 1
7 NaN NaN 7.0 1 1
In [30]: casted.dtypes
Out[30]:
A float64
B float64
C float64
D int64
E int32
dtype: object
В то время как типы данных float остаются неизменными.
In [31]: df4 = df3.copy()
In [32]: df4['A'] = df4['A'].astype('float32')
In [33]: df4.dtypes
Out[33]:
A float32
B float64
C float64
D float16
E int32
dtype: object
In [34]: casted = df4[df4 > 0]
In [35]: casted
Out[35]:
A B C D E
0 NaN NaN NaN 1.0 1
1 NaN 0.567020 1.0 1.0 1
2 NaN 0.276232 2.0 1.0 1
3 NaN NaN 3.0 1.0 1
4 1.933792 NaN 4.0 1.0 1
5 NaN 0.113648 5.0 1.0 1
6 NaN NaN 6.0 1.0 1
7 NaN 0.524988 7.0 1.0 1
In [36]: casted.dtypes
Out[36]:
A float32
B float64
C float64
D float16
E int32
dtype: object
Преобразование дат и времени#
Столбцы Datetime64[ns] в DataFrame (или Series) позволяют использовать np.nan для обозначения значения nan,
в дополнение к традиционному NaT, или не-время. Это позволяет удобно устанавливать nan универсальным способом.
Кроме того datetime64[ns] столбцы создаются по умолчанию при передаче объектов типа datetime (это изменение было введено в версии 0.10.1)
(GH 2809, GH 2810)
In [12]: df = pd.DataFrame(np.random.randn(6, 2), pd.date_range('20010102', periods=6),
....: columns=['A', ' B'])
....:
In [13]: df['timestamp'] = pd.Timestamp('20010103')
In [14]: df
Out[14]:
A B timestamp
2001-01-02 0.404705 0.577046 2001-01-03
2001-01-03 -1.715002 -1.039268 2001-01-03
2001-01-04 -0.370647 -1.157892 2001-01-03
2001-01-05 -1.344312 0.844885 2001-01-03
2001-01-06 1.075770 -0.109050 2001-01-03
2001-01-07 1.643563 -1.469388 2001-01-03
# datetime64[ns] out of the box
In [15]: df.dtypes.value_counts()
Out[15]:
float64 2
datetime64[s] 1
Name: count, dtype: int64
# use the traditional nan, which is mapped to NaT internally
In [16]: df.loc[df.index[2:4], ['A', 'timestamp']] = np.nan
In [17]: df
Out[17]:
A B timestamp
2001-01-02 0.404705 0.577046 2001-01-03
2001-01-03 -1.715002 -1.039268 2001-01-03
2001-01-04 NaN -1.157892 NaT
2001-01-05 NaN 0.844885 NaT
2001-01-06 1.075770 -0.109050 2001-01-03
2001-01-07 1.643563 -1.469388 2001-01-03
Преобразование Astype на datetime64[ns] to object, неявно преобразует NaT to np.nan
In [18]: import datetime
In [19]: s = pd.Series([datetime.datetime(2001, 1, 2, 0, 0) for i in range(3)])
In [20]: s.dtype
Out[20]: dtype('
In [21]: s[1] = np.nan
In [22]: s
Out[22]:
0 2001-01-02
1 NaT
2 2001-01-02
dtype: datetime64[ns]
In [23]: s.dtype
Out[23]: dtype('
In [24]: s = s.astype('O')
In [25]: s
Out[25]:
0 2001-01-02 00:00:00
1 NaT
2 2001-01-02 00:00:00
dtype: object
In [26]: s.dtype
Out[26]: dtype('O')
Изменения API#
Добавлен метод to_series() к индексам для облегчения создания индексаторов (GH 3275)
HDFStore
добавлен метод
select_columnдля выбора одного столбца из таблицы в виде Series.устарел
uniqueметод может быть воспроизведён с помощьюselect_column(key,column).unique()
min_itemsizeпараметр дляappendтеперь автоматически создаст data_columns для переданных ключей
Улучшения#
Улучшена производительность df.to_csv() до 10 раз в некоторых случаях. (GH 3059)
Numexpr теперь является Рекомендуемые зависимости, чтобы ускорить определённые типы числовых и булевых операций
Bottleneck теперь является Рекомендуемые зависимостидля ускорения определённых типов
nanоперации
HDFStore
поддержка
read_hdf/to_hdfAPI, аналогичныйread_csv/to_csvIn [27]: df = pd.DataFrame({'A': range(5), 'B': range(5)}) In [28]: df.to_hdf('store.h5', key='table', append=True) In [29]: pd.read_hdf('store.h5', 'table', where=['index > 2']) Out[29]: A B 3 3 3 4 4 4предоставлять доступ к атрибутам через точку для
getиз хранилищ, напримерstore.df == store['df']новые ключевые слова
iterator=boolean, иchunksize=number_in_a_chunkпредоставляются для поддержки итерации поselectиselect_as_multiple(GH 3076)Теперь можно выбирать временные метки из неупорядоченный временные ряды аналогично ordered временной ряд (GH 2437)
Теперь можно выбирать строкой из DataFrame с датообразным индексом, аналогично Series (GH 3070)
In [30]: idx = pd.date_range("2001-10-1", periods=5, freq='M') In [31]: ts = pd.Series(np.random.rand(len(idx)), index=idx) In [32]: ts['2001'] Out[32]: 2001-10-31 0.117967 2001-11-30 0.702184 2001-12-31 0.414034 Freq: M, dtype: float64 In [33]: df = pd.DataFrame({'A': ts}) In [34]: df['2001'] Out[34]: A 2001-10-31 0.117967 2001-11-30 0.702184 2001-12-31 0.414034
Squeezeдля возможного удаления измерений длины 1 из объекта.>>> p = pd.Panel(np.random.randn(3, 4, 4), items=['ItemA', 'ItemB', 'ItemC'], ... major_axis=pd.date_range('20010102', periods=4), ... minor_axis=['A', 'B', 'C', 'D']) >>> pDimensions: 3 (items) x 4 (major_axis) x 4 (minor_axis) Items axis: ItemA to ItemC Major_axis axis: 2001-01-02 00:00:00 to 2001-01-05 00:00:00 Minor_axis axis: A to D >>> p.reindex(items=['ItemA']).squeeze() A B C D 2001-01-02 0.926089 -2.026458 0.501277 -0.204683 2001-01-03 -0.076524 1.081161 1.141361 0.479243 2001-01-04 0.641817 -0.185352 1.824568 0.809152 2001-01-05 0.575237 0.669934 1.398014 -0.399338 >>> p.reindex(items=['ItemA'], minor=['B']).squeeze() 2001-01-02 -2.026458 2001-01-03 1.081161 2001-01-04 -0.185352 2001-01-05 0.669934 Freq: D, Name: B, dtype: float64 В
pd.io.data.Options,
Исправлена ошибка при попытке получить данные за текущий месяц после истечения срока действия.
Теперь используется lxml для парсинга html вместо BeautifulSoup (lxml был быстрее).
Новые переменные экземпляра для коллов и путов автоматически создаются при вызове метода, который их создаёт. Это работает для текущего месяца, где переменные экземпляра просто
callsиputs. Также работает для будущих месяцев экспирации и сохраняет переменную экземпляра какcallsMMYYилиputsMMYY, гдеMMYYявляются, соответственно, месяц и год истечения опциона.
Options.get_near_stock_priceтеперь позволяет пользователю указать месяц, для которого получить соответствующие данные опционов.
Options.get_forward_dataтеперь имеет необязательные kwargsnearиabove_below. Это позволяет пользователю указать, хочет ли он получать только опережающие данные для опционов около текущей цены акции. Это просто получает данные из Options.get_near_stock_price вместо Options.get_xxx_data() (GH 2758).Информация о координатах курсора теперь отображается на графиках временных рядов.
добавлена опция
display.max_seq_itemsдля управления количеством элементов, выводимых на последовательность при форматированном выводе. (GH 2979)добавлена опция
display.chop_thresholdдля управления отображением малых числовых значений. (GH 2739)добавлена опция
display.max_info_rowsчтобы предотвратить вычисление verbose_info для фреймов свыше 1 млн строк (настраивается). (GH 2807, GH 2918)value_counts() теперь принимает аргумент "normalize" для нормализованных гистограмм. (GH 2710).
DataFrame.from_records теперь принимает не только словари, но и любой экземпляр ABC collections.Mapping.
добавлена опция
display.mpl_styleпредоставляя более изящный визуальный стиль для графиков. Основано на https://gist.github.com/huyng/816622 (GH 3075).Обрабатывать булевы значения как целые числа (значения 1 и 0) для числовых операций. (GH 2641)
to_html() теперь принимает необязательный аргумент "escape" для управления экранированием зарезервированных символов HTML (включено по умолчанию) и экранирует
&, в дополнение к<и>. (GH 2919)
См. полные заметки о выпуске или трекер задач на GitHub для полного списка.
Участники#
Всего 50 человек внесли патчи в этот выпуск. Люди со знаком «+» рядом с именами внесли патч впервые.
Adam Greenhall +
Alvaro Tejero-Cantero +
Andy Hayden
Brad Buran +
Chang She
Chapman Siu +
Chris Withers +
Christian Geier +
Кристофер Уилан
Damien Garaud
Dan Birken
Дэн Дэвисон +
Dieter Vandenbussche
Dražen Lučanin +
Dražen Lučanin +
Garrett Drapala
Илья Полосухин +
James Casbon +
Jeff Reback
Jeremy Wagner +
Jonathan Chambers +
K.-Michael Aye
Karmel Allison +
Loïc Estève +
Nicholaus E. Halecky +
Peter Prettenhofer +
Phillip Cloud +
Robert Gieseke +
Skipper Seabold
Спенсер Лайон
Стивен Лин +
Thierry Moisan +
Томас Клуйвер
Tim Akinbo +
Vytautas Jancauskas
Витаутас Янчаускас +
Wes McKinney
Уилл Фернасс +
Wouter Overmeire
anomrake +
davidjameshumphreys +
dengemann +
dieterv77 +
jreback
lexual +
stephenwlin +
thauck +
vytas +
waitingkuo +
y-p