Версия 0.14.0 (31 мая 2014)#

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

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

В версии 0.14.0 все NDFrame контейнеры на основе индекса подверглись значительной внутренней рефакторизации. До этого каждый блок однородных данных имел свои собственные метки, и требовалась особая осторожность, чтобы поддерживать их синхронизацию с метками родительского контейнера. Это не должно иметь видимых изменений в поведении пользователя/API (GH 6745)

Изменения API#

  • read_excel использует 0 как лист по умолчанию (GH 6573)

  • iloc теперь будет принимать индексаторы срезов, выходящие за границы, например, значение, превышающее длину индексируемого объекта. Они будут исключены. Это сделает pandas более соответствующим индексации python/numpy значений, выходящих за границы. Отдельный индексатор, выходящий за границы и уменьшающий размерность объекта, по-прежнему вызовет IndexError (GH 6296, GH 6299). Это может привести к пустой оси (например, возврату пустого DataFrame)

    In [1]: dfl = pd.DataFrame(np.random.randn(5, 2), columns=list('AB'))
    
    In [2]: dfl
    Out[2]: 
              A         B
    0  0.469112 -0.282863
    1 -1.509059 -1.135632
    2  1.212112 -0.173215
    3  0.119209 -1.044236
    4 -0.861849 -2.104569
    
    [5 rows x 2 columns]
    
    In [3]: dfl.iloc[:, 2:3]
    Out[3]: 
    Empty DataFrame
    Columns: []
    Index: [0, 1, 2, 3, 4]
    
    [5 rows x 0 columns]
    
    In [4]: dfl.iloc[:, 1:3]
    Out[4]: 
              B
    0 -0.282863
    1 -1.135632
    2 -0.173215
    3 -1.044236
    4 -2.104569
    
    [5 rows x 1 columns]
    
    In [5]: dfl.iloc[4:6]
    Out[5]: 
              A         B
    4 -0.861849 -2.104569
    
    [1 rows x 2 columns]
    

    Это выборки за пределами допустимого диапазона

    >>> dfl.iloc[[4, 5, 6]]
    IndexError: positional indexers are out-of-bounds
    
    >>> dfl.iloc[:, 4]
    IndexError: single positional indexer is out-of-bounds
    
  • Срезы с отрицательными значениями start, stop и step лучше обрабатывают крайние случаи (GH 6531):

    • df.iloc[:-len(df)] теперь пуст

    • df.iloc[len(df)::-1] теперь перечисляет все элементы в обратном порядке

  • The DataFrame.interpolate() ключевое слово downcast значение по умолчанию изменено с infer to None. Это сделано для сохранения исходного dtype, если явно не запрошено иное (GH 6290).

  • При преобразовании датафрейма в HTML раньше возвращалось Empty DataFrame. Этот особый случай был удален, вместо этого возвращается заголовок с именами столбцов (GH 6062).

  • Series и Index теперь внутренне используют больше общих операций, например factorize(),nunique(),value_counts() теперь поддерживаются на Index типов также. The Series.weekday свойство is удалено из Series для согласованности API. Использование DatetimeIndex/PeriodIndex метод на Series теперь будет вызывать TypeError. (GH 4551, GH 4056, GH 5519, GH 6380, GH 7206).

  • Добавить is_month_start, is_month_end, is_quarter_start, is_quarter_end, is_year_start, is_year_end аксессоры для DateTimeIndex / Timestamp которые возвращают булев массив, указывающий, находятся ли метки времени в начале/конце месяца/квартала/года, определённого частотой DateTimeIndex / Timestamp (GH 4565, GH 6998)

  • Использование локальных переменных изменилось в pandas.eval()/DataFrame.eval()/DataFrame.query() (GH 5987). Для DataFrame методы, две вещи изменились

    • Имена столбцов теперь имеют приоритет над локальными переменными

    • Локальные переменные должны быть указаны явно. Это означает, что даже если у вас есть локальная переменная, которая не столбец, вы все равно должны ссылаться на него с помощью '@' префикс.

    • Вы можете использовать выражение вида df.query('@a < a') без жалоб от pandas о неоднозначности названия a.

    • Верхнеуровневый pandas.eval() функция не позволяет использовать '@' префикс и предоставляет вам сообщение об ошибке, сообщающее об этом.

    • NameResolutionError был удалён, так как больше не нужен.

  • Определить и задокументировать порядок имён столбцов и индексов в query/eval (GH 6676)

  • concat теперь будет объединять смешанные Series и DataFrames, используя имя Series или нумерацию столбцов по мере необходимости (GH 2385). См. документация

  • Операции срезов и расширенного/булевого индексирования на Index классы, а также Index.delete() и Index.drop() методы больше не будут изменять тип результирующего индекса (GH 6440, GH 7040)

    In [6]: i = pd.Index([1, 2, 3, 'a', 'b', 'c'])
    
    In [7]: i[[0, 1, 2]]
    Out[7]: Index([1, 2, 3], dtype='object')
    
    In [8]: i.drop(['a', 'b', 'c'])
    Out[8]: Index([1, 2, 3], dtype='object')
    

    Ранее указанная операция возвращала Int64Index. Если вы хотите сделать это вручную, используйте Index.astype()

    In [9]: i[[0, 1, 2]].astype(np.int_)
    Out[9]: Index([1, 2, 3], dtype='int64')
    
  • set_index больше не преобразует MultiIndex в Index кортежей. Например, старое поведение возвращало Index в этом случае (GH 6459):

    # Old behavior, casted MultiIndex to an Index
    In [10]: tuple_ind
    Out[10]: Index([('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd')], dtype='object')
    
    In [11]: df_multi.set_index(tuple_ind)
    Out[11]: 
                   0         1
    (a, c)  0.471435 -1.190976
    (a, d)  1.432707 -0.312652
    (b, c) -0.720589  0.887163
    (b, d)  0.859588 -0.636524
    
    [4 rows x 2 columns]
    
    # New behavior
    In [12]: mi
    Out[12]: 
    MultiIndex([('a', 'c'),
                ('a', 'd'),
                ('b', 'c'),
                ('b', 'd')],
               )
    
    In [13]: df_multi.set_index(mi)
    Out[13]: 
                0         1
    a c  0.471435 -1.190976
      d  1.432707 -0.312652
    b c -0.720589  0.887163
      d  0.859588 -0.636524
    
    [4 rows x 2 columns]
    

    Это также применяется при передаче нескольких индексов в set_index:

    # Old output, 2-level MultiIndex of tuples
    In [14]: df_multi.set_index([df_multi.index, df_multi.index])
    Out[14]: 
                          0         1
    (a, c) (a, c)  0.471435 -1.190976
    (a, d) (a, d)  1.432707 -0.312652
    (b, c) (b, c) -0.720589  0.887163
    (b, d) (b, d)  0.859588 -0.636524
    
    [4 rows x 2 columns]
    
    # New output, 4-level MultiIndex
    In [15]: df_multi.set_index([df_multi.index, df_multi.index])
    Out[15]: 
                    0         1
    a c a c  0.471435 -1.190976
      d a d  1.432707 -0.312652
    b c b c -0.720589  0.887163
      d b d  0.859588 -0.636524
    
    [4 rows x 2 columns]
    
  • pairwise ключевое слово было добавлено к функциям статистических моментов rolling_cov, rolling_corr, ewmcov, ewmcorr, expanding_cov, expanding_corr для расчёта скользящих ковариационных и корреляционных матриц (GH 4950). См. Вычисление скользящих попарных ковариаций и корреляций в документации.

    In [1]: df = pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD'))
    
    In [4]: covs = pd.rolling_cov(df[['A', 'B', 'C']],
      ....:                       df[['B', 'C', 'D']],
      ....:                       5,
      ....:                       pairwise=True)
    
    
    In [5]: covs[df.index[-1]]
    Out[5]:
              B         C         D
    A  0.035310  0.326593 -0.505430
    B  0.137748 -0.006888 -0.005383
    C -0.006888  0.861040  0.020762
    
  • Series.iteritems() теперь ленивый (возвращает итератор вместо списка). Это было задокументированное поведение до версии 0.14. (GH 6760)

  • Добавлен nunique и value_counts функции для Index для подсчёта уникальных элементов. (GH 6734)

  • stack и unstack теперь вызывает ValueError когда level ключевое слово относится к неуникальному элементу в Index (ранее вызывал KeyError). (GH 6738)

  • удалить неиспользуемый аргумент order из Series.sort; args теперь в том же порядке, что и Series.order; добавить na_position аргумент для соответствия Series.order (GH 6847)

  • алгоритм сортировки по умолчанию для Series.order теперь quicksort, чтобы соответствовать Series.sort (и значения по умолчанию numpy)

  • добавить inplace ключевое слово для Series.order/sort чтобы сделать их обратными (GH 6859)

  • DataFrame.sort теперь помещает NaN в начало или конец сортировки в соответствии с na_position параметр. (GH 3917)

  • принимать TextFileReader в concat, что влияло на распространенную пользовательскую идиому (GH 6583), это была регрессия с 0.13.1

  • Добавлен factorize функции для Index и Series для получения индексатора и уникальных значений (GH 7090)

  • describe в DataFrame со смесью объектов Timestamp и строковых объектов возвращает другой Index (GH 7088). Ранее индекс непреднамеренно сортировался.

  • Арифметические операции с only bool типы данных теперь выдают предупреждение, указывающее, что они вычисляются в пространстве Python для +, -, и * операций и вызывает исключение для всех остальных (GH 7011, GH 6762, GH 7015, GH 7210)

    >>> x = pd.Series(np.random.rand(10) > 0.5)
    >>> y = True
    >>> x + y  # warning generated: should do x | y instead
    UserWarning: evaluating in Python space because the '+' operator is not
    supported by numexpr for the bool dtype, use '|' instead
    >>> x / y  # this raises because it doesn't make sense
    NotImplementedError: operator '/' not implemented for bool dtypes
    
  • В HDFStore, select_as_multiple всегда будет вызывать KeyError, когда ключ или селектор не найден (GH 6177)

  • df['col'] = value и df.loc[:,'col'] = value теперь полностью эквивалентны; ранее .loc не обязательно привел бы к приведению типа результирующего ряда (GH 6149)

  • dtypes и ftypes теперь возвращает серию с dtype=object на пустых контейнерах (GH 5740)

  • df.to_csv теперь будет возвращать строку с данными CSV, если не указан целевой путь или буфер (GH 6061)

  • pd.infer_freq() теперь вызовет TypeError если задан недопустимый Series/Index тип (GH 6407, GH 6463)

  • Кортеж, переданный в DataFame.sort_index будет интерпретироваться как уровни индекса, вместо требования списка кортежей (GH 4370)

  • все операции смещения теперь возвращают Timestamp типы (вместо datetime), бизнес/недельные частоты были некорректными (GH 4069)

  • to_excel теперь преобразует np.inf в строковое представление, настраиваемое с помощью inf_rep аргумент ключевого слова (Excel не имеет собственного представления inf ) (GH 6782)

  • Заменить pandas.compat.scipy.scoreatpercentile с numpy.percentile (GH 6810)

  • .quantile на datetime[ns] series теперь возвращает Timestamp вместо np.datetime64 объекты (GH 6810)

  • изменение AssertionError to TypeError для недопустимых типов, переданных в concat (GH 6583)

  • Вызвать TypeError когда DataFrame передается итератор в качестве data аргумент (GH 5357)

Отображение изменений#

  • Стандартный способ печати больших DataFrame изменился. DataFrame, превышающие max_rows и/или max_columns теперь отображаются в центрально усеченном представлении, согласованном с выводом pandas.Series (GH 5603).

    В предыдущих версиях DataFrame обрезался, как только достигались ограничения размерности, и многоточие (…) сигнализировало, что часть данных была обрезана.

    The previous look of truncate.

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

    The new look.
  • разрешить опцию 'truncate' для display.show_dimensions показывать размеры только если фрейм обрезан (GH 6547).

    Значение по умолчанию для display.show_dimensions теперь будет truncate. Это согласуется с тем, как Series отображает длину.

    In [16]: dfd = pd.DataFrame(np.arange(25).reshape(-1, 5),
       ....:                    index=[0, 1, 2, 3, 4],
       ....:                    columns=[0, 1, 2, 3, 4])
       ....: 
    
    # show dimensions since this is truncated
    In [17]: with pd.option_context('display.max_rows', 2, 'display.max_columns', 2,
       ....:                        'display.show_dimensions', 'truncate'):
       ....:     print(dfd)
       ....: 
         0  ...   4
    0    0  ...   4
    ..  ..  ...  ..
    4   20  ...  24
    
    [5 rows x 5 columns]
    
    # will not show dimensions since it is not truncated
    In [18]: with pd.option_context('display.max_rows', 10, 'display.max_columns', 40,
       ....:                        'display.show_dimensions', 'truncate'):
       ....:     print(dfd)
       ....: 
        0   1   2   3   4
    0   0   1   2   3   4
    1   5   6   7   8   9
    2  10  11  12  13  14
    3  15  16  17  18  19
    4  20  21  22  23  24
    
  • Регрессия в отображении Series с MultiIndex при display.max_rows меньше, чем длина серии (GH 7101)

  • Исправлена ошибка в HTML-представлении усечённой Series или DataFrame, не показывающая имя класса с large_repr установлено в 'info' (GH 7105)

  • The verbose ключевое слово в DataFrame.info(), который управляет сокращением info представление, теперь None по умолчанию. Это будет следовать глобальной настройке в display.max_info_columns. Глобальная настройка может быть переопределена с помощью verbose=True или verbose=False.

  • Исправлена ошибка с info repr не учитывает display.max_info_columns настройка (GH 6939)

  • Информация о смещении/частоте теперь в Timestamp __repr__ (GH 4553)

Изменения в API парсинга текста#

read_csv()/read_table() теперь будет более шумным в отношении недопустимых опций, а не возвращаться к PythonParser.

  • Вызвать ValueError когда sep указан с delim_whitespace=True в read_csv()/read_table() (GH 6607)

  • Вызвать ValueError когда engine='c' указан с неподдерживаемыми опциями в read_csv()/read_table() (GH 6607)

  • Вызвать ValueError когда откат к парсеру python приводит к игнорированию опций (GH 6607)

  • Создать ParserWarning при откате на python парсер, когда никакие опции не игнорируются (GH 6607)

  • Перевести sep='\s+' to delim_whitespace=True в read_csv()/read_table() если не указаны другие параметры, не поддерживаемые C (GH 6607)

Изменения в API GroupBy#

Более последовательное поведение для некоторых методов groupby:

  • groupby head и tail теперь ведут себя больше как filter вместо агрегации:

    In [1]: df = pd.DataFrame([[1, 2], [1, 4], [5, 6]], columns=['A', 'B'])
    
    In [2]: g = df.groupby('A')
    
    In [3]: g.head(1)  # filters DataFrame
    Out[3]:
       A  B
    0  1  2
    2  5  6
    
    In [4]: g.apply(lambda x: x.head(1))  # used to simply fall-through
    Out[4]:
         A  B
    A
    1 0  1  2
    5 2  5  6
    
  • groupby head и tail учитывают выбор столбцов:

    In [19]: g[['B']].head(1)
    Out[19]:
       B
    0  2
    2  6
    
    [2 rows x 1 columns]
    
  • groupby nth теперь по умолчанию сокращает; фильтрация может быть достигнута путем передачи as_index=False. С необязательным dropna аргумент для игнорирования NaN. См. документация.

    Сокращение

    In [19]: df = pd.DataFrame([[1, np.nan], [1, 4], [5, 6]], columns=['A', 'B'])
    
    In [20]: g = df.groupby('A')
    
    In [21]: g.nth(0)
    Out[21]: 
       A    B
    0  1  NaN
    2  5  6.0
    
    [2 rows x 2 columns]
    
    # this is equivalent to g.first()
    In [22]: g.nth(0, dropna='any')
    Out[22]: 
       A    B
    1  1  4.0
    2  5  6.0
    
    [2 rows x 2 columns]
    
    # this is equivalent to g.last()
    In [23]: g.nth(-1, dropna='any')
    Out[23]: 
       A    B
    1  1  4.0
    2  5  6.0
    
    [2 rows x 2 columns]
    

    Фильтрация

    In [24]: gf = df.groupby('A', as_index=False)
    
    In [25]: gf.nth(0)
    Out[25]: 
       A    B
    0  1  NaN
    2  5  6.0
    
    [2 rows x 2 columns]
    
    In [26]: gf.nth(0, dropna='any')
    Out[26]: 
       A    B
    1  1  4.0
    2  5  6.0
    
    [2 rows x 2 columns]
    
  • groupby теперь не будет возвращать сгруппированный столбец для не-cython функций (GH 5610, GH 5614, GH 6732), так как это уже индекс

    In [27]: df = pd.DataFrame([[1, np.nan], [1, 4], [5, 6], [5, 8]], columns=['A', 'B'])
    
    In [28]: g = df.groupby('A')
    
    In [29]: g.count()
    Out[29]: 
       B
    A   
    1  1
    5  2
    
    [2 rows x 1 columns]
    
    In [30]: g.describe()
    Out[30]: 
          B                                        
      count mean       std  min  25%  50%  75%  max
    A                                              
    1   1.0  4.0       NaN  4.0  4.0  4.0  4.0  4.0
    5   2.0  7.0  1.414214  6.0  6.5  7.0  7.5  8.0
    
    [2 rows x 8 columns]
    
  • передача as_index оставит сгруппированный столбец на месте (это не изменено в 0.14.0)

    In [31]: df = pd.DataFrame([[1, np.nan], [1, 4], [5, 6], [5, 8]], columns=['A', 'B'])
    
    In [32]: g = df.groupby('A', as_index=False)
    
    In [33]: g.count()
    Out[33]: 
       A  B
    0  1  1
    1  5  2
    
    [2 rows x 2 columns]
    
    In [34]: g.describe()
    Out[34]: 
       A     B                                        
         count mean       std  min  25%  50%  75%  max
    0  1   1.0  4.0       NaN  4.0  4.0  4.0  4.0  4.0
    1  5   2.0  7.0  1.414214  6.0  6.5  7.0  7.5  8.0
    
    [2 rows x 9 columns]
    
  • Разрешить указание более сложного группирования через pd.Grouper, например, группировка по времени и строковому полю одновременно. См. документация. (GH 3794)

  • Улучшенное распространение/сохранение имен Series при выполнении операций groupby:

    • SeriesGroupBy.agg обеспечит передачу атрибута name исходного ряда в результат (GH 6265).

    • Если функция, переданная в GroupBy.apply возвращает именованный Series, имя Series будет сохранено как имя индексного столбца DataFrame, возвращаемого GroupBy.apply (GH 6124). Это облегчает DataFrame.stack операций, где имя индекса столбца используется как имя вставленного столбца, содержащего сводные данные.

SQL#

Функции чтения и записи SQL теперь поддерживают больше типов баз данных через SQLAlchemy (GH 2717, GH 4163, GH 5950, GH 6292). Все базы данных, поддерживаемые SQLAlchemy, могут быть использованы, такие как PostgreSQL, MySQL, Oracle, Microsoft SQL server (см. документацию SQLAlchemy на включённые диалекты).

Функциональность предоставления объектов соединения DBAPI будет поддерживаться только для sqlite3 в будущем. 'mysql' параметр flavor устарел.

Новые функции read_sql_query() и read_sql_table() вводятся. Функция read_sql() сохраняется как удобная оболочка вокруг двух других и будет делегировать вызов конкретной функции в зависимости от предоставленного ввода (имя таблицы базы данных или SQL-запрос).

На практике вам необходимо предоставить SQLAlchemy engine к функциям sql. Для подключения с SQLAlchemy используйте create_engine() функция для создания объекта engine из URI базы данных. Вам нужно создать engine только один раз для каждой базы данных, к которой вы подключаетесь. Для базы данных sqlite в памяти:

In [35]: from sqlalchemy import create_engine

# Create your connection.
In [36]: engine = create_engine('sqlite:///:memory:')

Это engine затем может использоваться для записи или чтения данных в/из этой базы данных:

In [37]: df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']})

In [38]: df.to_sql(name='db_table', con=engine, index=False)
Out[38]: 3

Вы можете читать данные из базы данных, указав имя таблицы:

In [39]: pd.read_sql_table('db_table', engine)
Out[39]: 
   A  B
0  1  a
1  2  b
2  3  c

[3 rows x 2 columns]

или указав SQL-запрос:

In [40]: pd.read_sql_query('SELECT * FROM db_table', engine)
Out[40]: 
   A  B
0  1  a
1  2  b
2  3  c

[3 rows x 2 columns]

Некоторые другие улучшения функций sql включают:

  • поддержка записи индекса. Это можно контролировать с помощью index ключевое слово (по умолчанию True).

  • указать метку столбца для использования при записи индекса с index_label.

  • указать строковые столбцы для разбора как даты и времени с помощью parse_dates ключевое слово в read_sql_query() и read_sql_table().

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

Некоторые существующие функции или псевдонимы функций устарели и будут удалены в будущих версиях. К ним относятся: tquery, uquery, read_frame, frame_query, write_frame.

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

Поддержка 'mysql' при использовании объектов соединения DBAPI устарела. MySQL будет поддерживаться далее с движками SQLAlchemy (GH 6900).

Мультииндексирование с использованием слайсеров#

В версии 0.14.0 мы добавили новый способ среза объектов с MultiIndex. Вы можете срезать MultiIndex, предоставив несколько индексаторов.

Вы можете предоставить любой из селекторов, как если бы вы индексировали по метке, см. Выбор по метке, включая срезы, списки меток, метки и булевы индексаторы.

Вы можете использовать slice(None) чтобы выбрать всё содержимое что уровень. Вам не нужно указывать все глубже уровни, они будут подразумеваться как slice(None).

Как обычно, обе стороны слайсеров включены, так как это индексирование по меткам.

См. документация См. также проблемы (GH 6134, GH 4036, GH 3057, GH 2598, GH 5641, GH 7106)

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

Вы должны указать все оси в .loc спецификатор, означающий индексатор для index и для столбцы. Есть некоторые неоднозначные случаи, когда переданный индексатор может быть неверно истолкован как индексация оба оси, а не, скажем, в MultiIndex для строк.

Вам следует сделать следующее:

  >>> df.loc[(slice('A1', 'A3'), ...), :]  # noqa: E901

rather than this:
>>> df.loc[(slice('A1', 'A3'), ...)]  # noqa: E901

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

Вам нужно убедиться, что оси выбора полностью лексикографически отсортированы!

In [41]: def mklbl(prefix, n):
   ....:     return ["%s%s" % (prefix, i) for i in range(n)]
   ....: 

In [42]: index = pd.MultiIndex.from_product([mklbl('A', 4),
   ....:                                     mklbl('B', 2),
   ....:                                     mklbl('C', 4),
   ....:                                     mklbl('D', 2)])
   ....: 

In [43]: columns = pd.MultiIndex.from_tuples([('a', 'foo'), ('a', 'bar'),
   ....:                                      ('b', 'foo'), ('b', 'bah')],
   ....:                                     names=['lvl0', 'lvl1'])
   ....: 

In [44]: df = pd.DataFrame(np.arange(len(index) * len(columns)).reshape((len(index),
   ....:                   len(columns))),
   ....:                   index=index,
   ....:                   columns=columns).sort_index().sort_index(axis=1)
   ....: 

In [45]: df
Out[45]: 
lvl0           a         b     
lvl1         bar  foo  bah  foo
A0 B0 C0 D0    1    0    3    2
         D1    5    4    7    6
      C1 D0    9    8   11   10
         D1   13   12   15   14
      C2 D0   17   16   19   18
...          ...  ...  ...  ...
A3 B1 C1 D1  237  236  239  238
      C2 D0  241  240  243  242
         D1  245  244  247  246
      C3 D0  249  248  251  250
         D1  253  252  255  254

[64 rows x 4 columns]

Базовое срезы MultiIndex с использованием срезов, списков и меток.

In [46]: df.loc[(slice('A1', 'A3'), slice(None), ['C1', 'C3']), :]
Out[46]: 
lvl0           a         b     
lvl1         bar  foo  bah  foo
A1 B0 C1 D0   73   72   75   74
         D1   77   76   79   78
      C3 D0   89   88   91   90
         D1   93   92   95   94
   B1 C1 D0  105  104  107  106
...          ...  ...  ...  ...
A3 B0 C3 D1  221  220  223  222
   B1 C1 D0  233  232  235  234
         D1  237  236  239  238
      C3 D0  249  248  251  250
         D1  253  252  255  254

[24 rows x 4 columns]

Вы можете использовать pd.IndexSlice для сокращения создания этих срезов

In [47]: idx = pd.IndexSlice

In [48]: df.loc[idx[:, :, ['C1', 'C3']], idx[:, 'foo']]
Out[48]: 
lvl0           a    b
lvl1         foo  foo
A0 B0 C1 D0    8   10
         D1   12   14
      C3 D0   24   26
         D1   28   30
   B1 C1 D0   40   42
...          ...  ...
A3 B0 C3 D1  220  222
   B1 C1 D0  232  234
         D1  236  238
      C3 D0  248  250
         D1  252  254

[32 rows x 2 columns]

С помощью этого метода можно выполнять довольно сложные выборки по нескольким осям одновременно.

In [49]: df.loc['A1', (slice(None), 'foo')]
Out[49]: 
lvl0        a    b
lvl1      foo  foo
B0 C0 D0   64   66
      D1   68   70
   C1 D0   72   74
      D1   76   78
   C2 D0   80   82
...       ...  ...
B1 C1 D1  108  110
   C2 D0  112  114
      D1  116  118
   C3 D0  120  122
      D1  124  126

[16 rows x 2 columns]

In [50]: df.loc[idx[:, :, ['C1', 'C3']], idx[:, 'foo']]
Out[50]: 
lvl0           a    b
lvl1         foo  foo
A0 B0 C1 D0    8   10
         D1   12   14
      C3 D0   24   26
         D1   28   30
   B1 C1 D0   40   42
...          ...  ...
A3 B0 C3 D1  220  222
   B1 C1 D0  232  234
         D1  236  238
      C3 D0  248  250
         D1  252  254

[32 rows x 2 columns]

Используя булевый индексатор, вы можете предоставить выбор, связанный с values.

In [51]: mask = df[('a', 'foo')] > 200

In [52]: df.loc[idx[mask, :, ['C1', 'C3']], idx[:, 'foo']]
Out[52]: 
lvl0           a    b
lvl1         foo  foo
A3 B0 C1 D1  204  206
      C3 D0  216  218
         D1  220  222
   B1 C1 D0  232  234
         D1  236  238
      C3 D0  248  250
         D1  252  254

[7 rows x 2 columns]

Вы также можете указать axis аргумент для .loc для интерпретации переданных срезов на одной оси.

In [53]: df.loc(axis=0)[:, :, ['C1', 'C3']]
Out[53]: 
lvl0           a         b     
lvl1         bar  foo  bah  foo
A0 B0 C1 D0    9    8   11   10
         D1   13   12   15   14
      C3 D0   25   24   27   26
         D1   29   28   31   30
   B1 C1 D0   41   40   43   42
...          ...  ...  ...  ...
A3 B0 C3 D1  221  220  223  222
   B1 C1 D0  233  232  235  234
         D1  237  236  239  238
      C3 D0  249  248  251  250
         D1  253  252  255  254

[32 rows x 4 columns]

Кроме того, вы можете set значения с использованием этих методов

In [54]: df2 = df.copy()

In [55]: df2.loc(axis=0)[:, :, ['C1', 'C3']] = -10

In [56]: df2
Out[56]: 
lvl0           a         b     
lvl1         bar  foo  bah  foo
A0 B0 C0 D0    1    0    3    2
         D1    5    4    7    6
      C1 D0  -10  -10  -10  -10
         D1  -10  -10  -10  -10
      C2 D0   17   16   19   18
...          ...  ...  ...  ...
A3 B1 C1 D1  -10  -10  -10  -10
      C2 D0  241  240  243  242
         D1  245  244  247  246
      C3 D0  -10  -10  -10  -10
         D1  -10  -10  -10  -10

[64 rows x 4 columns]

Вы также можете использовать правую часть выравниваемого объекта.

In [57]: df2 = df.copy()

In [58]: df2.loc[idx[:, :, ['C1', 'C3']], :] = df2 * 1000

In [59]: df2
Out[59]: 
lvl0              a               b        
lvl1            bar     foo     bah     foo
A0 B0 C0 D0       1       0       3       2
         D1       5       4       7       6
      C1 D0    9000    8000   11000   10000
         D1   13000   12000   15000   14000
      C2 D0      17      16      19      18
...             ...     ...     ...     ...
A3 B1 C1 D1  237000  236000  239000  238000
      C2 D0     241     240     243     242
         D1     245     244     247     246
      C3 D0  249000  248000  251000  250000
         D1  253000  252000  255000  254000

[64 rows x 4 columns]

Построение графиков#

  • Шестиугольные бинарные графики из DataFrame.plot с kind='hexbin' (GH 5478), См. документация.

  • DataFrame.plot и Series.plot теперь поддерживает построение area plot с указанием kind='area' (GH 6656), См. документация

  • Круговые диаграммы из Series.plot и DataFrame.plot с kind='pie' (GH 6976), См. документация.

  • Построение графиков с полосами погрешностей теперь поддерживается в .plot метод DataFrame и Series объекты (GH 3796, GH 6834), См. документация.

  • DataFrame.plot и Series.plot теперь поддерживает table ключевое слово для построения графиков matplotlib.Table, См. документация. table ключевое слово может принимать следующие значения.

    • False: Ничего не делать (по умолчанию).

    • True: Нарисовать таблицу с использованием DataFrame или Series вызывается plot метод. Данные будут транспонированы для соответствия стандартному макету matplotlib.

    • DataFrame или Series: Нарисовать matplotlib.table, используя переданные данные. Данные будут нарисованы так, как отображаются в методе печати (не транспонируются автоматически). Также вспомогательная функция pandas.tools.plotting.table добавлен для создания таблицы из DataFrame и Series, и добавить его в matplotlib.Axes.

  • plot(legend='reverse') теперь будет обращать порядок меток легенды для большинства видов графиков. (GH 6014)

  • Линейный график и график с областями могут быть наложены путем stacked=True (GH 6656)

  • Следующие ключевые слова теперь допустимы для DataFrame.plot() с kind='bar' и kind='barh':

    • width: Укажите ширину столбца. В предыдущих версиях в matplotlib передавалось статическое значение 0.5, и его нельзя было переопределить. (GH 6604)

    • align: Укажите выравнивание столбцов. По умолчанию center (отличается от matplotlib). В предыдущих версиях pandas передает align='edge' в matplotlib и настроить расположение на center само по себе, и это приводит к align ключевое слово не применяется, как ожидалось. (GH 4525)

    • position: Указать относительные выравнивания для макета столбчатой диаграммы. От 0 (левый/нижний край) до 1 (правый/верхний край). По умолчанию 0.5 (центр). (GH 6604)

    Из-за значения по умолчанию align изменения значений, координаты столбчатых диаграмм теперь расположены на целых значениях (0.0, 1.0, 2.0 …). Это предназначено для того, чтобы столбчатые диаграммы располагались на тех же координатах, что и линейные. Однако столбчатая диаграмма может отличаться неожиданно, когда вы вручную настраиваете расположение столбцов или область рисования, например, используя set_xlim, set_ylim, и т.д. В таких случаях, пожалуйста, измените свой скрипт для соответствия новым координатам.

  • The parallel_coordinates() функция теперь принимает аргумент color вместо colors. A FutureWarning вызывается, чтобы предупредить, что старый colors аргумент не будет поддерживаться в будущем выпуске. (GH 6956)

  • The parallel_coordinates() и andrews_curves() функции теперь принимают позиционный аргумент frame вместо data. A FutureWarning вызывается, если старый data аргумент используется по имени. (GH 6956)

  • DataFrame.boxplot() теперь поддерживает layout ключевое слово (GH 6769)

  • DataFrame.boxplot() имеет новый аргумент ключевого слова, return_type. Он принимает 'dict', 'axes', или 'both', в этом случае возвращается namedtuple с осями matplotlib и словарём линий matplotlib.

Устаревшие функции/изменения в предыдущих версиях#

Существуют устаревшие функции предыдущих версий, которые вступают в силу с версии 0.14.0.

  • Удалить DateRange в пользу DatetimeIndex (GH 6816)

  • Удалить column ключевое слово из DataFrame.sort (GH 4370)

  • Удалить precision ключевое слово из set_eng_float_format() (GH 395)

  • Удалить force_unicode ключевое слово из DataFrame.to_string(), DataFrame.to_latex(), и DataFrame.to_html(); эти функции по умолчанию кодируют в unicode (GH 2224, GH 2225)

  • Удалить nanRep ключевое слово из DataFrame.to_csv() и DataFrame.to_string() (GH 275)

  • Удалить unique ключевое слово из HDFStore.select_column() (GH 3256)

  • Удалить inferTimeRule ключевое слово из Timestamp.offset() (GH 391)

  • Удалить name ключевое слово из get_data_yahoo() и get_data_google() ( коммит b921d1a )

  • Удалить offset ключевое слово из DatetimeIndex конструктор ( коммит 3136390 )

  • Удалить time_rule из нескольких статистических функций скользящего момента, таких как rolling_sum() (GH 1042)

  • Удалено отрицательное - логические операции над массивами numpy в пользу использования inv ~, так как это будет устаревшим в numpy 1.9 (GH 6960)

Устаревшие функции#

  • The pivot_table()/DataFrame.pivot_table() и crosstab() функции теперь принимают аргументы index и columns вместо rows и cols. A FutureWarning вызывается для предупреждения, что старый rows и cols аргументы не будут поддерживаться в будущем выпуске (GH 5505)

  • The DataFrame.drop_duplicates() и DataFrame.duplicated() методы теперь принимают аргумент subset вместо cols для лучшего соответствия с DataFrame.dropna(). A FutureWarning вызывается для предупреждения, что старый cols аргументы не будут поддерживаться в будущем релизе (GH 6680)

  • The DataFrame.to_csv() и DataFrame.to_excel() функции теперь принимают аргумент columns вместо cols. A FutureWarning вызывается для предупреждения, что старый cols аргументы не будут поддерживаться в будущем выпуске (GH 6645)

  • Индексаторы будут предупреждать FutureWarning при использовании со скалярным индексатором и нечисловым индексом с плавающей точкой (GH 4892, GH 6960)

    # non-floating point indexes can only be indexed by integers / labels
    In [1]: pd.Series(1, np.arange(5))[3.0]
            pandas/core/index.py:469: FutureWarning: scalar indexers for index type Int64Index should be integers and not floating point
    Out[1]: 1
    
    In [2]: pd.Series(1, np.arange(5)).iloc[3.0]
            pandas/core/index.py:469: FutureWarning: scalar indexers for index type Int64Index should be integers and not floating point
    Out[2]: 1
    
    In [3]: pd.Series(1, np.arange(5)).iloc[3.0:4]
            pandas/core/index.py:527: FutureWarning: slice indexers when using iloc should be integers and not floating point
    Out[3]:
            3    1
            dtype: int64
    
    # these are Float64Indexes, so integer or floating point is acceptable
    In [4]: pd.Series(1, np.arange(5.))[3]
    Out[4]: 1
    
    In [5]: pd.Series(1, np.arange(5.))[3.0]
    Out[6]: 1
    
  • Совместимость с Numpy 1.9 в отношении предупреждений об устаревании (GH 6960)

  • Panel.shift() теперь имеет сигнатуру функции, соответствующую DataFrame.shift(). Старый позиционный аргумент lags был изменён на аргумент ключевого слова periods со значением по умолчанию 1. A FutureWarning возникает, если старый аргумент lags используется по имени. (GH 6910)

  • The order именованный аргумент factorize() будет удален. (GH 6926).

  • Удалить copy ключевое слово из DataFrame.xs(), Panel.major_xs(), Panel.minor_xs(). Представление будет возвращено, если возможно, в противном случае будет создана копия. Ранее пользователь мог подумать, что copy=False будет ВСЕГДА возвращать представление. (GH 6894)

  • The parallel_coordinates() функция теперь принимает аргумент color вместо colors. A FutureWarning вызывается, чтобы предупредить, что старый colors аргумент не будет поддерживаться в будущем выпуске. (GH 6956)

  • The parallel_coordinates() и andrews_curves() функции теперь принимают позиционный аргумент frame вместо data. A FutureWarning вызывается, если старый data аргумент используется по имени. (GH 6956)

  • Поддержка 'mysql' при использовании объектов соединения DBAPI устарела. MySQL будет поддерживаться далее с движками SQLAlchemy (GH 6900).

  • Следующие io.sql функции были объявлены устаревшими: tquery, uquery, read_frame, frame_query, write_frame.

  • The percentile_width именованный аргумент в describe() был устаревшим. Используйте percentiles ключевое слово вместо этого, которое принимает список процентилей для отображения. Выходные данные по умолчанию не изменены.

  • Тип возвращаемого значения по умолчанию для boxplot() изменится с dict на matplotlib Axes в будущем релизе. Вы можете использовать будущее поведение сейчас, передав return_type='axes' для построения диаграммы размаха.

Известные проблемы#

  • OpenPyXL 2.0.0 нарушает обратную совместимость (GH 7169)

Улучшения#

  • DataFrame и Series создадут объект MultiIndex, если передан словарь кортежей, см. документация (GH 3323)

    In [60]: pd.Series({('a', 'b'): 1, ('a', 'a'): 0,
       ....:            ('a', 'c'): 2, ('b', 'a'): 3, ('b', 'b'): 4})
       ....: 
    Out[60]: 
    a  b    1
       a    0
       c    2
    b  a    3
       b    4
    Length: 5, dtype: int64
    
    In [61]: pd.DataFrame({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2},
       ....:              ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4},
       ....:              ('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6},
       ....:              ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8},
       ....:              ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}})
       ....: 
    Out[61]: 
           a              b      
           b    a    c    a     b
    A B  1.0  4.0  5.0  8.0  10.0
      C  2.0  3.0  6.0  7.0   NaN
      D  NaN  NaN  NaN  NaN   9.0
    
    [3 rows x 5 columns]
    
  • Добавлен sym_diff метод для Index (GH 5543)

  • DataFrame.to_latex теперь принимает ключевое слово longtable, которое при значении True возвращает таблицу в среде longtable.GH 6617)

  • Добавлена опция отключения экранирования в DataFrame.to_latex (GH 6472)

  • pd.read_clipboard будет, если ключевое слово sep не указано, попытайтесь обнаружить данные, скопированные из электронной таблицы, и проанализировать соответствующим образом. (GH 6223)

  • Объединение DataFrame с одним индексом и DataFrame с MultiIndex (GH 3662)

    См. документация. Объединение MultiIndex DataFrame как слева, так и справа пока не поддерживается.

    In [62]: household = pd.DataFrame({'household_id': [1, 2, 3],
       ....:                           'male': [0, 1, 0],
       ....:                           'wealth': [196087.3, 316478.7, 294750]
       ....:                           },
       ....:                          columns=['household_id', 'male', 'wealth']
       ....:                          ).set_index('household_id')
       ....: 
    
    In [63]: household
    Out[63]: 
                  male    wealth
    household_id                
    1                0  196087.3
    2                1  316478.7
    3                0  294750.0
    
    [3 rows x 2 columns]
    
    In [64]: portfolio = pd.DataFrame({'household_id': [1, 2, 2, 3, 3, 3, 4],
       ....:                           'asset_id': ["nl0000301109",
       ....:                                        "nl0000289783",
       ....:                                        "gb00b03mlx29",
       ....:                                        "gb00b03mlx29",
       ....:                                        "lu0197800237",
       ....:                                        "nl0000289965",
       ....:                                        np.nan],
       ....:                           'name': ["ABN Amro",
       ....:                                    "Robeco",
       ....:                                    "Royal Dutch Shell",
       ....:                                    "Royal Dutch Shell",
       ....:                                    "AAB Eastern Europe Equity Fund",
       ....:                                    "Postbank BioTech Fonds",
       ....:                                    np.nan],
       ....:                           'share': [1.0, 0.4, 0.6, 0.15, 0.6, 0.25, 1.0]
       ....:                           },
       ....:                          columns=['household_id', 'asset_id', 'name', 'share']
       ....:                          ).set_index(['household_id', 'asset_id'])
       ....: 
    
    In [65]: portfolio
    Out[65]: 
                                                         name  share
    household_id asset_id                                           
    1            nl0000301109                        ABN Amro   1.00
    2            nl0000289783                          Robeco   0.40
                 gb00b03mlx29               Royal Dutch Shell   0.60
    3            gb00b03mlx29               Royal Dutch Shell   0.15
                 lu0197800237  AAB Eastern Europe Equity Fund   0.60
                 nl0000289965          Postbank BioTech Fonds   0.25
    4            NaN                                      NaN   1.00
    
    [7 rows x 2 columns]
    
    In [66]: household.join(portfolio, how='inner')
    Out[66]: 
                               male  ...  share
    household_id asset_id            ...       
    1            nl0000301109     0  ...   1.00
    2            nl0000289783     1  ...   0.40
                 gb00b03mlx29     1  ...   0.60
    3            gb00b03mlx29     0  ...   0.15
                 lu0197800237     0  ...   0.60
                 nl0000289965     0  ...   0.25
    
    [6 rows x 4 columns]
    
  • quotechar, doublequote, и escapechar теперь может быть указан при использовании DataFrame.to_csv (GH 5414, GH 4528)

  • Частичная сортировка только по указанным уровням MultiIndex с помощью sort_remaining булевый аргумент. (GH 3984)

  • Добавлен to_julian_date to TimeStamp и DatetimeIndex. Юлианская дата используется в основном в астрономии и представляет количество дней от полудня 1 января 4713 года до н.э. Поскольку в pandas для определения времени используются наносекунды, фактический диапазон дат, который можно использовать, — с 1678 года н.э. по 2262 год н.э. (GH 4041)

  • DataFrame.to_stata теперь будет проверять данные на совместимость с типами данных Stata и повышать тип при необходимости. Когда невозможно безопасно повысить тип, выдаётся предупреждение (GH 6327)

  • DataFrame.to_stata и StataWriter будет принимать ключевые аргументы time_stamp и data_label, которые позволяют установить метку времени и метку набора данных при создании файла. (GH 6545)

  • pandas.io.gbq теперь корректно обрабатывает чтение строк в Unicode. (GH 5940)

  • Календари праздников теперь доступны и могут использоваться с CustomBusinessDay смещение (GH 6719)

  • Float64Index теперь поддерживается float64 dtype ndarray вместо object массив типа данных (GH 6471).

  • Реализовано Panel.pct_change (GH 6904)

  • Добавлен how опция для функций скользящего момента, определяющая, как обрабатывать передискретизацию; rolling_max() по умолчанию max, rolling_min() по умолчанию min, а все остальные по умолчанию mean (GH 6297)

  • CustomBusinessMonthBegin и CustomBusinessMonthEnd теперь доступны (GH 6866)

  • Series.quantile() и DataFrame.quantile() теперь принимает массив квантилей.

  • describe() теперь принимает массив процентилей для включения в сводную статистику (GH 4196)

  • pivot_table теперь может принимать Grouper by index и columns ключевые слова (GH 6913)

    In [67]: import datetime
    
    In [68]: df = pd.DataFrame({
       ....:     'Branch': 'A A A A A B'.split(),
       ....:     'Buyer': 'Carl Mark Carl Carl Joe Joe'.split(),
       ....:     'Quantity': [1, 3, 5, 1, 8, 1],
       ....:     'Date': [datetime.datetime(2013, 11, 1, 13, 0),
       ....:              datetime.datetime(2013, 9, 1, 13, 5),
       ....:              datetime.datetime(2013, 10, 1, 20, 0),
       ....:              datetime.datetime(2013, 10, 2, 10, 0),
       ....:              datetime.datetime(2013, 11, 1, 20, 0),
       ....:              datetime.datetime(2013, 10, 2, 10, 0)],
       ....:     'PayDay': [datetime.datetime(2013, 10, 4, 0, 0),
       ....:                datetime.datetime(2013, 10, 15, 13, 5),
       ....:                datetime.datetime(2013, 9, 5, 20, 0),
       ....:                datetime.datetime(2013, 11, 2, 10, 0),
       ....:                datetime.datetime(2013, 10, 7, 20, 0),
       ....:                datetime.datetime(2013, 9, 5, 10, 0)]})
       ....: 
    
    In [69]: df
    Out[69]: 
      Branch Buyer  Quantity                Date              PayDay
    0      A  Carl         1 2013-11-01 13:00:00 2013-10-04 00:00:00
    1      A  Mark         3 2013-09-01 13:05:00 2013-10-15 13:05:00
    2      A  Carl         5 2013-10-01 20:00:00 2013-09-05 20:00:00
    3      A  Carl         1 2013-10-02 10:00:00 2013-11-02 10:00:00
    4      A   Joe         8 2013-11-01 20:00:00 2013-10-07 20:00:00
    5      B   Joe         1 2013-10-02 10:00:00 2013-09-05 10:00:00
    
    [6 rows x 5 columns]
    
    In [75]: df.pivot_table(values='Quantity',
       ....:                index=pd.Grouper(freq='M', key='Date'),
       ....:                columns=pd.Grouper(freq='M', key='PayDay'),
       ....:                aggfunc="sum")
    Out[75]:
    PayDay      2013-09-30  2013-10-31  2013-11-30
    Date
    2013-09-30         NaN         3.0         NaN
    2013-10-31         6.0         NaN         1.0
    2013-11-30         NaN         9.0         NaN
    
    [3 rows x 3 columns]
    
  • Массивы строк могут быть обернуты до указанной ширины (str.wrap) (GH 6999)

  • Добавить nsmallest() и Series.nlargest() методы для Series, см. документация (GH 3960)

  • PeriodIndex полностью поддерживает частичную строковую индексацию, как DatetimeIndex (GH 7043)

    In [76]: prng = pd.period_range('2013-01-01 09:00', periods=100, freq='H')
    
    In [77]: ps = pd.Series(np.random.randn(len(prng)), index=prng)
    
    In [78]: ps
    Out[78]:
    2013-01-01 09:00    0.015696
    2013-01-01 10:00   -2.242685
    2013-01-01 11:00    1.150036
    2013-01-01 12:00    0.991946
    2013-01-01 13:00    0.953324
                          ...
    2013-01-05 08:00    0.285296
    2013-01-05 09:00    0.484288
    2013-01-05 10:00    1.363482
    2013-01-05 11:00   -0.781105
    2013-01-05 12:00   -0.468018
    Freq: H, Length: 100, dtype: float64
    
    In [79]: ps['2013-01-02']
    Out[79]:
    2013-01-02 00:00    0.553439
    2013-01-02 01:00    1.318152
    2013-01-02 02:00   -0.469305
    2013-01-02 03:00    0.675554
    2013-01-02 04:00   -1.817027
                          ...
    2013-01-02 19:00    0.036142
    2013-01-02 20:00   -2.074978
    2013-01-02 21:00    0.247792
    2013-01-02 22:00   -0.897157
    2013-01-02 23:00   -0.136795
    Freq: H, Length: 24, dtype: float64
    
  • read_excel теперь может читать миллисекунды в датах и времени Excel с xlrd >= 0.9.3. (GH 5945)

  • pd.stats.moments.rolling_var теперь использует метод Велфорда для повышения численной стабильности (GH 6817)

  • pd.expanding_apply и pd.rolling_apply теперь принимают args и kwargs, которые передаются в func (GH 6289)

  • DataFrame.rank() теперь имеет опцию процентного ранга (GH 5971)

  • Series.rank() теперь имеет опцию процентного ранга (GH 5971)

  • Series.rank() и DataFrame.rank() теперь принимают method='dense' для рангов без пропусков (GH 6514)

  • Поддержка передачи encoding с xlwt (GH 3710)

  • Рефакторинг классов Block с удалением Block.items атрибуты, чтобы избежать дублирования при обработке элементов (GH 6745, GH 6988).

  • Тестовые утверждения обновлены для использования специализированных проверок (GH 6175)

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

  • Улучшение производительности при преобразовании DatetimeIndex в плавающие порядковые номера используя DatetimeConverter (GH 6636)

  • Улучшение производительности для DataFrame.shift (GH 5609)

  • Улучшение производительности при индексации в Series с MultiIndex (GH 5567)

  • Улучшения производительности при индексировании с одним типом данных (GH 6484)

  • Улучшение производительности создания DataFrame с определёнными смещениями путём удаления ошибочного кэширования (например, MonthEnd, BusinessMonthEnd), (GH 6479)

  • Улучшена производительность CustomBusinessDay (GH 6584)

  • улучшить производительность срезной индексации на Series со строковыми ключами (GH 6341, GH 6372)

  • Улучшение производительности для DataFrame.from_records при чтении указанного количества строк из итерируемого объекта (GH 6700)

  • Улучшения производительности при преобразовании timedelta для целочисленных типов данных (GH 6754)

  • Улучшена производительность совместимых pickle-объектов (GH 6899)

  • Улучшение производительности в определенных операциях переиндексации путем оптимизации take_2d (GH 6749)

  • GroupBy.count() теперь реализован на Cython и значительно быстрее для большого количества групп (GH 7016).

Экспериментальный#

В версии 0.14.0 нет экспериментальных изменений.

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

  • Ошибка в Series ValueError, когда индекс не соответствует данным (GH 6532)

  • Предотвращение сегфолта из-за неподдержки MultiIndex в формате таблицы HDFStore (GH 1848)

  • Ошибка в pd.DataFrame.sort_index где mergesort не был стабильным, когда ascending=False (GH 6399)

  • Ошибка в pd.tseries.frequencies.to_offset когда аргумент имеет ведущие нули (GH 6391)

  • Ошибка в генерации строки версии для dev-версий с неглубокими клонами / установкой из tarball (GH 6127)

  • Нестабильный разбор часовых поясов Timestamp / to_datetime для текущего года (GH 5958)

  • Ошибки индексирования с переупорядоченными индексами (GH 6252, GH 6254)

  • Ошибка в .xs с мультииндексом Series (GH 6258, GH 5684)

  • Ошибка при преобразовании строковых типов в DatetimeIndex с указанной частотой (GH 6273, GH 6274)

  • Ошибка в eval где приведение типов не удалось для больших выражений (GH 6205)

  • Ошибка в interpolate с inplace=True (GH 6281)

  • HDFStore.remove теперь обрабатывает start и stop (GH 6177)

  • HDFStore.select_as_multiple обрабатывает start и stop так же, как select (GH 6177)

  • HDFStore.select_as_coordinates и select_column работает с where условие, которое приводит к фильтрам (GH 6177)

  • Регрессия при соединении non_unique_indexes (GH 6329)

  • Проблема с groupby agg с одной функцией и фреймом смешанного типа (GH 6337)

  • Ошибка в DataFrame.replace() при передаче не- bool to_replace аргумент (GH 6332)

  • Вызов при попытке выравнивания на разных уровнях назначения MultiIndex (GH 3738)

  • Ошибка при установке сложных типов данных через булево индексирование (GH 6345)

  • Ошибка в TimeGrouper/resample при представлении не монотонного DatetimeIndex, которая возвращала неверные результаты. (GH 4161)

  • Ошибка в распространении имени индекса в TimeGrouper/resample (GH 4161)

  • TimeGrouper имеет более совместимый API с остальными группировщиками (например, groups отсутствовал) (GH 3881)

  • Ошибка при множественной группировке с TimeGrouper в зависимости от порядка целевых столбцов (GH 6764)

  • Ошибка в pd.eval при разборе строк с возможными токенами, такими как '&' (GH 6351)

  • Исправлена ошибка правильной обработки размещений -inf в Panels при делении на целое число 0 (GH 6178)

  • DataFrame.shift с axis=1 вызывал исключение (GH 6371)

  • Отключены тесты буфера обмена до времени релиза (запускайте локально с nosetests -A disabled) (GH 6048).

  • Ошибка в DataFrame.replace() при передаче вложенного dict который содержал ключи, отсутствующие в значениях для замены (GH 6342)

  • str.match игнорировал флаг na (GH 6609).

  • Ошибка в take с дублирующимися столбцами, которые не были консолидированы (GH 6240)

  • Ошибка в interpolate, изменяющая типы данных (GH 6290)

  • Ошибка в Series.get, использовал ошибочный метод доступа (GH 6383)

  • Ошибка в запросах hdfstore вида where=[('date', '>=', datetime(2013,1,1)), ('date', '<=', datetime(2014,1,1))] (GH 6313)

  • Ошибка в DataFrame.dropna с повторяющимися индексами (GH 6355)

  • Регрессия в цепочке индексирования getitem со встроенным спискообразным из 0.12 (GH 6394)

  • Float64Index с nan, которые некорректно сравниваются (GH 6401)

  • eval/query выражения со строками, содержащими @ символ теперь будет работать (GH 6366).

  • Ошибка в Series.reindex при указании method с некоторыми значениями nan был непоследовательным (отмечено при ресемплинге) (GH 6418)

  • Ошибка в DataFrame.replace() где вложенные словари ошибочно зависели от порядка ключей и значений словаря (GH 5338).

  • Проблема производительности при конкатенации с пустыми объектами (GH 3259)

  • Уточнение сортировки sym_diff на Index объекты с NaN значения (GH 6444)

  • Регрессия в MultiIndex.from_product с DatetimeIndex в качестве входных данных (GH 6439)

  • Ошибка в str.extract при передаче нестандартного индекса (GH 6348)

  • Ошибка в str.split при передаче pat=None и n=1 (GH 6466)

  • Ошибка в io.data.DataReader при передаче "F-F_Momentum_Factor" и data_source="famafrench" (GH 6460)

  • Ошибка в sum из timedelta64[ns] серия (GH 6462)

  • Ошибка в resample с часовым поясом и определенными смещениями (GH 6397)

  • Ошибка в iat/iloc с дублирующимися индексами в Series (GH 6493)

  • Ошибка в read_html где nan'ы некорректно использовались для обозначения пропущенных значений в тексте. Следует использовать пустую строку для согласованности с остальной частью pandas (GH 5129).

  • Ошибка в read_html тесты, где перенаправленные недействительные URL-адреса приводили к провалу одного теста (GH 6445).

  • Ошибка в индексации по нескольким осям с использованием .loc на неуникальных индексах (GH 6504)

  • Ошибка, вызывавшая повреждение _ref_locs при срезовой индексации по оси столбцов DataFrame (GH 6525)

  • Регрессия с версии 0.13 в обработке numpy datetime64 не-ns типы данных при создании Series (GH 6529)

  • .names атрибут MultiIndex, переданный в set_index теперь сохраняются (GH 6459).

  • Ошибка в setitem с дублирующимся индексом и выравниваемым правым операндом (GH 6541)

  • Ошибка в setitem с .loc на смешанных целочисленных индексах (GH 6546)

  • Ошибка в pd.read_stata что использовало бы неправильные типы данных и пропущенные значения (GH 6327)

  • Ошибка в DataFrame.to_stata что приводило к потере данных в некоторых случаях и могло экспортироваться с использованием неправильных типов данных и пропущенных значений (GH 6335)

  • StataWriter заменяет пропущенные значения в строковых столбцах пустой строкой (GH 6802)

  • Несогласованные типы в Timestamp сложение/вычитание (GH 6543)

  • Ошибка в сохранении частоты при сложении/вычитании Timestamp (GH 4547)

  • Ошибка при поиске в пустом списке вызвала IndexError исключения (GH 6536, GH 6551)

  • Series.quantile вызов исключения на object тип данных (GH 6555)

  • Ошибка в .xs с nan в уровне при удалении (GH 6574)

  • Ошибка в fillna с method='bfill/ffill' и datetime64[ns] тип данных (GH 6587)

  • Ошибка при записи в SQL со смешанными типами данных, возможно приводящая к потере данных (GH 6509)

  • Ошибка в Series.pop (GH 6600)

  • Ошибка в iloc индексирование при совпадении позиционного индексатора Int64Index соответствующей оси, и переупорядочивания не произошло (GH 6612)

  • Ошибка в fillna с limit и value указанный

  • Ошибка в DataFrame.to_stata когда столбцы имеют нестроковые имена (GH 4558)

  • Ошибка в совместимости с np.compress, обнаружено в (GH 6658)

  • Ошибка в бинарных операциях с правой частью в виде Series, не выравнивающейся (GH 6681)

  • Ошибка в DataFrame.to_stata который некорректно обрабатывает значения nan и игнорирует with_index именованный аргумент (GH 6685)

  • Ошибка в resample с дополнительными бинами при использовании равномерно делимой частоты (GH 4076)

  • Ошибка в согласованности агрегации groupby при передаче пользовательской функции (GH 6715)

  • Ошибка в resample, когда how=None частота ресемплинга совпадает с частотой оси (GH 5955)

  • Ошибка в определении понижающего преобразования с пустыми массивами (GH 6733)

  • Ошибка в obj.blocks на разреженных контейнерах, удаляющих все, кроме последних элементов того же dtype (GH 6748)

  • Ошибка при распаковке NaT (NaTType) (GH 4606)

  • Ошибка в DataFrame.replace() где метасимволы регулярных выражений обрабатывались как регулярные выражения, даже когда regex=False (GH 6777).

  • Ошибка в операциях с timedelta на 32-битных платформах (GH 6808)

  • Исправлена ошибка при установке индекса с учетом часового пояса напрямую через .index (GH 6785)

  • Ошибка в expressions.py, где numexpr пытался вычислить арифметические операции (GH 6762).

  • Ошибка в Makefile, где не удалялись сгенерированные Cython C-файлы с make clean (GH 6768)

  • Ошибка с numpy < 1.7.2 при чтении длинных строк из HDFStore (GH 6166)

  • Ошибка в DataFrame._reduce где не булеподобные (0/1) целые числа преобразовывались в булевы значения. (GH 6806)

  • Регрессия с версии 0.13 с fillna и Series с датой-временем (GH 6344)

  • Ошибка при добавлении np.timedelta64 to DatetimeIndex с часовым поясом выдает некорректные результаты (GH 6818)

  • Ошибка в DataFrame.replace() где изменение типа данных через замену заменяло бы только первое вхождение значения (GH 6689)

  • Улучшенное сообщение об ошибке при передаче частоты 'MS' в Period конструкция (GH5332)

  • Ошибка в Series.__unicode__ когда max_rows=None и Series имеет более 1000 строк. (GH 6863)

  • Ошибка в groupby.get_group где датаподобные значения не всегда принимались (GH 5267)

  • Ошибка в groupBy.get_group созданный TimeGrouper вызывает AttributeError (GH 6914)

  • Ошибка в DatetimeIndex.tz_localize и DatetimeIndex.tz_convert преобразование NaT некорректно (GH 5546)

  • Ошибка в арифметических операциях, затрагивающая NaT (GH 6873)

  • Ошибка в Series.str.extract где результирующий Series из одного совпадения группы не было переименовано в имя группы

  • Ошибка в DataFrame.to_csv где установка index=False игнорировал header kwarg (GH 6186)

  • Ошибка в DataFrame.plot и Series.plot, где легенда ведет себя непоследовательно при многократном построении графиков на одних и тех же осях (GH 6678)

  • Внутренние тесты для исправления __finalize__ / ошибка в merge не завершающая (GH 6923, GH 6927)

  • принимать TextFileReader в concat, что влияло на распространенную пользовательскую идиому (GH 6583)

  • Ошибка в C-парсере с ведущими пробелами (GH 3374)

  • Ошибка в C-парсере с delim_whitespace=True и \r-разделенные строки

  • Ошибка в парсере Python с явным MultiIndex в строке, следующей за заголовком столбца (GH 6893)

  • Ошибка в Series.rank и DataFrame.rank что приводило к присвоению одинакового ранга всем малым числам с плавающей точкой (<1e-13) (GH 6886)

  • Ошибка в DataFrame.apply с функциями, которые использовали *args или **kwargs и возвращал пустой результат (GH 6952)

  • Ошибка в sum/mean на 32-битных платформах при переполнении (GH 6915)

  • Перемещено Panel.shift to NDFrame.slice_shift и исправлено для учета нескольких типов данных. (GH 6959)

  • Ошибка при включении subplots=True в DataFrame.plot только один столбец вызывает TypeError, и Series.plot вызывает AttributeError (GH 6951)

  • Ошибка в DataFrame.plot рисует ненужные оси при включении subplots и kind=scatter (GH 6951)

  • Ошибка в read_csv из файловой системы с кодировкой, отличной от utf-8 (GH 6807)

  • Ошибка в iloc при установке / выравнивании (GH 6766)

  • Ошибка, вызывающая UnicodeEncodeError при вызове get_dummies с юникодными значениями и префиксом (GH 6885)

  • Ошибка в отображении курсора графика временных рядов с частотой (GH 5453)

  • Ошибка обнаружена в groupby.plot при использовании Float64Index (GH 7025)

  • Остановлены сбои тестов, если данные опционов не могут быть загружены с Yahoo (GH 7034)

  • Ошибка в parallel_coordinates и radviz где переупорядочивание столбца класса вызывало возможное несоответствие цвета/класса (GH 6956)

  • Ошибка в radviz и andrews_curves где несколько значений 'color' передавались в метод построения графиков (GH 6956)

  • Ошибка в Float64Index.isin() где содержится nan s заставили бы индексы утверждать, что они содержат все элементы (GH 7066).

  • Ошибка в DataFrame.boxplot где не удалось использовать переданную ось ax аргумент (GH 3578)

  • Ошибка в XlsxWriter и XlwtWriter реализации, которые приводили к форматированию столбцов с датой и временем без времени (GH 7075) передавались в метод построения графиков

  • read_fwf() обрабатывает None в colspec как обычные срезы Python. Теперь он читает с начала или до конца строки, когда colspec содержит None (ранее вызывал TypeError)

  • Ошибка в когерентности кэша при цепочечной индексации и срезе; добавлено _is_view свойство для NDFrame для правильного предсказания просмотров; отметить is_copy на xs только если это фактическая копия (а не представление) (GH 7084)

  • Ошибка при создании DatetimeIndex из строкового ndarray с dayfirst=True (GH 5917)

  • Ошибка в MultiIndex.from_arrays созданный из DatetimeIndex не сохраняет freq и tz (GH 7090)

  • Ошибка в unstack вызывает ValueError когда MultiIndex содержит PeriodIndex (GH 4342)

  • Ошибка в boxplot и hist рисует ненужные оси (GH 6769)

  • Регрессия в groupby.nth() для индексаторов вне границ (GH 6621)

  • Ошибка в quantile со значениями даты и времени (GH 6965)

  • Ошибка в Dataframe.set_index, reindex и pivot не сохраняют DatetimeIndex и PeriodIndex атрибуты (GH 3950, GH 5878, GH 6631)

  • Ошибка в MultiIndex.get_level_values не сохраняет DatetimeIndex и PeriodIndex атрибуты (GH 7092)

  • Ошибка в Groupby не сохраняет tz (GH 3950)

  • Ошибка в PeriodIndex Частичная строковая нарезка (GH 6716)

  • Ошибка в HTML-представлении усеченной Series или DataFrame, не отображающая имя класса с large_repr установлено в ‘info’ (GH 7105)

  • Ошибка в DatetimeIndex указание freq вызывает ValueError когда переданное значение слишком короткое (GH 7098)

  • Исправлена ошибка с info repr не учитывает display.max_info_columns настройка (GH 6939)

  • Ошибка PeriodIndex срез строки с выходящими за границы значениями (GH 5407)

  • Исправлена ошибка памяти в реализации хэш-таблицы/факторизаторе при изменении размера больших таблиц (GH 7157)

  • Ошибка в isnull при применении к 0-мерным массивам объектов (GH 7176)

  • Ошибка в query/eval где глобальные константы не были найдены правильно (GH 7178)

  • Ошибка в распознавании позиционных индексаторов списка вне диапазона с iloc и многомерный кортеж индексатора (GH 7189)

  • Ошибка в setitem с одним значением, MultiIndex и целочисленными индексами (GH 7190, -0.348)

  • Ошибка в вычислении выражений с обратными операциями, проявляющаяся в операциях серия-датафрейм (GH 7198, GH 7192)

  • Ошибка в многоосевом индексировании с > 2 измерениями и MultiIndex (GH 7199)

  • Исправлена ошибка, при которой недопустимые операции eval/query могли переполнить стек (GH 5198)

Участники#

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

  • Acanthostega +

  • Adam Marcus +

  • Алекс Гаудио

  • Алекс Ротберг

  • AllenDowney +

  • Andrew Rosenfeld +

  • Andy Hayden

  • Antoine Mazières +

  • Benedikt Sauer

  • Брэд Буран

  • Кристофер Уилан

  • Clark Fitzgerald

  • DSM

  • Dale Jung

  • Dan Allan

  • Dan Birken

  • Daniel Waeber

  • Дэвид Юнг +

  • David Stephens +

  • Дуглас МакНил

  • Garrett Drapala

  • Gouthaman Balaraman +

  • Guillaume Poulin +

  • Jacob Howard +

  • Джейкоб Шаер

  • Jason Sexauer +

  • Jeff Reback

  • Jeff Tratner

  • Jeffrey Starr +

  • John David Reaver +

  • John McNamara

  • John W. O’Brien

  • Jonathan Chambers

  • Joris Van den Bossche

  • Джулия Эванс

  • Júlio +

  • K.-Michael Aye

  • Katie Atkinson +

  • Келси Джордал

  • Kevin Sheppard +

  • Matt Wittmann +

  • Маттиас Кун +

  • Max Grender-Jones +

  • Michael E. Gruen +

  • Mike Kelly

  • Нипун Батра +

  • Noah Spies +

  • PKEuS

  • Patrick O’Keeffe

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

  • Pietro Battiston +

  • Randy Carnevale +

  • Robert Gibboni +

  • Skipper Seabold

  • SplashDance +

  • Stephan Hoyer +

  • Tim Cera +

  • Тобиас Брандт

  • Todd Jennings +

  • Tom Augspurger

  • TomAugspurger

  • Yaroslav Halchenko

  • agijsberts +

  • akittredge

  • анкостис +

  • anomrake

  • anton-d +

  • bashtage +

  • benjamin +

  • bwignall

  • cgohlke +

  • chebee7i +

  • clham +

  • danielballan

  • hshimizu77 +

  • hugo +

  • immerrr

  • ischwabacher +

  • jaimefrio +

  • jreback

  • jsexauer +

  • kdiether +

  • michaelws +

  • mikebailey +

  • ojdo +

  • onesandzeroes +

  • phaebz +

  • ribonoous +

  • rockg

  • sinhrks +

  • unutbu

  • westurner

  • y-p

  • zach powers