Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Lesen der PostgreSQL-Datenbank von TensorFlow IO

Ansicht auf TensorFlow.org In Google Colab ausführen Quelle auf GitHub anzeigen Notizbuch herunterladen

Überblick

Dieses Tutorial zeigt, wie Sietf.data.Dataset von einem PostgreSQL-Datenbankserver erstellen, damit das erstellte Dataset zu Schulungs- oder Inferenzzwecken an tf.keras übergeben werden kann.

Eine SQL-Datenbank ist eine wichtige Datenquelle für Data Scientist. Als eine der beliebtesten Open-Source-SQL-Datenbanken wird PostgreSQL in Unternehmen häufig zum allgemeinen Speichern von kritischen Daten und Transaktionsdaten verwendet. Erstellen Dataset aus einer Datenbank PostgreSQL - Server direkt und den Pass Dataset zu tf.keras für die Ausbildung oder Folgerung, könnte die Datenpipeline und Hilfedaten Wissenschaftler auf dem Aufbau von Maschinen-Lernmodellen konzentrieren erheblich vereinfachen.

Einrichtung und Verwendung

Installieren Sie die erforderlichen Tensorflow-io-Pakete und starten Sie die Laufzeit neu

try:
  %tensorflow_version 2.x
except Exception:
  pass

!pip install -q tensorflow-io

PostgreSQL installieren und einrichten (optional)

Um die Verwendung in Google Colab zu demonstrieren, installieren Sie den PostgreSQL-Server. Das Passwort und eine leere Datenbank werden ebenfalls benötigt.

Wenn Sie dieses Notizbuch nicht in Google Colab ausführen oder eine vorhandene Datenbank bevorzugen, überspringen Sie bitte das folgende Setup und fahren Sie mit dem nächsten Abschnitt fort.

# 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 ... 226094 files and directories currently installed.)
Preparing to unpack .../0-libpq5_10.14-0ubuntu0.18.04.1_amd64.deb ...
Unpacking libpq5:amd64 (10.14-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.14-0ubuntu0.18.04.1_amd64.deb ...
Unpacking postgresql-client-10 (10.14-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.14-0ubuntu0.18.04.1_amd64.deb ...
Unpacking postgresql-10 (10.14-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.14-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.14-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.14-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

Richten Sie die erforderlichen Umgebungsvariablen ein

Die folgenden Umgebungsvariablen basieren auf dem PostgreSQL-Setup im letzten Abschnitt. Wenn Sie ein anderes Setup haben oder eine vorhandene Datenbank verwenden, sollten diese entsprechend geändert werden:

%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

Bereiten Sie Daten auf dem PostgreSQL-Server vor

Für Demozwecke erstellt dieses Tutorial eine Datenbank und füllt die Datenbank mit einigen Daten. Die in diesem Lernprogramm verwendeten Daten stammen aus dem Luftqualitätsdatensatz , der im UCI Machine Learning Repository verfügbar ist.

Unten finden Sie eine Vorschau einer Teilmenge des Luftqualitätsdatensatzes:

Datum | Uhrzeit | 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 | ---- | ---- | ------ | ----------- | -------- | -------- | --- ---------- | ---- | ---------- | ------- | ------------ | - --------- | - | - | - | 10/03/2004 | 18.00.00 | 2,6 | 1360 | 150 | 11,9 | 1046 | 166 | 1056 | 113 | 1692 | 1268 | 13,6 | 48,9 | 0,7578 | 10/03/2004 | 19.00.00 | 2 | 1292 | 112 | 9,4 | 955 | 103 | 1174 | 92 | 1559 | 972 | 13,3 | 47,7 | 0,7255 | 10/03/2004 | 20.00.00 | 2,2 | 1402 | 88 | 9,0 | 939 | 131 | 1140 | 114 | 1555 | 1074 | 11,9 | 54,0 | 0,7502 | 10/03/2004 | 21.00.00 | 2,2 | 1376 | 80 | 9,2 | 948 | 172 | 1092 | 122 | 1584 | 1203 | 11,0 | 60,0 | 0,7867 | 10/03/2004 | 22.00.00 | 1,6 | 1272 | 51 | 6,5 | 836 | 131 | 1205 | 116 | 1490 | 1110 | 11,2 | 59,6 | 0,7888 |

Weitere Informationen zum Luftqualitätsdatensatz und zum UCI Machine Learning Repository finden Sie im Abschnitt Referenzen .

Um die Datenaufbereitung zu vereinfachen, wurde eine SQL-Version des Luftqualitätsdatensatzes erstellt, die als AirQualityUCI.sql verfügbar ist .

Die Anweisung zum Erstellen der Tabelle lautet:

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
);

Die vollständigen Befehle zum Erstellen der Tabelle in der Datenbank und zum Auffüllen der Daten sind:

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

Erstellen Sie einen Datensatz vom PostgreSQL-Server und verwenden Sie ihn in TensorFlow

Das Erstellen eines Datensatzes vom PostgreSQL-Server ist so einfach wie das Aufrufen von tfio.experimental.IODataset.from_sql mit query und endpoint . Die query ist die SQL-Abfrage für ausgewählte Spalten in Tabellen, und das endpoint ist die Adresse und der Datenbankname:

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)}

Wie Sie aus der obigen Ausgabe von dataset.element_spec , ist das Element des erstellten Dataset ein Python-Dict-Objekt mit Spaltennamen der Datenbanktabelle als Schlüssel:

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

Es ist sehr praktisch, weitere Operationen anzuwenden. Zum Beispiel könnten Sie beide wählen nox und no2 Feld des Dataset , und berechnen den Unterschied:

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

Die erstellte Dataset bereit ist, weitergegeben werden tf.keras jetzt entweder Training oder Inferenz Zwecke direkt.

Verweise

  • Dua, D. und Graff, C. (2019). UCI Machine Learning Repository [ http://archive.ics.uci.edu/ml ]. Irvine, CA: Universität von Kalifornien, School of Information and Computer Science.
  • S. De Vito, E. Massera, M. Piga, L. Martinotto, G. Di Francia, Zur Feldkalibrierung einer elektronischen Nase zur Benzolschätzung in einem Szenario zur Überwachung der städtischen Umweltverschmutzung, Sensoren und Aktoren B: Chemikalie, Band 129, Ausgabe 2, 22. Februar 2008, Seiten 750-757, ISSN 0925-4005