The Data Wizard's Spellbook: Enchanting Python Incantations for Machine Learning

 

This blog post covers following four intermediate Python features commonly used in machine learning and data science in a story telling fun way which the  reader would definitely enjoy and appreciate :

1.      List Comprehensions

2.      Lambda Functions

3.      Decorators

4.      Generators

Each topic is explained with a practical example relevant to data science tasks, complete with code snippets and their corresponding outputs.

Let's begin the story.

In the mystical land of Pythonia, there lived a young data wizard named Lyra. She had mastered the basic spells of data manipulation but yearned to unlock more powerful incantations for her machine learning quests. One moonlit night, as she pored over ancient tomes in her tower, a shimmering book appeared on her desk: "The Intermediate Pythonist's Grimoire." As Lyra opened its pages, she was transported into a realm where code and magic intertwined. Join Lyra as she discovers four powerful spells that every data wizard should know!

 1.      The List Comprehension Charm: Conjuring Data with Elegance

Lyra found herself in a vast hall filled with floating data points. A wise sage approached, saying, "Welcome to the Chamber of Swift Transformations. Here, we use the List Comprehension Charm to transmute data with grace and speed."

Lyra learned that list comprehensions in Python are a concise way to create new lists based on existing ones, perfect for data preprocessing and feature engineering.

Let's cast the List Comprehension Charm:

Sample Code:--

import numpy as np 

# Generate some sample data

raw_data = np.random.randint(1, 100, size=20) 

# Traditional approach

squared_evens = []

for num in raw_data:

    if num % 2 == 0:

        squared_evens.append(num ** 2) 

# List comprehension approach

squared_evens_lc = [num ** 2 for num in raw_data if num % 2 == 0] 

print("Raw data:", raw_data)

print("Squared evens (traditional):", squared_evens)

print("Squared evens (list comprehension):", squared_evens_lc) 

Output:-

Raw data: [23 96 85 25 66 37 26 13  3 68 34 40 35 53 92 77 58 47 30 41]

Squared evens (traditional): [9216, 4356, 676, 4624, 1156, 1600, 8464, 3364, 900]

Squared evens (list comprehension): [9216, 4356, 676, 4624, 1156, 1600, 8464, 3364, 900]

"Incredible!" Lyra exclaimed. "We've transformed our data, keeping only the squares of even numbers, all in one elegant line!"

The sage nodded, "List comprehensions can significantly simplify your data preprocessing tasks. They're readable, efficient, and reduce the chances of errors in your spells."

2.      The Lambda Function Invocation: Summoning Ephemeral Helpers

Next, Lyra found herself in a misty glade where ethereal beings flitted about, performing quick tasks and vanishing.

"Welcome to the Glade of Fleeting Functions," said a spectral figure. "Here, we summon lambda functions for swift, one-time operations."

Lyra discovered that lambda functions are perfect for simple operations in data transformation, especially when used with higher-order functions like map(), filter(), and reduce().

Let's invoke some Lambda Functions:

Sample Code:--

import pandas as pd 

# Create a sample DataFrame

df = pd.DataFrame({

    'A': [1, 2, 3, 4, 5],

    'B': [10, 20, 30, 40, 50],

    'C': [100, 200, 300, 400, 500]

}) 

# Use lambda with apply() to create a new column

df['D'] = df.apply(lambda row: row['A'] * row['B'] + row['C'], axis=1) 

# Use lambda with filter() to select rows

filtered_df = df[df.apply(lambda row: row['D'] > 1000, axis=1)] 

print("Original DataFrame:")

print(df)

print("\nFiltered DataFrame:")

print(filtered_df) 

Output:-

Original DataFrame:

   A   B    C     D

0  1  10  100   110

1  2  20  200   240

2  3  30  300   390

3  4  40  400   560

4  5  50  500  750 

Filtered DataFrame:

   A   B    C     D

4  5  50  500  750 

"Fascinating!" Lyra marveled. "We've created a new column and filtered our DataFrame using these compact lambda functions!"

The spectral figure smiled, "Lambda functions are like small, specialized familiars. They're perfect for quick operations without the need to define a full spell."

 3.      The Decorator's Mantle: Enhancing Spells with Style

Lyra then entered a grand wardrobe filled with magical cloaks and mantles.

"Welcome to the Decorator's Atelier," said a stylish enchanter. "Here, we enhance our spells with additional powers without altering their essence."

Lyra learned that decorators are powerful tools for adding functionality to existing functions, such as timing, logging, or input validation, which are crucial in machine learning pipelines.

Let's don the Decorator's Mantle:

Sample Code:--

import time

from functools import wraps 

def timer_decorator(func):

    @wraps(func)

    def wrapper(*args, **kwargs):

        start_time = time.time()

        result = func(*args, **kwargs)

        end_time = time.time()

        print(f"{func.__name__} took {end_time - start_time:.2f} seconds to run.")

        return result

    return wrapper 

@timer_decorator

def train_model(iterations):

    # Simulate a time-consuming model training process

    time.sleep(2)

    print(f"Model trained with {iterations} iterations.") 

train_model(1000) 

Output:-

Model trained with 1000 iterations.

train_model took 2.00 seconds to run.

"Incredible!" Lyra exclaimed. "We've added timing functionality to our training spell without changing its core incantation!"

The enchanter nodded, "Decorators are like magical accessories for your spells. They can add logging, error handling, or even caching capabilities, making your machine learning code more robust and informative."

4.      The Generator's Fountain: Streaming Data with Efficiency

Finally, Lyra came upon a magical fountain that produced a never-ending stream of data droplets.

"Behold the Generator's Fountain," said a water nymph. "Here, we create data streams that conserve memory and flow endlessly."

Lyra discovered that generator functions and expressions are excellent for handling large datasets or creating infinite sequences, perfect for streaming data in machine learning pipelines.

Let's tap into the Generator's Fountain:

Sample Code:--

def fibonacci_generator():

    a, b = 0, 1

    while True:

        yield a

        a, b = b, a + b 

# Using the generator function

fib_gen = fibonacci_generator()

print("First 10 Fibonacci numbers:")

for _ in range(10):

    print(next(fib_gen), end=' ') 

# Generator expression for data transformation

numbers = [1, 2, 3, 4, 5]

squared_odds = (x**2 for x in numbers if x % 2 != 0) 

print("\n\nSquared odd numbers:")

for num in squared_odds:

    print(num, end=' ') 

Output:--

First 10 Fibonacci numbers:

0 1 1 2 3 5 8 13 21 34 

Squared odd numbers:

1 9 25

Marvelous!" Lyra exclaimed. "We've created an infinite Fibonacci sequence and transformed our data, all without storing everything in memory at once!"

The nymph smiled, "Generators are like magical streams that produce values on-demand. They're perfect for working with large datasets or creating infinite sequences in your machine learning pipelines."

As Lyra's journey through the magical world of intermediate Python features came to an end, she felt empowered with new knowledge and tools for her data wizardry.

"Remember," echoed a voice as the world began to fade, "these incantations are not just about writing less code, but about crafting more elegant, efficient, and powerful spells. Use them wisely in your quest for knowledge."

Lyra awoke at her desk, the mystical grimoire still in her hands. Her code scrolls glowed with newfound potential, and she was ready to apply these magical intermediate Python features to her machine learning quests, knowing they would help her unravel the mysteries of data with greater finesse and power.

Epilogue: The realm of data magic is vast and ever-changing. These intermediate incantations are just the beginning of what you can master. Keep exploring, keep experimenting, and may your models always reveal the hidden truths in the universe of data!

(c) Pankaj Kulkarni.


Comments

Popular posts from this blog

The Future is Above Us: Exploring Next-Generation Non-Terrestrial Networks

NLP (Natural Language Processing) and LLM (Large language models) key terminology primer

The Future Unfolds: Exploring the Marvels of 6G and Digital Twins