Что нового в pandas 1.0?
![]()
В конце января 2020 вышло большое обновление библиотеки pandas – 1.0. Представляем вам обзор изменений и дополнений, которые по нашему мнению являются интересными и заслуживают внимания.
- pd.NA
- Типы pandas для работы со строками и boolean-значениями
- Инструмент конвертирования типов
- Конвертор в markdown
- Еще изменения и дополнения…
Мажорный релиз 1.0 принес с собой улучшения существующих инструментов, новые дополнения (они пока имеют статус экспериментальных), ряд изменений в API, которые ломают обратную совместимость, багфиксы и изменения, увеличивающие производительность библиотеки.
pd.NA
Первое, с чего хотелось бы начать – это pd.NA – “значение”, которое pandas будет использовать для обозначения отсутствующих данных.
В предыдущих версиях pandas для обозначения отсутствующих данных использовались следующие значения: NaN, NaT и None. NaN – это отсутствующее значение в столбце с числовым типом данных, оно является аббревиатурой от Not a Number (пришло из numpy: np.NaN). NaT – это отсутствующее значение для данных типа DateTime, аббревиатура от Not a Time (является частью библиотеки pandas). None используется если тип данных object, такой тип имеют, например, элементы типа str (пришло из Python).
Рассмотрим работу с отсутствующими данными на примерах:
> d = <"A":[None, "test2", "test3"], "B": [1.01, np.nan, 3.45], "C": [date(2019, 1, 29), datetime.now(), None], "D":[1, 2, None]>> df = pd.DataFrame(d)

Если создать набор данных с целыми числами, не указывая явно тип, то будет использовано значение по умолчанию:
> pd.Series([4, 5, None]) 0 4.0 1 5.0 2 NaN dtype: float64
Если тип указать, то в pandas 1.0 будет использован pd.NA:
>pd.Series([4, 5, None], dtype="Int64") 0 4 1 5 2 dtype: Int64
Либо можно задать pd.NA напрямую:
> pd.Series([4, 5, pd.NA], dtype="Int64") 0 4 1 5 2 dtype: Int64
Для строковых и boolean значений это работает аналогично:
> pd.Series([None, "test2", "test3"]) 0 None 1 test2 2 test3 dtype: object > pd.Series([None, "test2", "test3"], dtype='string') 0 1 test2 2 test3 dtype: string > pd.Series([True, False, None]) 0 True 1 False 2 None dtype: object > pd.Series([True, False, None], dtype='boolean') 0 True 1 False 2 dtype: boolean
Типы pandas для работы со строками и boolean-значениями
Появился тип StringDtype для работы со строковыми данными (до этого строки хранились в object-dtype NumPy массивах). При создании структуры pandas необходимо указать тип StringDtype либо string:
> pd.Series([None, "test2", "test3"], dtype=pd.StringDtype()) 0 1 test2 2 test3 dtype: string > pd.Series([None, "test2", "test3"], dtype='string') 0 1 test2 2 test3 dtype: string
Также добавлен тип BooleanDtype для хранения boolean значений. В предыдущих версиях столбец данных типа bool не мог содержать отсутствующие значения, тип BooleanDtype поддерживает эту возможность:
> pd.Series([False, True, None], dtype=pd.BooleanDtype()) 0 False 1 True 2 dtype: boolean > pd.Series([False, True, None], dtype='boolean') 0 False 1 True 2 dtype: boolean
Инструмент конвертирования типов
Метод convert_dtypes поддерживает работу с новыми типами:
> d = <"A":[None, "test2", "test3"], "B": [1, np.nan, 3], "C": [True, False, None], "D":[1, 2, None]>> df = pd.DataFrame(d) > df_conv = df.convert_dtypes() > df

> df_conv

> df.dtypes A object B float64 C object D float64 dtype: object > df_conv.dtypes A string B Int64 C boolean D Int64 dtype: object
Конвертор в markdown
В pandas 1.0 добавлен метод to_markdown() для конвертирования структур pandas в markdown таблицы:
> d = <"A":[None, "test2", "test3"], "B": [1, np.nan, 3], "C": [True, False, None], "D":[1, 2, None]>> df = pd.DataFrame(d) > print(df.to_markdown()) | | A | B | C | D | |---:|:------|----:|:------|----:| | 0 | | 1 | True | 1 | | 1 | test2 | nan | False | 2 | | 2 | test3 | 3 | | nan | > s = pd.Series([None, "test2", "test3"], dtype='string') > print(s.to_markdown()) | | 0 | |---:|:------| | 0 | | | 1 | test2 | | 2 | test3 |
Еще изменения и дополнения…
- Ускорение работы функций rolling.apply и expanding.apply;
- Возможность игнорирования индекса при сортировке DataFrame:
> df = pd.DataFrame() > df

> df.sort_values("A")

> df.sort_values("A", ignore_index=True)

- Более информативный info()
> d = <"A":[None, "test2", "test3"], "B": [1, np.nan, 3], "C": [True, False, None], "D":[1, 2, None]>> df = pd.DataFrame(d).convert_dtypes() > df.info() RangeIndex: 3 entries, 0 to 2 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 A 2 non-null string 1 B 2 non-null Int64 2 C 2 non-null boolean 3 D 2 non-null Int64 dtypes: Int64(2), boolean(1), string(1) memory usage: 212.0 bytes
Более подробно про остальные изменения и дополнения можете прочитать на официальной странице сайта pandas.
P.S.
Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта . Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.
Что такое NAT? Для чего использую данный стандарт?
В этой статье рассмотрим сетевой стандарт NAT (Network Address Translation, с анг. трансляция сетевых адресов). Идея и главное назначение NAT состоит в том, чтобы разрешить нескольким отдельным устройствам выходить и получать доступ в Интернет через один публичный адрес. Чтобы это осуществить требуется преобразование частного IP-адреса в общедоступный IP-адрес. Процесс и основные правила преобразования описаны в документации RFC 1631.
Что такое NAT?
Трансляция сетевых адресов (NAT) — это процесс, в котором один или несколько частных IP-адресов преобразуются в один или несколько публичных IP-адресов и наоборот, чтобы обеспечить доступ в Интернет для локальных узлов.
Кроме того, NAT выполняет преобразование номеров портов, то есть маскирует номер порта хоста другим номером порта в пакете, который будет направлен в пункт назначения. При этом NAT не только сохраняет пул общедоступных IP-адресов, но и скрывает схему адресации вашей сети. Затем он вносит соответствующие записи IP-адреса и номера порта в таблицу NAT.
Алгоритм работы технологии состоит в том, что когда клиент в сети отправляет какой-то запрос в Интернет, маршрутизатор пересылает запрос специальному устройству. NAT преобразует адрес отправителя в общедоступный IP-адрес устройства перед пересылкой запроса в Интернет и для дальнейшего получения информации с сервера.
Когда ответ получен от внешнего источника, NAT преобразует общедоступный IP-адрес в частный IP-адрес перед самой пересылкой пакета клиенту. Для этого NAT создает сопоставление между парой PrivateSrcIP, PrivateSrcPort и парой PublicSrcIP, PublicSrcPort, чтобы знать наверняка, как преобразовать IP-адрес назначения и номер порта назначения возвращающегося трафика. NAT обычно работает на маршрутизаторе или межсетевом экране.
Схематически это можно представить так (см. на рисунок ниже).
Преимущества и особенности NAT
Из преимуществ и особенностей NAT можно выделить:
1) скрывает внутреннюю структуру сети от посторонних глаз, неавторизованные пользователи не могут просматривать какие-либо системы, находящиеся за NAT, тем самым повышает безопасность сети;
2) решает частично вопрос в заканчиванием адресов типа IPv4;
3) предоставляет возможность использования одного IP-адреса для всей внутренней сети при подключении к Интернету.
Недостатки NAT
К недостаткам этой технологии можно отнести:
— что изменение IP-адреса может привести к усложнению поиска и решения созданной проблемы в сети;
— некоторые службы TCP/IP плохо взаимодействуют с NAT.
Важная часть использования NAT — это выбор типа трансляции адресов. Всего существует три типа трансляции адресов:
- статический NAT — сопоставляет один частный IP-адрес в один общедоступный (один к одному). Публичный IP-адрес всегда один и тот же;
- динамический NAT — сопоставляет частный IP-адрес с пулом общедоступных IP-адресов (один к многим);
- преобразование портов адресов (PAT) — относится к типу динамического NAT, который выполняет сопоставление нескольких частных IP-адресов одному общедоступному IP-адресу с использованием разных портов.
Применение NAT сейчас очень популярно в сетях поскольку оно поддерживается практически всеми операционными системами, брандмауэрами и приложениями. Если говорить об операционных системах, оптимальным выбором есть семейство UNIX.
Часто клиенты “ГиперХост” интересуются о запуске VPN на VPS/VDS с технологией NAT и спрашивают принцип доступа на наших серверах. Если Вам необходим NAT и Вы используете VPS, для открытия доступа и выполнения настроек, вам сначала необходимо открыть просто тикет с запросом в тех.поддержку. На VDS же клиент сразу может начать использовать и проделать необходимые ему настройки системы. Поэтому VDS сервер является лучшим решением для разворачивания такого типа VPN.
Как правильно проверить на Null\NaT поле фраймворка pandas и записать его в базу postgres?
Последняя колонка содержит «NaT» , в базе данных данное поле update_dt типа timestamp(0).
psycopg2.errors.InvalidDatetimeFormat: ОШИБКА: неверный синтаксис для типа timestamp: «NaT»
Если сделать так df = df.where(pd.notnull(df), ‘Null’).
psycopg2.errors.InvalidDatetimeFormat: ОШИБКА: неверный синтаксис для типа timestamp: «Null»
Как проверить на Null и записать данные timestamp не используя case (if) sql.
- Вопрос задан 21 дек. 2022
- 523 просмотра
2 комментария
Простой 2 комментария
mayton2019 @mayton2019
Две просьбы.
1) Придумай названия колонкам. Чтоб не мучать форум такими формами как «последняя колонка или пред-последняя»
2) Оформи это в виде таблицы — тогда ясность появляется и все можено порешать.

Модератор @TosterModerator
Фрагменты кода надо размещать в виде текста и оборачивать тэгом code для корректного отображения. Удобно делать кнопкой >
Это обязательно, см.п.3.8 Регламента.
Сюда же относится traceback, ввод и вывод в консоли и другая структурированная текстовая инфа.
Если таблицу обернуть тэгом, тоже будет выглядеть лучше.
Решения вопроса 1

Совершенствуюсь каждый день
В pandas можно использовать функцию isnull для проверки поля на наличие значения NaN (Not a Number) или NaT (Not a Time). Например, чтобы проверить поле update_dt на наличие значения NaT, можно использовать следующий код:
df[‘update_dt’].isnull()
Этот код вернет булевый сериес, где True указывает на то, что в соответствующей ячейке поля update_dt стоит значение NaT, а False — значение присутствует.
Чтобы записать эти данные в базу данных, можно использовать конструкцию INSERT INTO . SELECT . FROM с вложенным запросом. Вот пример такого запроса, который записывает в таблицу table_name все записи из df, где поле update_dt не равно NaT:
INSERT INTO table_name (column1, column2, . update_dt) SELECT column1, column2, . update_dt FROM df WHERE df['update_dt'].isnull() = False
numpy.isnat#
Test element-wise for NaT (not a time) and return result as a boolean array.
New in version 1.13.0.
Parameters : x array_like
Input array with datetime or timedelta data type.
out ndarray, None, or tuple of ndarray and None, optional
A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to. If not provided or None, a freshly-allocated array is returned. A tuple (possible only as a keyword argument) must have length equal to the number of outputs.
where array_like, optional
This condition is broadcast over the input. At locations where the condition is True, the out array will be set to the ufunc result. Elsewhere, the out array will retain its original value. Note that if an uninitialized out array is created via the default out=None , locations within it where the condition is False will remain uninitialized.
**kwargs
For other keyword-only arguments, see the ufunc docs .
Returns : y ndarray or bool
True where x is NaT, false otherwise. This is a scalar if x is a scalar.
>>> np.isnat(np.datetime64("NaT")) True >>> np.isnat(np.datetime64("2016-01-01")) False >>> np.isnat(np.array(["NaT", "2016-01-01"], dtype="datetime64[ns]")) array([ True, False])