Версия 0.10.1 (22 января 2013)#
Это минорный релиз от 0.10.0 и включает новые функции, улучшения и исправления ошибок. В частности, представлена существенно новая функциональность HDFStore, внесённая Jeff Reback.
Нежелательный разрыв API с функциями, принимающими inplace опция была
отменена и добавлены предупреждения об устаревании.
Изменения API#
Функции, принимающие
inplaceопция возвращает вызывающий объект как раньше. Добавлено сообщение об устареванииАгрегации Groupby Max/Min больше не исключают нечисловые данные (Josh Friedlander +)
Ресемплинг пустого DataFrame теперь возвращает пустой DataFrame вместо вызова исключения (GH 2640)
Читатель файлов теперь будет вызывать исключение, когда значения NA найдены в явно указанном целочисленном столбце, вместо преобразования столбца в float (GH 2631)
DatetimeIndex.unique теперь возвращает DatetimeIndex с тем же именем и
часовой пояс вместо массива (GH 2563)
Новые возможности#
Поддержка MySQL для базы данных (вклад от Dan Allan)
HDFStore#
Возможно, вам потребуется обновить существующие файлы данных. Посетите совместимость раздел в основной документации.
Вы можете указать (и индексировать) определенные столбцы, по которым хотите выполнять запросы к таблице, передав список в data_columns
In [1]: store = pd.HDFStore("store.h5")
In [2]: df = pd.DataFrame(
...: np.random.randn(8, 3),
...: index=pd.date_range("1/1/2000", periods=8),
...: columns=["A", "B", "C"],
...: )
...:
In [3]: df["string"] = "foo"
In [4]: df.loc[df.index[4:6], "string"] = np.nan
In [5]: df.loc[df.index[7:9], "string"] = "bar"
In [6]: df["string2"] = "cool"
In [7]: df
Out[7]:
A B C string string2
2000-01-01 0.469112 -0.282863 -1.509059 foo cool
2000-01-02 -1.135632 1.212112 -0.173215 foo cool
2000-01-03 0.119209 -1.044236 -0.861849 foo cool
2000-01-04 -2.104569 -0.494929 1.071804 foo cool
2000-01-05 0.721555 -0.706771 -1.039575 NaN cool
2000-01-06 0.271860 -0.424972 0.567020 NaN cool
2000-01-07 0.276232 -1.087401 -0.673690 foo cool
2000-01-08 0.113648 -1.478427 0.524988 bar cool
# on-disk operations
In [8]: store.append("df", df, data_columns=["B", "C", "string", "string2"])
In [9]: store.select("df", "B>0 and string=='foo'")
Out[9]:
A B C string string2
2000-01-02 -1.135632 1.212112 -0.173215 foo cool
# this is in-memory version of this type of selection
In [10]: df[(df.B > 0) & (df.string == "foo")]
Out[10]:
A B C string string2
2000-01-02 -1.135632 1.212112 -0.173215 foo cool
Получение уникальных значений в индексируемом или столбце данных.
# note that this is deprecated as of 0.14.0
# can be replicated by: store.select_column('df','index').unique()
store.unique("df", "index")
store.unique("df", "string")
Теперь вы можете хранить datetime64 в столбцах данных
In [11]: df_mixed = df.copy()
In [12]: df_mixed["datetime64"] = pd.Timestamp("20010102")
In [13]: df_mixed.loc[df_mixed.index[3:4], ["A", "B"]] = np.nan
In [14]: store.append("df_mixed", df_mixed)
In [15]: df_mixed1 = store.select("df_mixed")
In [16]: df_mixed1
Out[16]:
A B ... string2 datetime64
2000-01-01 0.469112 -0.282863 ... cool 1970-01-01 00:00:00.978393600
2000-01-02 -1.135632 1.212112 ... cool 1970-01-01 00:00:00.978393600
2000-01-03 0.119209 -1.044236 ... cool 1970-01-01 00:00:00.978393600
2000-01-04 NaN NaN ... cool 1970-01-01 00:00:00.978393600
2000-01-05 0.721555 -0.706771 ... cool 1970-01-01 00:00:00.978393600
2000-01-06 0.271860 -0.424972 ... cool 1970-01-01 00:00:00.978393600
2000-01-07 0.276232 -1.087401 ... cool 1970-01-01 00:00:00.978393600
2000-01-08 0.113648 -1.478427 ... cool 1970-01-01 00:00:00.978393600
[8 rows x 6 columns]
In [17]: df_mixed1.dtypes.value_counts()
Out[17]:
float64 3
object 2
datetime64[ns] 1
Name: count, dtype: int64
Вы можете передать columns ключевое слово для выбора фильтрации списка возвращаемых
столбцов, это эквивалентно передаче
Term('columns',list_of_columns_to_filter)
In [18]: store.select("df", columns=["A", "B"])
Out[18]:
A B
2000-01-01 0.469112 -0.282863
2000-01-02 -1.135632 1.212112
2000-01-03 0.119209 -1.044236
2000-01-04 -2.104569 -0.494929
2000-01-05 0.721555 -0.706771
2000-01-06 0.271860 -0.424972
2000-01-07 0.276232 -1.087401
2000-01-08 0.113648 -1.478427
HDFStore теперь сериализует MultiIndex датафреймы при добавлении таблиц.
In [19]: index = pd.MultiIndex(levels=[['foo', 'bar', 'baz', 'qux'],
....: ['one', 'two', 'three']],
....: labels=[[0, 0, 0, 1, 1, 2, 2, 3, 3, 3],
....: [0, 1, 2, 0, 1, 1, 2, 0, 1, 2]],
....: names=['foo', 'bar'])
....:
In [20]: df = pd.DataFrame(np.random.randn(10, 3), index=index,
....: columns=['A', 'B', 'C'])
....:
In [21]: df
Out[21]:
A B C
foo bar
foo one -0.116619 0.295575 -1.047704
two 1.640556 1.905836 2.772115
three 0.088787 -1.144197 -0.633372
bar one 0.925372 -0.006438 -0.820408
two -0.600874 -1.039266 0.824758
baz two -0.824095 -0.337730 -0.927764
three -0.840123 0.248505 -0.109250
qux one 0.431977 -0.460710 0.336505
two -3.207595 -1.535854 0.409769
three -0.673145 -0.741113 -0.110891
In [22]: store.append('mi', df)
In [23]: store.select('mi')
Out[23]:
A B C
foo bar
foo one -0.116619 0.295575 -1.047704
two 1.640556 1.905836 2.772115
three 0.088787 -1.144197 -0.633372
bar one 0.925372 -0.006438 -0.820408
two -0.600874 -1.039266 0.824758
baz two -0.824095 -0.337730 -0.927764
three -0.840123 0.248505 -0.109250
qux one 0.431977 -0.460710 0.336505
two -3.207595 -1.535854 0.409769
three -0.673145 -0.741113 -0.110891
# the levels are automatically included as data columns
In [24]: store.select('mi', "foo='bar'")
Out[24]:
A B C
foo bar
bar one 0.925372 -0.006438 -0.820408
two -0.600874 -1.039266 0.824758
Создание нескольких таблиц через append_to_multiple и выбор через
select_as_multiple может создавать/выбирать из нескольких таблиц и возвращать
объединенный результат, используя where на таблице селектора.
In [19]: df_mt = pd.DataFrame(
....: np.random.randn(8, 6),
....: index=pd.date_range("1/1/2000", periods=8),
....: columns=["A", "B", "C", "D", "E", "F"],
....: )
....:
In [20]: df_mt["foo"] = "bar"
# you can also create the tables individually
In [21]: store.append_to_multiple(
....: {"df1_mt": ["A", "B"], "df2_mt": None}, df_mt, selector="df1_mt"
....: )
....:
In [22]: store
Out[22]:
File path: store.h5
# individual tables were created
In [23]: store.select("df1_mt")
Out[23]:
A B
2000-01-01 0.404705 0.577046
2000-01-02 -1.344312 0.844885
2000-01-03 0.357021 -0.674600
2000-01-04 0.276662 -0.472035
2000-01-05 0.895717 0.805244
2000-01-06 -1.170299 -0.226169
2000-01-07 -0.076467 -1.187678
2000-01-08 1.024180 0.569605
In [24]: store.select("df2_mt")
Out[24]:
C D E F foo
2000-01-01 -1.715002 -1.039268 -0.370647 -1.157892 bar
2000-01-02 1.075770 -0.109050 1.643563 -1.469388 bar
2000-01-03 -1.776904 -0.968914 -1.294524 0.413738 bar
2000-01-04 -0.013960 -0.362543 -0.006154 -0.923061 bar
2000-01-05 -1.206412 2.565646 1.431256 1.340309 bar
2000-01-06 0.410835 0.813850 0.132003 -0.827317 bar
2000-01-07 1.130127 -1.436737 -1.413681 1.607920 bar
2000-01-08 0.875906 -2.211372 0.974466 -2.006747 bar
# as a multiple
In [25]: store.select_as_multiple(
....: ["df1_mt", "df2_mt"], where=["A>0", "B>0"], selector="df1_mt"
....: )
....:
Out[25]:
A B C D E F foo
2000-01-01 0.404705 0.577046 -1.715002 -1.039268 -0.370647 -1.157892 bar
2000-01-05 0.895717 0.805244 -1.206412 2.565646 1.431256 1.340309 bar
2000-01-08 1.024180 0.569605 0.875906 -2.211372 0.974466 -2.006747 bar
Улучшения
HDFStoreтеперь может читать таблицы в родном формате PyTables table formatВы можете передать
nan_rep = 'my_nan_rep'для добавления, чтобы изменить представление nan по умолчанию на диске (которое преобразуется в/изnp.nan), по умолчанию этоnan.Вы можете передать
indextoappend. По умолчанию этоTrue. Это автоматически создаст индексы на индексируемые объекты и столбцы данных таблицыВы можете передать
chunksize=an integertoappend, чтобы изменить параметр записи chunksize (по умолчанию 50000). Это значительно снизит использование памяти при записи.Вы можете передать
expectedrows=an integerк первомуappend, чтобы установить ОБЩЕЕ количество ожидаемых строк, котороеPyTablesбудет ожидаться. Это оптимизирует производительность чтения/записи.Selectтеперь поддерживает передачуstartиstopдля предоставления ограничения пространства выбора в выборе.Значительно улучшен парсинг дат ISO8601 (например, гггг-мм-дд) для парсеров файлов (GH 2698)
Разрешить
DataFrame.mergeдля обработки комбинаторных размеров, слишком больших для 64-битного целого числа (GH 2690)Series теперь имеет унарные операторы отрицания (-series) и инверсии (~series) (GH 2686)
DataFrame.plot теперь включает
logxпараметр для изменения оси X на логарифмическую шкалу (GH 2327)Арифметические операторы Series теперь могут обрабатывать константы и входные данные ndarray (GH 2574)
ExcelFile теперь принимает
kindаргумент для указания типа файла (GH 2613)Более быстрая реализация для методов Series.str (GH 2602)
Исправления ошибок
HDFStoreтаблицы теперь могут хранитьfloat32типы корректно (не могут быть смешаны сfloat64однако)Исправлен префикс Google Analytics при указании сегмента запроса (GH 2713).
Функция для сброса хранилища токенов Google Analytics, чтобы пользователи могли восстановиться после неправильно настроенных клиентских секретов (GH 2687).
Исправлена ошибка groupby, приводящая к segfault при передаче MultiIndex (GH 2706)
Исправлена ошибка, при передаче Series со значениями datetime64 в
to_datetimeприводит к ложным выходным значениям (GH 2699)Исправлена ошибка в
pattern in HDFStoreвыражения, когда шаблон не является допустимым регулярным выражением (GH 2694)Исправлены проблемы производительности при агрегации булевых данных (GH 2692)
При задании булевой маски ключа и Series новых значений, Series __setitem__ теперь будет выравнивать входящие значения с исходной Series (GH 2686)
Исправлена MemoryError, вызванная выполнением сортировки подсчетом при сортировке уровней MultiIndex с очень большим количеством комбинаторных значений (GH 2684)
Исправлена ошибка, вызывающая сбой построения графиков, когда индекс является DatetimeIndex с часовым поясом фиксированного смещения (GH 2683)
Исправлена логика вычитания рабочих дней, когда смещение составляет более 5 рабочих дней и начальная дата приходится на выходные (GH 2680)
Исправлено поведение парсера C-файлов, когда в файле больше столбцов, чем данных (GH 2668)
Исправлена ошибка чтения файла, которая неправильно выравнивала столбцы с данными при наличии неявного столбца и указанного
usecolsзначениеDataFrames с числовыми или datetime индексами теперь сортируются перед построением графиков (GH 2609)
Исправлена ошибка DataFrame.from_records при передаче columns, index, но пустых записей (GH 2633)
Исправлено несколько ошибок для операций с Series, когда dtype равен datetime64 (GH 2689, GH 2629, GH 2626)
См. полные заметки о выпуске или трекер задач на GitHub для полного списка.
Участники#
Всего 17 человек внесли патчи в этот релиз. Люди со знаком "+" рядом с именами внесли патч впервые.
Энди Хейден +
Anton I. Sipos +
Chang She
Кристофер Уилан
Damien Garaud +
Dan Allan +
Dieter Vandenbussche
Garrett Drapala +
Jay Parlar +
Thouis (Ray) Jones +
Vincent Arel-Bundock +
Wes McKinney
elpres
herrfz +
jreback
svaksha +
y-p