Trang này được dịch bởi Cloud Translation API.
Switch to English

Đọc sách cơ sở dữ liệu PostgreSQL từ TensorFlow IO

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải về máy tính xách tay

Tổng quat

Đây hướng dẫn chương trình như thế nào để tạo ra tf.data.Dataset từ một máy chủ cơ sở dữ liệu PostgreSQL, do đó tạo ra Dataset có thể được truyền cho tf.keras cho đào tạo hoặc suy luận mục đích.

Một cơ sở dữ liệu SQL là một nguồn quan trọng của dữ liệu cho nhà khoa học dữ liệu. Là một trong những cơ sở dữ liệu SQL mã nguồn mở phổ biến nhất, PostgreSQL được sử dụng rộng rãi trong các doanh nghiệp để lưu trữ dữ liệu critial và giao dịch trên bảng. Tạo Dataset từ một máy chủ cơ sở dữ liệu PostgreSQL trực tiếp và vượt qua Dataset để tf.keras cho đào tạo hoặc suy luận, rất có thể đơn giản hóa các nhà khoa học dữ liệu đường ống dữ liệu và giúp đỡ để tập trung xây dựng mô hình học máy.

Cài đặt và sử dụng

Cài đặt gói tensorflow-io yêu cầu, và thời gian chạy khởi động lại

 try:
  %tensorflow_version 2.x
except Exception:
  pass

!pip install -q tensorflow-io
 

Cài đặt và thiết lập PostgreSQL (không bắt buộc)

Để giới thiệu việc sử dụng trên Google Colab bạn sẽ cài đặt máy chủ PostgreSQL. Mật khẩu và một cơ sở dữ liệu sản phẩm nào cũng là cần thiết.

Nếu bạn không chạy máy tính xách tay này trên Google Colab, hoặc bạn thích sử dụng một cơ sở dữ liệu hiện có, xin vui lòng bỏ qua thiết lập sau đây và chuyển sang phần tiếp theo.

 # Install postgresql server
!sudo apt-get -y -qq update
!sudo apt-get -y -qq install postgresql
!sudo service postgresql start

# Setup a password `postgres` for username `postgres`
!sudo -u postgres psql -U postgres -c "ALTER USER postgres PASSWORD 'postgres';"

# Setup a database with name `tfio_demo` to be used
!sudo -u postgres psql -U postgres -c 'DROP DATABASE IF EXISTS tfio_demo;'
!sudo -u postgres psql -U postgres -c 'CREATE DATABASE tfio_demo;'
 
Preconfiguring packages ...
Selecting previously unselected package libpq5:amd64.
(Reading database ... 226072 files and directories currently installed.)
Preparing to unpack .../0-libpq5_10.12-0ubuntu0.18.04.1_amd64.deb ...
Unpacking libpq5:amd64 (10.12-0ubuntu0.18.04.1) ...
Selecting previously unselected package postgresql-client-common.
Preparing to unpack .../1-postgresql-client-common_190ubuntu0.1_all.deb ...
Unpacking postgresql-client-common (190ubuntu0.1) ...
Selecting previously unselected package postgresql-client-10.
Preparing to unpack .../2-postgresql-client-10_10.12-0ubuntu0.18.04.1_amd64.deb ...
Unpacking postgresql-client-10 (10.12-0ubuntu0.18.04.1) ...
Selecting previously unselected package ssl-cert.
Preparing to unpack .../3-ssl-cert_1.0.39_all.deb ...
Unpacking ssl-cert (1.0.39) ...
Selecting previously unselected package postgresql-common.
Preparing to unpack .../4-postgresql-common_190ubuntu0.1_all.deb ...
Adding 'diversion of /usr/bin/pg_config to /usr/bin/pg_config.libpq-dev by postgresql-common'
Unpacking postgresql-common (190ubuntu0.1) ...
Selecting previously unselected package postgresql-10.
Preparing to unpack .../5-postgresql-10_10.12-0ubuntu0.18.04.1_amd64.deb ...
Unpacking postgresql-10 (10.12-0ubuntu0.18.04.1) ...
Selecting previously unselected package postgresql.
Preparing to unpack .../6-postgresql_10+190ubuntu0.1_all.deb ...
Unpacking postgresql (10+190ubuntu0.1) ...
Selecting previously unselected package sysstat.
Preparing to unpack .../7-sysstat_11.6.1-1ubuntu0.1_amd64.deb ...
Unpacking sysstat (11.6.1-1ubuntu0.1) ...
Setting up sysstat (11.6.1-1ubuntu0.1) ...

Creating config file /etc/default/sysstat with new version
update-alternatives: using /usr/bin/sar.sysstat to provide /usr/bin/sar (sar) in auto mode
Created symlink /etc/systemd/system/multi-user.target.wants/sysstat.service → /lib/systemd/system/sysstat.service.
Setting up ssl-cert (1.0.39) ...
Setting up libpq5:amd64 (10.12-0ubuntu0.18.04.1) ...
Setting up postgresql-client-common (190ubuntu0.1) ...
Setting up postgresql-common (190ubuntu0.1) ...
Adding user postgres to group ssl-cert

Creating config file /etc/postgresql-common/createcluster.conf with new version
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql.service → /lib/systemd/system/postgresql.service.
Setting up postgresql-client-10 (10.12-0ubuntu0.18.04.1) ...
update-alternatives: using /usr/share/postgresql/10/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode
Setting up postgresql-10 (10.12-0ubuntu0.18.04.1) ...
Creating new PostgreSQL cluster 10/main ...
/usr/lib/postgresql/10/bin/initdb -D /var/lib/postgresql/10/main --auth-local peer --auth-host md5
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "C.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/10/main ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default timezone ... Etc/UTC
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    /usr/lib/postgresql/10/bin/pg_ctl -D /var/lib/postgresql/10/main -l logfile start

Ver Cluster Port Status Owner    Data directory              Log file
10  main    5432 down   postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
update-alternatives: using /usr/share/postgresql/10/man/man1/postmaster.1.gz to provide /usr/share/man/man1/postmaster.1.gz (postmaster.1.gz) in auto mode
Setting up postgresql (10+190ubuntu0.1) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for ureadahead (0.100.0-21) ...
Processing triggers for libc-bin (2.27-3ubuntu1.2) ...
Processing triggers for systemd (237-3ubuntu10.38) ...
ALTER ROLE
NOTICE:  database "tfio_demo" does not exist, skipping
DROP DATABASE
CREATE DATABASE

Thiết lập các biến môi trường cần thiết

Các biến môi trường sau đây được dựa trên các thiết lập PostgreSQL trong phần cuối. Nếu bạn có một thiết lập khác nhau hoặc bạn đang sử dụng một cơ sở dữ liệu hiện có, họ nên được thay đổi cho phù hợp:

 %env TFIO_DEMO_DATABASE_NAME=tfio_demo
%env TFIO_DEMO_DATABASE_HOST=localhost
%env TFIO_DEMO_DATABASE_PORT=5432
%env TFIO_DEMO_DATABASE_USER=postgres
%env TFIO_DEMO_DATABASE_PASS=postgres
 
env: TFIO_DEMO_DATABASE_NAME=tfio_demo
env: TFIO_DEMO_DATABASE_HOST=localhost
env: TFIO_DEMO_DATABASE_PORT=5432
env: TFIO_DEMO_DATABASE_USER=postgres
env: TFIO_DEMO_DATABASE_PASS=postgres

Chuẩn bị dữ liệu trong máy chủ PostgreSQL

Đối với bản demo mục đích hướng dẫn này sẽ tạo ra một cơ sở dữ liệu và cư trú trong cơ sở dữ liệu với một số dữ liệu. Dữ liệu sử dụng trong hướng dẫn này là từ chất lượng không khí Tập dữ liệu , có sẵn từ UCI Machine Learning Repository .

Dưới đây là một sneak xem trước của một tập hợp con của chất lượng không khí Tập dữ liệu:

Ngày | Time | CO (GT) | PT08.S1 (CO) | NMHC (GT) | C6H6 (GT) | PT08.S2 (NMHC) | NOx (GT) | PT08.S3 (NOx) | NO2 (GT) | PT08.S4 (NO2) | PT08.S5 (O3) | T | RH | AH | ---- | ---- | ------ | ----------- | -------- | -------- | --- ---------- | ---- | ---------- | ------- | ------------ | - --------- | - | - | - | 2004/10/03 | 18.00.00 | 2,6 | 1360 | 150 | 11,9 | 1046 | 166 | 1056 | 113 | 1692 | 1268 | 13,6 | 48,9 | 0,7578 | 2004/10/03 | 19.00.00 | 2 | 1292 | 112 | 9,4 | 955 | 103 | 1174 | 92 | 1559 | 972 | 13,3 | 47,7 | 0,7255 | 2004/10/03 | 20.00.00 | 2,2 | 1402 | 88 | 9,0 | 939 | 131 | 1140 | 114 | 1555 | 1074 | 11,9 | 54,0 | 0,7502 | 2004/10/03 | 21.00.00 | 2,2 | 1376 | 80 | 9,2 | 948 | 172 | 1092 | 122 | 1584 | 1203 | 11.0 | 60,0 | 0,7867 | 2004/10/03 | 22.00.00 | 1,6 | 1272 | 51 | 6,5 | 836 | 131 | 1205 | 116 | 1490 | 1110 | 11,2 | 59,6 | 0,7888 |

Thông tin thêm về chất lượng không khí Tập dữ liệu và UCI Machine Learning Repository là availabel trong Tài liệu tham khảo phần.

Để giúp đơn giản hóa việc chuẩn bị dữ liệu, một phiên bản sql của chất lượng không khí Tập dữ liệu đã được chuẩn bị và có sẵn như là AirQualityUCI.sql .

Báo cáo kết quả để tạo ra bảng là:

 CREATE TABLE AirQualityUCI (
  Date DATE,
  Time TIME,
  CO REAL,
  PT08S1 INT,
  NMHC REAL,
  C6H6 REAL,
  PT08S2 INT,
  NOx REAL,
  PT08S3 INT,
  NO2 REAL,
  PT08S4 INT,
  PT08S5 INT,
  T REAL,
  RH REAL,
  AH REAL
);
 

Các lệnh hoàn chỉnh để tạo ra các bảng trong cơ sở dữ liệu và cư trú trong dữ liệu là:

 !curl -s -OL https://github.com/tensorflow/io/raw/master/docs/tutorials/postgresql/AirQualityUCI.sql

!PGPASSWORD=$TFIO_DEMO_DATABASE_PASS psql -q -h $TFIO_DEMO_DATABASE_HOST -p $TFIO_DEMO_DATABASE_PORT -U $TFIO_DEMO_DATABASE_USER -d $TFIO_DEMO_DATABASE_NAME -f AirQualityUCI.sql
 

Tạo Dataset từ máy chủ PostgreSQL và sử dụng nó trong TensorFlow

Tạo một Dataset từ PostgreSQL máy chủ dễ dàng như gọi tfio.experimental.IODataset.from_sql với queryendpoint đối số. Các query là truy vấn SQL cho cột chọn trong các bảng và các endpoint đối số là địa chỉ và cơ sở dữ liệu và tên:

 import os
import tensorflow_io as tfio

endpoint="postgresql://{}:{}@{}?port={}&dbname={}".format(
    os.environ['TFIO_DEMO_DATABASE_USER'],
    os.environ['TFIO_DEMO_DATABASE_PASS'],
    os.environ['TFIO_DEMO_DATABASE_HOST'],
    os.environ['TFIO_DEMO_DATABASE_PORT'],
    os.environ['TFIO_DEMO_DATABASE_NAME'],
)

dataset = tfio.experimental.IODataset.from_sql(
    query="SELECT co, pt08s1 FROM AirQualityUCI;",
    endpoint=endpoint)

print(dataset.element_spec)
 
{'co': TensorSpec(shape=(), dtype=tf.float32, name=None), 'pt08s1': TensorSpec(shape=(), dtype=tf.int32, name=None)}

Như bạn có thể nhìn thấy từ đầu ra của dataset.element_spec trên, các yếu tố của tạo Dataset là một đối tượng python dict với tên cột của bảng cơ sở dữ liệu như là chìa khóa:

 {
  'co': TensorSpec(shape=(), dtype=tf.float32, name=None),
  'pt08s1': TensorSpec(shape=(), dtype=tf.int32, name=None),
}
 

Nó là khá thuận tiện để áp dụng hoạt động hơn nữa. Ví dụ, bạn có thể chọn cả hai noxno2 lĩnh vực của Dataset , và tính toán sự khác biệt:

 dataset = tfio.experimental.IODataset.from_sql(
    query="SELECT nox, no2 FROM AirQualityUCI;",
    endpoint=endpoint)

dataset = dataset.map(lambda e: (e['nox'] - e['no2']))

# check only the first 20 record
dataset = dataset.take(20)

print("NOx - NO2:")
for difference in dataset:
  print(difference.numpy())
 
NOx - NO2:
53.0
11.0
17.0
50.0
15.0
-7.0
-15.0
-14.0
-15.0
0.0
-13.0
-12.0
-14.0
16.0
62.0
28.0
14.0
3.0
9.0
34.0

Các tạo Dataset đã sẵn sàng để được chuyển tới tf.keras trực tiếp cho đào tạo hoặc suy luận hoặc mục đích bây giờ.

Người giới thiệu

  • Dua, D. và Graff, C. (2019). UCI Machine Learning Repository [ http://archive.ics.uci.edu/ml ]. Irvine, CA: Đại học California, Trường Thông tin và Khoa học Máy tính.
  • S. De Vito, E. Massera, M. Piga, L. Martinotto, G. Di Francia, Trên sân chuẩn của một chiếc mũi điện tử để ước lượng benzen trong một ô nhiễm đô thị giám sát kịch bản, cảm biến và thiết bị truyền động B: Hóa học, Tập 129, Issue 2, 22 tháng 2 năm 2008, trang 750-757, ISSN 0925-4005