Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

TensorFlow IO'dan PostgreSQL veritabanını okuma

TensorFlow.org üzerinde görüntüle Google Colab'da yayınla Kaynağı GitHub'da görüntüle Not defterini indir

genel bakış

Bu öğretici, bir PostgreSQL veritabanı sunucusundan tf.data.Dataset nasıl oluşturulacağını gösterir, böylece oluşturulan Dataset eğitim veya çıkarım amacıyla tf.keras aktarılabilir.

SQL veritabanı, veri bilimcisi için önemli bir veri kaynağıdır. En popüler açık kaynak SQL veritabanlarından biri olan PostgreSQL , işletmelerde kritik ve işlemsel verileri depolamak için yaygın olarak kullanılmaktadır. Oluşturma Dataset doğrudan PostgreSQL veri sunucusundan ve pas Dataset için tf.keras büyük ölçüde makine öğrenme modellerini oluşturmak odaklanmak veri boru hattı ve yardım veri bilimcisi basitleştirmek olabilir, eğitim veya çıkarım için.

Kurulum ve kullanım

Gerekli tensorflow-io paketlerini yükleyin ve çalışma zamanını yeniden başlatın

 try:
  %tensorflow_version 2.x
except Exception:
  pass

!pip install -q tensorflow-io
 

PostgreSQL kurulumu ve kurulumu (isteğe bağlı)

Google Colab'daki kullanımın tanıtımını yapmak için PostgreSQL sunucusunu yükleyeceksiniz. Parola ve boş bir veritabanı da gereklidir.

Bu not defterini Google Colab'da çalıştırmıyorsanız veya mevcut bir veritabanını kullanmayı tercih ediyorsanız, lütfen aşağıdaki kurulumu atlayın ve sonraki bölüme geçin.

 # 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

Gerekli çevresel değişkenleri ayarlama

Aşağıdaki çevresel değişkenler, son bölümdeki PostgreSQL kurulumunu temel alır. Farklı bir kurulumunuz varsa veya mevcut bir veritabanını kullanıyorsanız, bunlar uygun şekilde değiştirilmelidir:

 %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

PostgreSQL sunucusunda veri hazırlama

Demo amaçlı olarak bu eğitici bir veritabanı oluşturacak ve veritabanını bazı verilerle dolduracaktır. Bu öğreticide kullanılan veriler, UCI Machine Learning Repository'den temin edilebilen Hava Kalitesi Veri Kümesidir .

Aşağıda, Hava Kalitesi Veri Kümesinin bir alt kümesinin kısa bir önizlemesi verilmiştir:

Tarih | Zaman | 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 |

Hava Kalitesi Veri Seti ve UCI Makine Öğrenimi Deposu hakkında daha fazla bilgi Referanslar bölümünde bulunabilir.

Veri hazırlamanın basitleştirilmesine yardımcı olmak için, Hava Kalitesi Veri Kümesinin bir sql versiyonu hazırlanmıştır ve AirQualityUCI.sql olarak mevcuttur .

Tablo oluşturma ifadesi:

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

Tabloyu veritabanında oluşturma ve verileri doldurma komutlarının tamamı şunlardır:

 !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
 

PostgreSQL sunucusundan Veri Kümesi oluşturun ve TensorFlow'da kullanın

PostgreSQL sunucusundan bir Veri Kümesi oluşturmak, query ve endpoint değişkenleriyle tfio.experimental.IODataset.from_sql çağırmak kadar kolaydır. query , tablolardaki seçim sütunları için SQL sorgusudur ve endpoint bağımsız değişkeni adres ve veritabanı adıdır:

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

Yukarıdaki dataset.element_spec çıktısından dataset.element_spec gibi, oluşturulan Dataset dataset.element_spec öğesi, veritabanı tablosunun sütun adlarını anahtar olarak içeren bir python dict nesnesidir:

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

Daha fazla işlem uygulamak oldukça uygundur. Örneğin, Dataset no2 hem nox hem de no2 alanını seçebilir ve farkı hesaplayabilirsiniz:

 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

Oluşturulan Dataset , artık eğitim veya çıkarım amacıyla doğrudan tf.keras aktarılmaya hazırdır.

Referanslar

  • Dua, D. ve Graff, C. (2019). UCI Makine Öğrenme Deposu [ http://archive.ics.uci.edu/ml ]. Irvine, CA: California Üniversitesi, Bilgi ve Bilgisayar Bilimleri Fakültesi.
  • De De Vito, E. Massera, M. Piga, L. Martinotto, G. Di Francia, Kentsel kirlilik izleme senaryosunda benzen tahmini için bir elektronik burnun sahada kalibrasyonu, Sensörler ve Aktüatörler B: Chemical, Cilt 129, Sayı 2, 22 Şubat 2008, Sayfa 750-757, ISSN 0925-4005