Python, Bash and SQL Essentials for Data Engineering Specialization
What you'll learn
Develop #dataengineering solutions with a minimal and essential subset of the Python language and the Linux environment
Design scripts to connect and query a #SQL #database using #Python
Use a #scraping library in Python to read, identify and extract data from websites
Enroll Free: https://www.coursera.org/specializations/python-bash-sql-data-engineering-duke
https://t.iss.one/DataScience4
What you'll learn
Develop #dataengineering solutions with a minimal and essential subset of the Python language and the Linux environment
Design scripts to connect and query a #SQL #database using #Python
Use a #scraping library in Python to read, identify and extract data from websites
Enroll Free: https://www.coursera.org/specializations/python-bash-sql-data-engineering-duke
https://t.iss.one/DataScience4
👍6
Python | Algorithms | Data Structures | Cyber Security | Networks
Photo
## 🔹 Advanced Widget Customization
### 1. Custom Delegate for Table Views
### 2. Custom Widget with QPainter
---
## 🔹 Best Practices
1. Separate database logic from UI code
2. Use transactions for batch database operations
3. Optimize chart performance with limited data points
4. Follow MVC pattern for complex applications
5. Document custom widgets thoroughly
---
### 📌 What's Next?
In Part 5, we'll cover:
➡️ Networking & Web APIs
➡️ Multimedia Applications
➡️ Internationalization
➡️ Deployment & Packaging
#PyQt5 #Database #DataVisualization 🚀
Practice Exercise:
1. Build a sales dashboard with database-backed charts
2. Create a custom weather widget with API data
3. Implement an MVC-based inventory management system
### 1. Custom Delegate for Table Views
class ProgressBarDelegate(QStyledItemDelegate):
def paint(self, painter, option, index):
progress = index.data(Qt.DisplayRole)
# Draw background
painter.save()
painter.setPen(Qt.NoPen)
painter.setBrush(QColor("#e0e0e0"))
painter.drawRect(option.rect)
# Draw progress
if progress > 0:
width = option.rect.width() * progress / 100
progress_rect = QRectF(option.rect)
progress_rect.setWidth(width)
gradient = QLinearGradient(progress_rect.topLeft(), progress_rect.topRight())
gradient.setColorAt(0, QColor("#4CAF50"))
gradient.setColorAt(1, QColor("#2E7D32"))
painter.setBrush(QBrush(gradient))
painter.drawRect(progress_rect)
# Draw text
painter.setPen(QColor("#333"))
painter.drawText(option.rect, Qt.AlignCenter, f"{progress}%")
painter.restore()
# Usage
table = QTableView()
table.setItemDelegateForColumn(2, ProgressBarDelegate())
### 2. Custom Widget with QPainter
class GaugeWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.value = 0
self.min_value = 0
self.max_value = 100
def set_value(self, value):
self.value = max(self.min_value, min(value, self.max_value))
self.update()
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
# Draw background
rect = self.rect().adjusted(5, 5, -5, -5)
painter.setPen(QPen(QColor("#333"), 2)
painter.setBrush(QColor("#f5f5f5"))
painter.drawEllipse(rect)
# Draw gauge
angle = 180 * (self.value - self.min_value) / (self.max_value - self.min_value)
span_angle = -angle * 16 # 1/16th of a degree
pen = QPen(QColor("#FF5722"), 10)
pen.setCapStyle(Qt.RoundCap)
painter.setPen(pen)
painter.drawArc(rect, 180 * 16, span_angle)
# Draw text
font = painter.font()
font.setPointSize(20)
painter.setFont(font)
painter.drawText(rect, Qt.AlignCenter, f"{self.value}%")
---
## 🔹 Best Practices
1. Separate database logic from UI code
2. Use transactions for batch database operations
3. Optimize chart performance with limited data points
4. Follow MVC pattern for complex applications
5. Document custom widgets thoroughly
---
### 📌 What's Next?
In Part 5, we'll cover:
➡️ Networking & Web APIs
➡️ Multimedia Applications
➡️ Internationalization
➡️ Deployment & Packaging
#PyQt5 #Database #DataVisualization 🚀
Practice Exercise:
1. Build a sales dashboard with database-backed charts
2. Create a custom weather widget with API data
3. Implement an MVC-based inventory management system
❤2👍1
🚀 Comprehensive Guide: How to Prepare for a Django Job Interview – 400 Most Common Interview Questions
Are you ready to get a job: https://hackmd.io/@husseinsheikho/django-mcq
#DjangoInterview #Python #WebDevelopment #Django #BackendDevelopment #RESTAPI #Database #Security #Scalability #DevOps #InterviewPrep
Are you ready to get a job: https://hackmd.io/@husseinsheikho/django-mcq
#DjangoInterview #Python #WebDevelopment #Django #BackendDevelopment #RESTAPI #Database #Security #Scalability #DevOps #InterviewPrep
❤6
# Django ORM Comparison - Know both frameworks
# Django model (contrast with SQLAlchemy)
from django.db import models
class Department(models.Model):
name = models.CharField(max_length=50)
class Employee(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
department = models.ForeignKey(Department, on_delete=models.CASCADE)
# Django query (similar but different syntax)
Employee.objects.filter(department__name="HR").select_related('department')
# Async ORM - Modern Python requirement
# Requires SQLAlchemy 1.4+ and asyncpg
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
async_engine = create_async_engine(
"postgresql+asyncpg://user:pass@localhost/db",
echo=True,
)
async_session = AsyncSession(async_engine)
async with async_session.begin():
result = await async_session.execute(
select(Employee).where(Employee.name == "Alice")
)
employee = result.scalar_one()
# Testing Strategies - Interview differentiator
from unittest import mock
# Mock database for unit tests
with mock.patch('sqlalchemy.create_engine') as mock_engine:
mock_conn = mock.MagicMock()
mock_engine.return_value.connect.return_value = mock_conn
# Test your ORM-dependent code
create_employee("Test", "[email protected]")
mock_conn.execute.assert_called()
# Production Monitoring - Track slow queries
from sqlalchemy import event
@event.listens_for(engine, "before_cursor_execute")
def before_cursor(conn, cursor, statement, params, context, executemany):
conn.info.setdefault('query_start_time', []).append(time.time())
@event.listens_for(engine, "after_cursor_execute")
def after_cursor(conn, cursor, statement, params, context, executemany):
total = time.time() - conn.info['query_start_time'].pop(-1)
if total > 0.1: # Log slow queries
print(f"SLOW QUERY ({total:.2f}s): {statement}")
# Interview Power Move: Implement caching layer
from functools import lru_cache
class CachedEmployeeRepository(EmployeeRepository):
@lru_cache(maxsize=100)
def get_by_id(self, employee_id):
return super().get_by_id(employee_id)
def invalidate_cache(self, employee_id):
self.get_by_id.cache_clear()
# Reduces database hits by 70% in read-heavy applications
# Pro Tip: Schema versioning in CI/CD pipelines
# Sample .gitlab-ci.yml snippet
deploy_db:
stage: deploy
script:
- alembic upgrade head
- pytest tests/db_tests.py # Verify schema compatibility
only:
- main
# Real-World Case Study: E-commerce inventory system
class Product(Base):
__tablename__ = 'products'
id = Column(Integer, primary_key=True)
sku = Column(String(20), unique=True)
stock = Column(Integer, default=0)
# Atomic stock update (prevents race conditions)
def decrement_stock(self, quantity, session):
result = session.query(Product).filter(
Product.id == self.id,
Product.stock >= quantity
).update({"stock": Product.stock - quantity})
if not result:
raise ValueError("Insufficient stock")
# Usage during checkout
product.decrement_stock(2, session)
By: @DATASCIENCE4 🔒
#Python #ORM #SQLAlchemy #Django #Database #BackendDevelopment #CodingInterview #WebDevelopment #TechJobs #SystemDesign #SoftwareEngineering #DataEngineering #CareerGrowth #APIs #Microservices #DatabaseDesign #TechTips #DeveloperTools #Programming #CareerTips
❤3
• Fetch related
• Fetch related
• Load only specific model fields.
• Defer loading of specific model fields.
• Execute raw, unmanaged SQL.
• Get results as a list of tuples.
XV. Transactions
• Import the transaction module.
• Run a block of code within a database transaction.
XVI. Managers & Model Methods
• Create a custom
• Add a custom method to a
• Add a custom method to a model for object-specific logic.
#Python #Django #ORM #Database #Backend
━━━━━━━━━━━━━━━
By: @DataScience4 ✨
ForeignKey objects in the same query.entries = Entry.objects.select_related('author').all()• Fetch related
ManyToManyField objects in a separate efficient query.entries = Entry.objects.prefetch_related('tags').all()• Load only specific model fields.
entries = Entry.objects.only('headline')• Defer loading of specific model fields.
entries = Entry.objects.defer('body_text')• Execute raw, unmanaged SQL.
authors = Author.objects.raw('SELECT * FROM myapp_author')• Get results as a list of tuples.
Entry.objects.values_list('headline', 'pub_date')XV. Transactions
• Import the transaction module.
from django.db import transaction
• Run a block of code within a database transaction.
with transaction.atomic():
# All database operations here are either committed together or rolled back.
author.save()
entry.save()
XVI. Managers & Model Methods
• Create a custom
Manager for common queries.class PublishedEntryManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status='published')
• Add a custom method to a
QuerySet via its Manager.Entry.objects.get_queryset().by_author("John Doe")• Add a custom method to a model for object-specific logic.
class Entry(models.Model):
#...
def is_recent(self):
return self.pub_date > timezone.now() - timedelta(days=1)
#Python #Django #ORM #Database #Backend
━━━━━━━━━━━━━━━
By: @DataScience4 ✨
❤1