ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

قراءة قاعدة بيانات PostgreSQL من TensorFlow IO

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تنزيل دفتر الملاحظات

نظرة عامة

يوضح هذا البرنامج التعليمي كيفية إنشاء tf.data.Dataset من خادم قاعدة بيانات PostgreSQL ، بحيث يمكن تمرير Dataset تم إنشاؤها إلى tf.keras لأغراض التدريب أو الاستدلال.

تعد قاعدة بيانات SQL مصدرًا مهمًا للبيانات لعالم البيانات. باعتبارها واحدة من أكثر قاعدة بيانات SQL مفتوحة المصدر شعبية ، يتم استخدام PostgreSQL على نطاق واسع في المؤسسات لتخزين البيانات النقدية والمعاملات عبر اللوحة. يمكن أن يؤدي إنشاء Dataset البيانات من خادم قاعدة بيانات PostgreSQL مباشرة وتمرير Dataset إلى tf.keras للتدريب أو الاستدلال إلى تبسيط خط البيانات بشكل كبير ومساعدة عالم البيانات على التركيز على بناء نماذج التعلم الآلي.

الإعداد والاستخدام

قم بتثبيت حزم tensorflow-io المطلوبة ، وأعد تشغيل وقت التشغيل

 try:
  %tensorflow_version 2.x
except Exception:
  pass

!pip install -q tensorflow-io
 

تثبيت وإعداد PostgreSQL (اختياري)

لعرض الاستخدام على Google Colab ، ستقوم بتثبيت خادم PostgreSQL. هناك حاجة أيضًا إلى كلمة المرور وقاعدة بيانات فارغة.

إذا كنت لا تشغل هذا الكمبيوتر الدفتري على Google Colab ، أو تفضل استخدام قاعدة بيانات موجودة ، فيرجى تخطي الإعداد التالي والمتابعة إلى القسم التالي.

 # 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

إعداد المتغيرات البيئية اللازمة

تعتمد المتغيرات البيئية التالية على إعداد PostgreSQL في القسم الأخير. إذا كان لديك إعداد مختلف أو كنت تستخدم قاعدة بيانات موجودة ، فيجب تغييرها وفقًا لذلك:

 %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

لأغراض العرض التوضيحي ، سيقوم هذا البرنامج التعليمي بإنشاء قاعدة بيانات وملء قاعدة البيانات ببعض البيانات. البيانات المستخدمة في هذا البرنامج التعليمي من مجموعة بيانات جودة الهواء ، وهي متاحة من UCI Machine Learning Repository .

فيما يلي معاينة مسبقة لمجموعة فرعية من مجموعة بيانات جودة الهواء:

التاريخ | الوقت | 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 |

يتوفر مزيد من المعلومات حول مجموعة بيانات جودة الهواء ومستودع التعلم الآلي UCI في قسم المراجع .

للمساعدة في تبسيط إعداد البيانات ، تم تحضير نسخة SQL من مجموعة بيانات جودة الهواء وهي متاحة على أنها AirQualityUCI.sql .

بيان إنشاء الجدول هو:

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

الأوامر الكاملة لإنشاء الجدول في قاعدة البيانات وملء البيانات هي:

 !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 واستخدامها في TensorFlow

إن إنشاء مجموعة بيانات من خادم PostgreSQL أمر سهل مثل استدعاء tfio.experimental.IODataset.from_sql باستخدام tfio.experimental.IODataset.from_sql query ونقاط endpoint . query هو query SQL لأعمدة التحديد في الجداول وسيطة endpoint هي العنوان واسم قاعدة البيانات:

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

كما ترى من ناتج dataset.element_spec أعلاه ، فإن عنصر Dataset تم إنشاؤه هو كائن dython dict مع أسماء أعمدة جدول قاعدة البيانات كمفاتيح:

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

من الملائم تطبيق عمليات أخرى. على سبيل المثال ، يمكنك تحديد كلاً من حقل nox و no2 في Dataset ، وحساب الفرق:

 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

Dataset تم إنشاؤها جاهزة لتمريرها إلى tf.keras مباشرة إما لأغراض التدريب أو الاستدلال.

المراجع

  • دوا ، د. وغراف ، سي (2019). مستودع تعلم الآلة UCI [ http://archive.ics.uci.edu/ml ]. ايرفين ، كاليفورنيا: جامعة كاليفورنيا ، كلية المعلومات وعلوم الكمبيوتر.
  • S. De Vito، E. Massera، M. Piga، L. Martinotto، G. Di Francia، On the Calibration of a anose Electronic to benzene beinence in an Urbanization Monitoring تلوث السيناريو، Sensors and Actuators B: Chemical، Volume 129، Issue 2 ، 22 فبراير 2008 ، الصفحات 750-757 ، ISSN 0925-4005