Версия 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 строго основан на целочисленной позиции (от 0 to length-1 оси), вызовет IndexError когда запрошенные индексы выходят за пределы допустимого диапазона. Допустимые входные данные:

    • Целое число, например 5

    • Список или массив целых чисел [4, 3, 0]

    • Объект среза с целыми числами 1:7

    • Логический массив

    Подробнее см. Выбор по позиции

  • .ix поддерживает смешанный доступ по целым числам и меткам. В основном он основан на метках, но будет переходить к целочисленному позиционному доступу. .ix является наиболее общим и будет поддерживать любой из входных данных для .loc и .iloc, а также поддержка схем меток с плавающей точкой. .ix особенно полезен при работе со смешанными позиционными и меточными иерархическими индексами.

    При использовании целочисленных срезов с .ix имеют разное поведение в зависимости от того, интерпретируется ли срез как основанный на позиции или на метке, обычно лучше быть явным и использовать .iloc или .loc.

    Подробнее см. Расширенная индексация и Расширенная иерархическая.

Устаревшие методы выбора#

Начиная с версии 0.11.0, эти методы может будет устаревать в будущих версиях.

  • irow

  • icol

  • iget_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_hdf API, аналогичный read_csv/to_csv

      In [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'])
    >>> p
    
    Dimensions: 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 теперь имеет необязательные kwargs near и 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