برنامه نویسی، داده کاوی ۱۵۰۲ بازدید

در این مطلب، با مبحث مهندسی داده آشنا خواهید شد. بدون شک، «مهندسی داده» (Data Engineer) یکی از سخت‌ترین جنبه‌های «علم داده» (Data Science) محسوب می‌شود. اگرچه مهندسی داده نقش زیادی در بخش «تحلیل داده» (Data Analysis) در حوزه علم داده ندارد، با این حال، به عنوان Back-End سیستم‌های تحلیل داده و علم داده محسوب می‌شود. منظور از Back-End در تعریف مهندسی داده به عنوان بخشی از علم داده، «سیستم‌های پایگاه داده‌ای» (Database Systems) است که تمامی «دانشمندان علم داده» (Data Scientists) به نحوی با آن سر و کار دارند.

در این مطلب، برای روشن‌تر شدن مفهوم مهندسی داده برای خوانندگان و مخاطبان، مباحث زیر مورد بررسی قرار می‌گیرند:

  • تولید یک برنامه کاربردی مبتنی بر Django با «سیستم‌های مدیریت پایگاه داده رابطه‌ای» (Relational Database Management System | RDBMS).
  • نمایش چگونگی استفاده از پایگاه داده PostgresSQL  متصل به برنامه کاربردی مبتنی بر Django.
  • چگونگی جابجا کردن داده‌ها میان «قالب‌ها» (Formats) و «پلتفرم‌های» (Platforms) مختلف.

مهندسی داده

با اینکه برای درک مفاهیم موجود در این مطلب نیازی به دانش اولیه در مورد پلتفرم Django وجود ندارد، با این حال ذکر این نکته حائز اهمیت است که بسیاری از اقدامات مرتبط با جمع‌آوری داده‌ها، از طریق بسترها یا برنامه‌های کاربردی مبتنی بر وب انجام می‌گیرد. در نتیجه، آشنایی با پلتفرمی نظیر Django، فرایند جمع‌آوری و مدیریت داده‌ها در برنامه‌های کاربردی تحت وب را به مراتب ساده‌تر می‌کند.

پلتفرم Django برای بسیاری از دانشمندان داده که با مبحث مهندسی داده سر و کار دارند، ابزاری بسیار محبوب و آشنا محسوب می‌شود. پلتفرم Django، چارچوبی برای ساختن «برنامه‌های کاربردی تحت وب» (Web Applications) فراهم می‌آورد که از فلسفه «وارونگی کنترل» (Inversion of Control) در «مهندسی نرم‌افزار» (Software Engineering) تبعیت می‌کند.

وارونگی کنترل، یک اصل در مهندسی نرم‌افزار است که «جریان کنترل» (Flow of Control) را در برنامه‌های کاربردی، در مقایسه با کنترل جریان مرسوم، معکوس می‌کند. به عبارت دیگر، پلتفرم Django اسکلت (Skeleton) برنامه کاربردی تحت وب را فراهم می‌کند و کاربر یا برنامه‌نویس وظیفه دارد محتویات اصلی و لازم برای عملکرد صحیح برنامه کاربردی تحت وب را فراهم آورد. به بیان ساده‌تر، پلتفرم Django امکانات زیرساختی، نرم‌افزاری و برنامه‌نویسی لازم برای مهندسی داده در برنامه کاربردی تحت وب را فراهم می‌آورد.

مهندسی داده

مهندسی داده در Django

برای اینکه مکانیزم مهندسی داده توسط Django در پایتون آموزش داده شود، نحوه کدنویسی برنامه‌ای به نام DoubleBagger نمایش داده خواهد شد. این برنامه کاربردی، یک «وبلاگ» (Blog) ویژه مسائل سرمایه‌گذاری است که مردم، نظر خود را در مورد خرید یا فروش سهام شرکت‌های عرضه شده در بازار بورس نظیر اپل (APPLE | AAPL) یا مایکروسافت (MICROSOFT | MSFT) با دیگر افراد به اشتراک می‌گذارند.

همچنین، در این مطلب به جای استفاده از «محیط‌های توسعه یکپارچه» (Integrated Development Environments | IDEs) نظیر PyCharm و Jupyter Notebook، از یک واسط خط دستور (Command Line Interface) و یک «ویرایشگر منبع کد» (Source Code Editor) به نام Sublime Text استفاده می‌شود.

علاوه بر این، از آنجایی که برنامه کاربردی مرتبط با علم داده است، از محیط Conda برای نصب کتابخانه‌ها و بسته‌های نرم‌افزاری و همچنین، ایجاد «محیط‌های مجازی» (Virtual Environment) استفاده می‌شود.

# I like to do things on my desktop
# From the terminal:
$ cd desktop && mkdir doublebagger && cd doublebagger
$ conda create -n doublebagger
$ conda activate doublebagger
# You should now have the (doublebagger) conda environment activated

برای ساختن برنامه کاربردی مورد نظر، نیاز است تا دو کتابخانه‌های مهم زبان پایتون توسط Conda نصب شوند؛ کتابخانه Django و کتابخانه psycopg2 برای متصل شدن به پایگاه‌های داده PostgreSQL. استفاده از SQLite برای بسیاری از نیازهای سازمانی شرکت‌ها و یا کسانی که به شکل سرگرمی برنامه‌نویسی انجام می‌دهند، مناسب است. با این حال، در این برنامه کاربردی، برای استفاده از قابلیت پایگاه داده از پایگاه‌های داده PostgreSQL استفاده می‌شود. علاوه براین، برای پیاده‌سازی برنامه کاربردی و توسعه پروژه مهندسی داده، از نسخه 1.9.6 کتابخانه Django استفاده می‌شود.

$ (doublebagger) conda install Django==1.9.6 psycopg2

پس از اطمینان از این موضوع که علاوه بر کتابخانه‌های برنامه‌نویسی، «وابستگی‌های» (Dependencies) آن‌ها نیز به درستی روی سیستم نصب شده‌اند، یک دایرکتوری به نام src ایجاد می‌شود تا تمامی کدهای منبع و کدهای جانبی مرتبط با برنامه Doublebagger در این دایرکتوری ذخیره شوند.

$ (doublebagger) mkdir src && cd src

در مرحله بعد، از قطعه کدهای زیر برای ایجاد یک پروژه‌ Django و شروع کد نویسی برنامه کاربردی Doublebagger استفاده می‌شود:

# Inside of src:
# don't forget the space and period at the end
$ (doublebagger) django-admin startproject doublebagger_blog .

دستور  django-admin startproject command همان دستوری است که به وسیله آن، اسکلت یا چارچوب لازم برای برنامه کاربردی تحت وب فراهم می‌شود. با دقت به ساختار پوشه‌بندی برنامه کاربری ایجاد شده، پوشه src ساختاری مشابه با شکل زیر خواهد داشت:

  • پوشه doublebagger_blog: تنظیمات مرتبط با پروژه از جمله فایل settings.py، در این پوشه قرار دارد.
  • پوشه manage.py: در این پوشه، فایل‌های مرتبط با utility function پروژه ذخیره می‌شود.

پس از انجام مراحل فوق، کاربر یا برنامه‌نویس قادر خواهد بود تا پروژه مهندسی داده ایجاد شده با نام DoubleBagger را درون Sublime Text یا هر ویرایشگر کد دیگری باز کند. ساختار دایرکتوری ایجاد شده برای پروژه DoubleBagger، باید به شکل زیر باشد:

مهندسی داده

با فرض اینکه، نرم‌افزار مدیریت پایگاه داده PostgreSQL روی سیستم کاربر یا برنامه‌نویس نصب شده باشد، در مرحله بعد لازم است تا یک پایگاه داده PostgreSQL برای پروژه مهندسی داده (DoubleBagger) ایجاد شود:

# from the command line:
$ psql -d postgres
postgres=# CREATE DATABASE doublebagger;
# That's it!
# quit by:
postgres=# \q

در ادامه نیاز است تا فایل settings.py توسط کاربر یا برنامه‌نویس در نرم‌افزار ویرایشگر کد Sublime Text باز شود. پس از باز کردن فایل، محتویات آن به شکل زیر خواهد بود:

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

برای اینکه بتوان پروژه مهندسی داده ایجاد شده را به پایگاه داده تولید شده متصل کرد، لازم است تا محتویات پیش‌فرض موجود در فایل settings.py را با محتویات زیر تغییر داد و تغییرات انجام شده را نیز در ویرایشگر کد ذخیره کرد:

# Your 'User' is probably different depending on how you set up 
# postgres.  In many cases, it's just 'postgres'.
# Also depends if you set up a password with you postgres.
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'doublebagger',
        'USER': 'WhoeverOwnsTheDatabase',
        'PASSWORD': '',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

در مرحله بعد، برای متصل کردن پروژه مهندسی داده و برنامه کاربردی تحت وب به پایگاه داده PostgreSQL، لازم است تا قطعه کدهای زیر در واسط خط دستوری اجرا شوند:

# Still inside of your src where manage.py lives:
$ (doublebagger) python manage.py migrate

اگر اجرای تمامی کدهای نمایش داده شده در مراحل بالا با موفقیت انجام شود، پیغام‌هایی مانند شکل زیر در خروجی نمایش داده خواهد شد:

مهندسی داده

سپس، در همان واسط خط دستوری، دستور زیر اجرا می‌شود:

$ (doublebagger) python manage.py runserver

با اجرای دستور بالا، آدرس یک «سرور محلی» (Local Server)، همانند آدرس زیر، نمایش داده خواهد شد:

127.0.0.1:8000

با باز کردن آدرس سرور محلی نمایش داده شده در «مرورگر وب» (Browser)، کاربر یا برنامه‌نویس، با پیغامی همانند پیغام زیر روبرو خواهد شد:

مهندسی داده

صفحه‌ای که در نتیجه باز کردن آدرس سرور محلی باز خواهد شد، در اصل «صفحه نخست» (Homepage) برنامه کاربردی تحت وب است. این صفحه در «سرورهای توسعه محلی» (Local Development Server) کتابخانه Django اجرا می‌شود و هدف آن، همانند سازی اجرای برنامه کاربردی تولید شده در «وب سرور» (Web Server) واقعی است. برای خارج شدن از حالت سرورهای توسعه محلی Django، از فشار دادن همزمان کلیدهای control-C استفاده می‌شود.

مهندسی داده در برنامه‌های کاربردی تحت وب

دلیل استفاده از Django و پایگاه داده PostgreSQL در پروژه‌های مهندسی داده این است که مدل‌های Django، قابلیتی تحت عنوان «نگاشت کننده مدل اشیاء به مدل رابطه‌ای» (Object Relational Mapper | ORM) در اختیار برنامه‌نویسان و توسعه دهندگان برنامه‌های کاربردی تحت وب قرار می‌دهد. این قابلیت به برنامه‌نویسان و توسعه‌دهنگان اجازه می‌دهد تا «اشیاء» (Objects) مدل را با استفاده از زبان پایتون و زمانی که برنامه کاربردی تحت وب به پایگاه داده PostgreSQL متصل است، دستکاری کنند.

ویژگی ORM، یکی از لایه‌های پیچیده پایتون و Django در تعریف و مدیریت «اکوسیستم‌های علم داده» (Data Science Ecosystems) محسوب می‌شود. از این مرحله به بعد، ساختار داده‌ها در برنامه کاربردی تحت وب و پروژه مهندسی داده در حال توسعه تعریف می‌شوند. برنامه کاربردی تحت وب در حال توسعه، دو «مؤلفه» (Component) یا «کلاس مدل» (Model Class) خواهد داشت:

  • مؤلفه Post: نمایش دهنده پست‌هایی از وبلاگ است که در رابطه با خرید یا فروش سهام یک شرکت خاص بحث می‌کنند.
  • مؤلفه Company: نمایش دهنده اطلاعات مرتبط با شرکت‌هایی است که در پست‌های وبلاگ از آن‌ها نام برده می‌شود.

مؤلفه Post، اطلاعات زیر را شامل خواهد شد:

  • عنصر title: عنوان پست منتشر شده در وبلاگ.
  • شناسه slug: شناسه یکتا برای هر کدام از پست‌های وبلاگ، که بر اساس عنوان پست‌ها ساخته می‌شود.
  • عنصر text: متن واقعی پست‌های وبلاگ.
  • عنصر pub_date: زمان انتشار پست‌های وبلاگ را نشان می‌دهد.

مؤلفه Company نیز، اطلاعات زیر را شامل خواهد شد:

  • عنصر name: نام شرکتی که پست‌های وبلاگ، اطلاعات خاصی در مورد سهام آن‌ها منتشر می‌کند.
  • عنصر slug: شناسه یکتا برای شرکت.
  • عنصر description: اطلاعات مرتبط با حیطه وظایف شرکت را نمایش می‌دهد.
  • عنصر PE Ratio: ارزش‌گذاری شرکت‌ها نسبت به قیمت بازار را نشان می‌دهد.

پیش از اینکه بتوان کدهای لازم برای پیاده‌سازی مؤلفه‌های Post و Company و عناصر موجود در هر کدام از این مدل‌های Django را نمایش داد، لازم است تا ابتدا یک برنامه کاربردی تحت وب Django، با استفاده از دستورات زیر تولید شود:

# We're going to call our app 'post'
# Inside of src from terminal:
$ (doublebagger) python manage.py startapp post

پس از اجرای دستورات فوق، پوشه مرتبط با یک برنامه کاربردی به نام post، مانند شکل زیر، در وایشگر کد قابل مشاهده خواهد بود:

مهندسی داده

در مرحله بعد لازم است تا برنامه post به قسمت INSTALLED_APPS در فایل settings.py الحاق و تغییرات انجام شده ذخیره شود:

# settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'post', 
]
# Don't forget to save changes

پس از انجام مراحل فوق، وقت آن فرا می‌رسد تا ساختار داده‌ها، از طریق اضافه کردن قطعه کدهای زیر به فایل models.py در پوشه post مشخص شود:

# post/models.py
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Post(models.Model):
 title = models.CharField(max_length=100)
 slug  = models.SlugField()
 text  = modelsle.TextField()
 pub_date = models.DateField()
class Company(models.Model):
 name = models.CharField(max_length=100)
 slug = models.SlugField()
 description = models.TextField()
 pe_ratio = models.DecimalField(max_digits=7, decimal_places=2)

مهندسی داده

یکی از مهم‌ترین جنبه‌های مدل‌های تولید شده که باید مد نظر قرار داده شود این است که دو مدل (مؤلفه) تولید شده چگونه با یکدیگر ارتباط دارند. اگر با دید SQL به کدهای بالا و مؤلفه‌های تولید شده توسط آن‌ها نگاه شود، مشخص می‌شود که مؤلفه‌های Post و Company، ساختار «جدولی» (Tabular) دارند و «فیلدهایی» (Fields) نظیر title ،pub_date و slug، «ستون‌های» (Columns) موجود در دو جدول را نمایش می‌دهند.

بنابراین، اگر با دید SQL به دو مدل یا مؤلفه تولید شده نگاه شود، لازم است تا رابطه میان آن‌ها نیز مشخص شود:

  • رابطه «یک به چند» (One-to-Many) یا «چند به یک» (Many-to-One)
  • رابطه «چند به چند» (Many-to-Many)

با در نظر گرفتن جمله زیر، به راحتی مشخص می‌شود که رابطه چند به یک میان مدل‌های (مؤلفه‌های) Post و Company وجود دارد.

One blog post can only be an investment thesis about one company, but one company can have many blog posts written about it.

در نتیجه، برای مدل‌سازی ساختار داده‌ها توسط پایگاه‌های داده رابطه‌ای نیاز است تا مدل Post، یک «کلید خارجی» (Foreign Key) به مدل Company داشته باشد. ویژگی مهم کتابخانه Django، سادگی استفاده از آن است. کتابخانه Django، غالب عملیات لازم جهت ساختن یک مدل پایگاه داده‌ را مدیریت می‌کند؛ لازم نیست تا «کلیدهای اصلی» (Primary Keys) به طور صریح تعریف شوند و نیازی به تعریف «شاخص‌ها» (Indexes) یا «جداول اتصالی» (Junction Tables) در روابط چند به چندی وجود ندارد.

با استفاده از پلتفرم Django، کلید خارجی به شکل زیر به مدل Post اضافه می‌شود:

# post/models.py
class Post(models.Model):
 title = models.CharField(max_length=100)
 slug  = models.SlugField()
 text  = modelsle.TextField()
 pub_date = models.DateField()
 company = models.ForeignKey('Company') # Here

اضافه کردن برخی پارامترهای اضافی و «توابع رشته‌ای» (String Methods)، به سیستم اجازه می‌دهد تا به «اشیاء مدل» (Model Objects) توسط نام رشته‌ای آن‌ها ارجاع دهد. بنابراین، مدل Post به‌روزرسانی شده و نهایی، در پروژه مهندسی داده در حال توسعه، به شکل زیر خواهد بود:

# post/models.py
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Post(models.Model):
 title = models.CharField(max_length=100)
 slug  = models.SlugField(max_length=50, unique_for_month='pub_date')
 text  = models.TextField()
 pub_date = models.DateField('date_published', auto_now_add=True)
 company = models.ForeignKey('Company')
def __str__(self):
  return "{} on {}".format(
   self.title,
   self.pub_date.strftime('%Y-%m-%m'))
class Meta:
  verbose_name = 'investment thesis'
  ordering = ['-pub_date', 'title']
  get_latest_by = 'pub_date'
class Company(models.Model):
 name = models.CharField(max_length=100, db_index=True)
 slug = models.SlugField(max_length=50, unique=True)
 description = models.TextField()
 pe_ratio = models.DecimalField(max_digits=7, decimal_places=2)
def __str__(self):
  return self.name
class Meta:
  ordering = ['name']
# Don't forget to save your changes

در مرحله بعد و از طریق اجرای دستورات زیر در واسط خط فرمان، کتابخانه Django یک پایگاه داده postgreSQL برای پروژه مهندسی داده در حال توسعه ایجاد می‌کند.

$ (doublebagger) python manage.py makemigrations
# Then 
$ (doublebagger) python manage.py migrate
# That's it!

با اجرای دستورات بالا، خروجی‌هایی مانند شکل زیر تولید می‌شود:

مهندسی داده

مهندسی داده با استفاده از نگاشت کننده مدل اشیاء به مدل رابطه‌ای در Django

در این مرحله و پس از مقدمه‌سازی‌های انجام شده، دانشمند داده، برنامه‌نویس یا توسعه‌دهنده وب قادر خواهد بود با پایگاه داده postgreSQL، تنها با استفاده از زبان پایتون، تعامل داشته باشد. برای چنین کاری کافی است تا با استفاده از واسط خط دستوری، مجموعه دستورات زیر، خط به خط اجرا شوند:

$ (doublebagger) python manage.py shell

با اجرای این دستور، واسطی مانند واسط shell در مفسر پایتون در اختیار کاربر قرار داده می‌شود؛ با این تفاوت که چنین واسطی، امکان انجام عملیات و دستکاری پایگاه‌های داده Django را در اختیار کاربر و برنامه‌نویس قرار می‌دهد.

>>> from datetime import date
>>> from post.models import Post, Company

در مرحله بعد با استفاده از دستور زیر، شیء مرتبط با مدل (مؤلفه) Company ساخته خواهد شد:

>>> Company.objects.create(name='Apple', slug='Apple-incorporated-nasdaq', description='One of the greatest companies in the world created by the amazing Steve Jobs.', pe_ratio=14.43)

پس از اجرای دستور بالا، با پیغامی مانند پیغام زیر مواجه خواهید شد:

<Company: Apple>

به عبارت دیگر، با استفاده از دستور بالا و به کمک کتابخانه Django، مدلی برای شرکت APPLE ساخته شد؛ بدون اینکه نیازی به استفاده از دستورات زیر (دستورات دستکاری پایگاه‌های داده رابطه‌ای) وجود داشته باشد:

INSERT INTO company
(name, slug, description, pe_ratio)
VALUES
('Apple', 'Apple-incorporated-nasdaq', description='...', pe_ration=14.43);

در ادامه و با استفاده از مجموعه دستورات نمایش داده شده، مدل‌های مرتبط با شرکت‌های بیشتری در پایگاه داده تولید می‌شود:

>>> Company.objects.create(name='Amazon', slug='amzn-nasdaq', description='AWS baby!', pe_ratio=81.48)
>>> Company.objects.create(name='Microsoft', slug='msft-nasdaq', description='I love GitHub!', pe_ratio=26.02)
>>> Company.objects.create(name='MongoDB', slug='mdb-nasdaq', description='JSON in the cloud', pe_ratio=100)
>>> Company.objects.all()
# Output:
[<Company: Amazon>, <Company: Apple>, <Company: Microsoft>, <Company: MongoDB>]

بنابراین، تا اینجا پایگاه داده برنامه کاربردی در حال توسعه توسط رکوردها یا مدل‌های مرتبط با شرکت‌های مختلف به‌روزرسانی شده است. علاوه بر امکان دستکاری و به‌روزرسانی رکوردهای پایگاه داده، امکاناتی نظیر «پرس و جو» (Query) در پایگاه داده توسط دستورات زبان پایتون برای دانشمندان داده، برنامه‌نویسان و توسعه‌دهنگان فراهم شده است:

>>> Company.objects.get(slug__contains='mdb')
# Output:
<Company: MongoDB>

همچنین، امکان نمایش رکوردهای پایگاه داده در قالب «چندتایی» (Tuples) نیز وجود دارد:

>>> Company.objects.values_list()
# Output:
[(3, u'Amazon', u'amzn-nasdaq', u'AWS baby!', Decimal('81.48')), (1, u'Apple', u'Apple-incorporated-nasdaq', u'One of the greatest companies in the world created by the amazing Steve Jobs, not so currently under Tim Cook.', Decimal('14.43')), (2, u'Microsoft', u'msft-nasdaq', u'I love GitHub!', Decimal('26.02')), (4, u'MongoDB', u'mdb-nasdaq', u'JSON in the cloud', Decimal('100.00'))]

با استفاده از مجموعه دستورات زیر، شیء مرتبط با مدل (مؤلفه) Post ساخته خواهد شد:

>>> Post.objects.create(title='I heart Apple', slug='i-heart-apple', text='I heart Apple', company_id=1)
>>> Post.objects.create(title='Buy more Microsoft', slug='buy-more-microsoft', text="Nadella leads the way", company_id=2)
>>> Post.objects.create(title='Buy more Amazon', slug='buy-more-amazon', text="Jeff Bezos acquires Mars from Elon Musk", company_id=3)
>>> Post.objects.create(title='Time to sell MongoDB', slug='time-to-sell-mongdb', text="MongoDB seems a little overvalued", company_id=4)

برای اینکه بتوان اطمینان حاصل کرد که اشیاء مرتبط با مدل‌های Post و Company در پایگاه داده postgreSQL وجود دارند، می‌توان از دستورات زیر استفاده کرد:

$ psql -d postgres
postgres=# \c doublebagger
doublebagger=# \dt
doublebagger=# SELECT * FROM post_company;

با اجرای دستورات بالا، خروجی مانند شکل زیر در واسط خط دستوری نمایش داده خواهد شد:

مهندسی داده

همچنین، امکان استفاده از پرس و جوهای پیشرفته‌تری با استفاده از دستورات SQL Join وجود دارد:

doublebagger=# SELECT * FROM post_company
doublebagger=# JOIN post_post ON
doublebagger=# post_company.id = post_post.company_id;

مهندسی داده

مهندسی داده در پایگاه‌های داده postgreSQL با کتابخانه Pandas

با استفاده از کتابخانه sqlalchemy (مجموعه‌ای از ابزارها برای دستکاری پایگاه‌های داده رابطه‌ای و نگاشت کننده مدل اشیاء به مدل رابطه‌ای)، امکان دسترسی به اشیاء زبان SQL از طریق کتابخانه Pandas برای برنامه‌نویسان و توسعه‌دهندگان وب فراهم شده است.

با باز کردن یکی از «محیط‌های توسعه یکپارچه» (Integrated Development Environment) زبان پایتون نظیر Jupyter Notebook و اجرای دستورات زیر، می‌توان به راحتی به مدل‌های پایگاه داده رابطه‌ای دسترسی پیدا کرد:

import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('postgresql://sammylee@localhost:5432/doublebagger')
posts = pd.read_sql('select * from post_post', engine)
companies = pd.read_sql('select * from post_company', engine)
posts_companies = pd.merge(companies, posts, left_on='id', right_on='company_id')
posts_companies

مهندسی داده

بنابراین، با استفاده از  کتابخانه sqlalchemy و امکانات بسیار پیشرفته و قدرتمند کتابخانه Pandas، هر نوع عملیاتی که برای تحلیل و مهندسی داده نیاز است، می‌توان انجام داد. اگرچه دانش اولیه از پلتفرم Django برای توسعه تحت وب لازم نیست، با این حال، مسلط شدن به سازوکارهای تعریف شده در کتابخانه Django برای توسعه برنامه‌های کاربردی تحت وب و استفاده از کتابخانه‌های Pandas و sqlalchemy جهت دستکاری و دسترسی به مدل‌های پایگاه داده postgreSQL، می‌تواند نقش مهمی در تثبیت جایگاه برنامه‌نویس به عنوان یک دانشمند داده مسلط به مفاهیم مهندسی داده داشته باشد.

کلام آخر

کتابخانه Django، یک کتابخانه تمام عیار برای توسعه برنامه‌های کاربردی تحت وب محسوب می‌شود که مجموعه‌ای از کامل‌ترین ابزارها و امکانات را برای توسعه مؤلفه‌های اساسی برنامه‌های کاربردی تحت وب در اختیار کاربران قرار می‌دهد. همچنین، کتابخانه Django یک «واسط مدیریتی» (Administration Interface) در اختیار برنامه‌نویسان و توسعه‌دهندگان قرار می‌دهد که عملا نقش «واسط گرافیکی کاربری» (Graphical User Interface | GUI) برای پایگاه داده postgreSQL را ایفا می‌کند. تنها کاری که لازم است انجام شود این است که مجموعه کدهای زیر به فایل admin.py مدل Post اضافه شود:

# post/admin.py
from django.contrib import admin
from django.db import models
# Register your models here.
from .models import Post, Company
class MyCompanyAdmin(admin.ModelAdmin):
 model = Company
 list_display = ('name', 'slug', 'description', 'pe_ratio',)
admin.site.register(Company, MyCompanyAdmin)

و در مرحله بعد، یک superuser در واسط خط دستوری ایجاد شود:

$ (doublebagger) python manage.py createsuperuser
# Then create your credentials
# start up your local development server and head to your local host
# and append "/admin" to it

مهندسی داده

بنابراین، قالب نهایی فایل settings.py در پوشه doublebagger_blog، به شکل زیر خواهد بود:

"""
Django settings for doublebagger_blog project.
Generated by 'django-admin startproject' using Django 1.9.6.
For more information on this file, see
https://docs.djangoproject.com/en/1.9/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.9/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!


# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'post',
]

MIDDLEWARE_CLASSES = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'doublebagger_blog.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'doublebagger_blog.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'doublebagger',
        'USER': 'sammylee',
        'PASSWORD': '',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}


# Password validation
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/1.9/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/

STATIC_URL = '/static/'

همچنین، قالب نهایی فایل models.py در پوشه post، بدین شکل نمایش داده خواهد شد:

from __future__ import unicode_literals

from django.db import models

# Create your models here.
class Post(models.Model):
	title = models.CharField(max_length=100)
	slug  = models.SlugField(max_length=50, unique_for_month='pub_date')
	text  = models.TextField()
	pub_date = models.DateField('date_published', auto_now_add=True)
	company = models.ForeignKey('Company')

	def __str__(self):
		return "{} on {}".format(
			self.title,
			self.pub_date.strftime('%Y-%m-%m'))

	class Meta:
		verbose_name = 'investment thesis'
		ordering = ['-pub_date', 'title']
		get_latest_by = 'pub_date'


class Company(models.Model):
	name = models.CharField(max_length=100, db_index=True)
	slug = models.SlugField(max_length=50, unique=True)
	description = models.TextField()
	pe_ratio = models.DecimalField(max_digits=7, decimal_places=2)

	def __str__(self):
		return self.name

	class Meta:
		ordering = ['name']

کدهای کامل برنامه کاربردی تحت وب توسعه داده شده (DoubleBagger) از طریق لینک [+] قابل دسترسی است.

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۲ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«مرتضی جادریان»، دانشجوی مقطع دکتری مهندسی کامپیوتر گرایش هوش مصنوعی است. او در زمینه سیستم‌های هوشمند، به ویژه سیستم‌های هوشمند اطلاعاتی، روش‌های یادگیری ماشین، سیستم‌های دانش محور و محاسبات تکاملی فعالیت دارد.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد.