Версия 0.15.1 (9 ноября 2014)#

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

Изменения API#

  • s.dt.hour и другие .dt аксессоры теперь будут возвращать np.nan для пропущенных значений (вместо предыдущего -1), (GH 8689)

    In [1]: s = pd.Series(pd.date_range("20130101", periods=5, freq="D"))
    
    In [2]: s.iloc[2] = np.nan
    
    In [3]: s
    Out[3]: 
    0   2013-01-01
    1   2013-01-02
    2          NaT
    3   2013-01-04
    4   2013-01-05
    Length: 5, dtype: datetime64[ns]
    

    предыдущее поведение:

    In [6]: s.dt.hour
    Out[6]:
    0    0
    1    0
    2   -1
    3    0
    4    0
    dtype: int64
    

    текущее поведение:

    In [4]: s.dt.hour
    Out[4]: 
    0    0.0
    1    0.0
    2    NaN
    3    0.0
    4    0.0
    Length: 5, dtype: float64
    
  • groupby с as_index=False не добавит ошибочные дополнительные столбцы в результат (GH 8582):

    In [5]: np.random.seed(2718281)
    
    In [6]: df = pd.DataFrame(np.random.randint(0, 100, (10, 2)), columns=["jim", "joe"])
    
    In [7]: df.head()
    Out[7]: 
       jim  joe
    0   61   81
    1   96   49
    2   55   65
    3   72   51
    4   77   12
    
    [5 rows x 2 columns]
    
    In [8]: ts = pd.Series(5 * np.random.randint(0, 3, 10))
    

    предыдущее поведение:

    In [4]: df.groupby(ts, as_index=False).max()
    Out[4]:
       NaN  jim  joe
    0    0   72   83
    1    5   77   84
    2   10   96   65
    

    текущее поведение:

    In [4]: df.groupby(ts, as_index=False).max()
    Out[4]:
       jim  joe
    0   72   83
    1   77   84
    2   96   65
    
  • groupby не будет ошибочно исключать столбцы, если имя столбца конфликтует с именем группировщика (GH 8112):

    In [9]: df = pd.DataFrame({"jim": range(5), "joe": range(5, 10)})
    
    In [10]: df
    Out[10]: 
       jim  joe
    0    0    5
    1    1    6
    2    2    7
    3    3    8
    4    4    9
    
    [5 rows x 2 columns]
    
    In [11]: gr = df.groupby(df["jim"] < 2)
    

    предыдущее поведение (исключает 1-й столбец из вывода):

    In [4]: gr.apply(sum)
    Out[4]:
           joe
    jim
    False   24
    True    11
    

    текущее поведение:

    In [12]: gr.apply(sum)
    Out[12]: 
           jim  joe
    jim            
    False    9   24
    True     1   11
    
    [2 rows x 2 columns]
    
  • Поддержка срезов с монотонно убывающими индексами, даже если start или stop не найден в индексе (GH 7860):

    In [13]: s = pd.Series(["a", "b", "c", "d"], [4, 3, 2, 1])
    
    In [14]: s
    Out[14]: 
    4    a
    3    b
    2    c
    1    d
    Length: 4, dtype: object
    

    предыдущее поведение:

    In [8]: s.loc[3.5:1.5]
    KeyError: 3.5
    

    текущее поведение:

    In [15]: s.loc[3.5:1.5]
    Out[15]: 
    3    b
    2    c
    Length: 2, dtype: object
    
  • io.data.Options исправлено для изменения формата страницы Yahoo Options (GH 8612), (GH 8741)

    Примечание

    В результате изменения макета страницы опционов Yahoo, когда указана дата экспирации, Options методы теперь возвращают данные для одной даты экспирации. Ранее методы возвращали все данные для выбранного месяца.

    The month и year параметры были восстановлены из устаревших и могут использоваться для получения всех данных опционов за заданный месяц.

    Если указана недействительная дата истечения срока, возвращаются данные для следующего истечения после указанной даты.

    Опциональные датафреймы теперь сохраняются в экземпляре как callsYYMMDD или putsYYMMDD. Ранее они сохранялись как callsMMYY и putsMMYY. Следующий срок действия сохраняется как calls и puts.

    Новые возможности:

    • Параметр expiry теперь может быть одной датой или объектом, подобным списку, содержащим даты.

    • Новое свойство expiry_dates был добавлен, который возвращает все доступные даты истечения.

    Текущее поведение:

    In [17]: from pandas.io.data import Options
    
    In [18]: aapl = Options('aapl', 'yahoo')
    
    In [19]: aapl.get_call_data().iloc[0:5, 0:1]
    Out[19]:
                                                 Last
    Strike Expiry     Type Symbol
    80     2014-11-14 call AAPL141114C00080000  29.05
    84     2014-11-14 call AAPL141114C00084000  24.80
    85     2014-11-14 call AAPL141114C00085000  24.05
    86     2014-11-14 call AAPL141114C00086000  22.76
    87     2014-11-14 call AAPL141114C00087000  21.74
    
    In [20]: aapl.expiry_dates
    Out[20]:
    [datetime.date(2014, 11, 14),
     datetime.date(2014, 11, 22),
     datetime.date(2014, 11, 28),
     datetime.date(2014, 12, 5),
     datetime.date(2014, 12, 12),
     datetime.date(2014, 12, 20),
     datetime.date(2015, 1, 17),
     datetime.date(2015, 2, 20),
     datetime.date(2015, 4, 17),
     datetime.date(2015, 7, 17),
     datetime.date(2016, 1, 15),
     datetime.date(2017, 1, 20)]
    
    In [21]: aapl.get_near_stock_price(expiry=aapl.expiry_dates[0:3]).iloc[0:5, 0:1]
    Out[21]:
                                                Last
    Strike Expiry     Type Symbol
    109    2014-11-22 call AAPL141122C00109000  1.48
           2014-11-28 call AAPL141128C00109000  1.79
    110    2014-11-14 call AAPL141114C00110000  0.55
           2014-11-22 call AAPL141122C00110000  1.02
           2014-11-28 call AAPL141128C00110000  1.32
    
  • pandas теперь также регистрирует datetime64 тип данных в реестре единиц matplotlib для построения таких значений как даты и время. Это активируется после импорта pandas. В предыдущих версиях построение массива datetime64 значения привели бы к построенным целочисленным значениям. Чтобы сохранить предыдущее поведение, вы можете сделать del matplotlib.units.registry[np.datetime64] (GH 8614).

Улучшения#

  • concat разрешает более широкий спектр итерируемых объектов pandas передаваться в качестве первого параметра (GH 8645):

    In [16]: from collections import deque
    
    In [17]: df1 = pd.DataFrame([1, 2, 3])
    
    In [18]: df2 = pd.DataFrame([4, 5, 6])
    

    предыдущее поведение:

    In [7]: pd.concat(deque((df1, df2)))
    TypeError: first argument must be a list-like of pandas objects, you passed an object of type "deque"
    

    текущее поведение:

    In [19]: pd.concat(deque((df1, df2)))
    Out[19]: 
       0
    0  1
    1  2
    2  3
    0  4
    1  5
    2  6
    
    [6 rows x 1 columns]
    
  • Представлять MultiIndex метки с типом данных, который использует память на основе размера уровня. В предыдущих версиях использование памяти было постоянным — 8 байт на элемент в каждом уровне. Кроме того, в предыдущих версиях сообщено использование памяти было некорректным, так как не показывало использование памяти, занимаемой базовым массивом данных. (GH 8456)

    In [20]: dfi = pd.DataFrame(
       ....:     1, index=pd.MultiIndex.from_product([["a"], range(1000)]), columns=["A"]
       ....: )
       ....: 
    

    предыдущее поведение:

    # this was underreported in prior versions
    In [1]: dfi.memory_usage(index=True)
    Out[1]:
    Index    8000 # took about 24008 bytes in < 0.15.1
    A        8000
    dtype: int64
    

    текущее поведение:

    In [21]: dfi.memory_usage(index=True)
    Out[21]: 
    Index    44212
    A         8000
    Length: 2, dtype: int64
    
  • Добавлены свойства индекса is_monotonic_increasing и is_monotonic_decreasing (GH 8680).

  • Добавлена возможность выбора столбцов при импорте файлов Stata (GH 7935)

  • Квалификация использования памяти в DataFrame.info() путем добавления + если это нижняя граница (GH 8578)

  • Вызывать ошибки в определенных случаях агрегации, где аргумент, такой как numeric_only не обрабатывается (GH 8592).

  • Добавлена поддержка 3-символьных ISO и нестандартных кодов стран в io.wb.download() (GH 8482)

  • Запросы данных Всемирного банка теперь будут предупреждать/вызывать исключение на основе errors аргумент, а также список жёстко заданных кодов стран и JSON-ответ Всемирного банка. В предыдущих версиях сообщения об ошибках не смотрели на JSON-ответ Всемирного банка. Проблемные входные данные просто отбрасывались перед запросом. Проблема заключалась в том, что многие хорошие страны были обрезаны в жёстко заданном подходе. Все страны будут работать сейчас, но некоторые плохие страны вызовут исключения, потому что некоторые крайние случаи ломают весь ответ. (GH 8482)

  • Добавлена опция для Series.str.split() для возврата DataFrame а не Series (GH 8428)

  • Добавлена опция для df.info(null_counts=None|True|False) чтобы переопределить параметры отображения по умолчанию и принудительно показывать количество null-значений (GH 8701)

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

  • Ошибка при распаковке CustomBusinessDay объект (GH 8591)

  • Ошибка в приведении Categorical в массив записей, например df.to_records() (GH 8626)

  • Ошибка в Categorical не создан правильно с Series.to_frame() (GH 8626)

  • Ошибка при приведении типов в astype для Categorical переданного pd.Categorical (теперь вызывает TypeError правильно), (GH 8626)

  • Ошибка в cut/qcut при использовании Series и retbins=True (GH 8589)

  • Ошибка при записи категориальных столбцов в базу данных SQL с to_sql (GH 8624).

  • Ошибка при сравнении Categorical даты и времени вызывает ошибку при сравнении со скалярной датой и временем (GH 8687)

  • Ошибка при выборе из Categorical с .iloc (GH 8623)

  • Ошибка в groupby-transform с Categorical (GH 8623)

  • Ошибка в duplicated/drop_duplicates с Categorical (GH 8623)

  • Ошибка в Categorical отраженный оператор сравнения вызывал ошибку, если первый аргумент был скаляром массива numpy (например, np.int64) (GH 8658)

  • Ошибка в индексации Panel с помощью списка (GH 8710)

  • Проблема совместимости DataFrame.dtypes когда options.mode.use_inf_as_null равно True (GH 8722)

  • Ошибка в read_csv, dialect параметр не принимал строку (GH 8703)

  • Ошибка при срезе уровня MultiIndex пустым списком (GH 8737)

  • Ошибка в числовых операциях индекса add/sub с Float/Index Index с массивами numpy (GH 8608)

  • Ошибка в setitem с пустым индексатором и нежелательным приведением типов (GH 8669)

  • Ошибка в ix/loc при разделении блоков на setitem (проявляется с целочисленными типами данных, например datetime64) (GH 8607)

  • Ошибка при индексировании по меткам с целыми числами, не найденными в индексе для неуникальных, но монотонных индексов (GH 8680).

  • Ошибка при индексации Float64Index с np.nan на numpy 1.7 (GH 8980).

  • Исправление shape атрибут для MultiIndex (GH 8609)

  • Ошибка в GroupBy где конфликт имен между группировщиком и столбцами может нарушить groupby операции (GH 7115, GH 8112)

  • Исправлена ошибка, при которой построение графика столбца y и указание метки изменит имя индекса исходного DataFrame (GH 8494)

  • Исправлена регрессия при построении графика DatetimeIndex напрямую с matplotlib (GH 8614).

  • Ошибка в date_range где частично указанные даты включали бы текущую дату (GH 6961)

  • Ошибка при установке через индексатор скалярного значения со смешанным типом данных Panel4d не удавалось (GH 8702)

  • Ошибка, где DataReaderне удавалось, если один из переданных символов был недействительным. Теперь возвращает данные для действительных символов и np.nan для недействительных (GH 8494)

  • Ошибка в get_quote_yahoo который не позволял бы возвращать не-вещественные значения (GH 5229).

Участники#

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

  • Aaron Staple +

  • Andrew Rosenfeld

  • Anton I. Sipos

  • Artemy Kolchinsky

  • Билл Летсон +

  • Dave Hughes +

  • David Stephens

  • Гийом Орель +

  • Jeff Reback

  • Joris Van den Bossche

  • Кевин Шеппард

  • Nick Stahl +

  • Sanghee Kim +

  • Stephan Hoyer

  • Tom Augspurger

  • TomAugspurger

  • WANG Aiyong +

  • behzad nouri

  • immerrr

  • jnmclarty

  • jreback

  • pallav-fdsi +

  • unutbu