Close Menu
    Trending
    • People are using AI to ‘sit’ with them while they trip on psychedelics
    • Reinforcement Learning in the Age of Modern AI | by @pramodchandrayan | Jul, 2025
    • How This Man Grew His Beverage Side Hustle From $1k a Month to 7 Figures
    • Finding the right tool for the job: Visual Search for 1 Million+ Products | by Elliot Ford | Kingfisher-Technology | Jul, 2025
    • How Smart Entrepreneurs Turn Mid-Year Tax Reviews Into Long-Term Financial Wins
    • Become a Better Data Scientist with These Prompt Engineering Tips and Tricks
    • Meanwhile in Europe: How We Learned to Stop Worrying and Love the AI Angst | by Andreas Maier | Jul, 2025
    • Transform Complexity into Opportunity with Digital Engineering
    AIBS News
    • Home
    • Artificial Intelligence
    • Machine Learning
    • AI Technology
    • Data Science
    • More
      • Technology
      • Business
    AIBS News
    Home»Machine Learning»Building a Movie Recommendation Dashboard with H2O Wave | by Abhijaysaipal | Mar, 2025
    Machine Learning

    Building a Movie Recommendation Dashboard with H2O Wave | by Abhijaysaipal | Mar, 2025

    Team_AIBS NewsBy Team_AIBS NewsMarch 25, 2025No Comments9 Mins Read
    Share Facebook Twitter Pinterest LinkedIn Tumblr Reddit Telegram Email
    Share
    Facebook Twitter LinkedIn Pinterest Email


    By the tip of this information, you’ll have a transparent understanding of:

    • What H2O Wave is
    • The right way to generate dummy film and person knowledge
    • The right way to construct and prepare a toy suggestion mannequin utilizing SVD
    • The right way to create an interactive front-end with H2O Wave
    • The right way to combine ML-based suggestions right into a user-friendly dashboard

    Let’s get began!

    When deploying machine studying fashions in manufacturing — particularly in domains like film streaming — it’s not sufficient to easily serve predictions by way of an API. Take into account a film streaming service the place person engagement and personalization are key. Customers anticipate:

    • Actual-Time Suggestions: Motion pictures urged primarily based on their evolving tastes and viewing habits.
    • Interactive Dashboards: Visible insights into trending motion pictures, person rankings, and customized options.
    • Fast Suggestions Loops: A fast approach to discover knowledge, alter parameters, and examine outcomes.

    Conventional net frameworks will be cumbersome to arrange for such dynamic interfaces, and lots of ML-specific libraries deal with mannequin coaching reasonably than deployment. H2O Wave addresses this hole by offering a easy, Python-first API for creating interactive, real-time dashboards and apps tailor-made to ML use circumstances.

    H2O Wave is an open-source framework developed to simplify the creation of real-time interactive net purposes. Its key options embody:

    • Ease of Use: With a minimalistic Python API, H2O Wave means that you can construct dashboards and apps while not having to dive deep into frontend frameworks.
    • Actual-Time Updates: The instrument helps dwell knowledge updates, making it splendid for dynamic eventualities comparable to streaming analytics or interactive mannequin exploration.
    • Fast Prototyping: You’ll be able to rapidly iterate over designs, check concepts, and combine ML fashions right into a production-ready UI.

    These options make H2O Wave an interesting possibility for builders seeking to construct manufacturing ML techniques which might be each interactive and user-friendly.

    To show the instrument in a sensible context, I utilized H2O Wave to a film suggestion state of affairs. The aim was to construct a dashboard that may enable a streaming service to showcase:

    • Trending Motion pictures: Actual-time knowledge on which motion pictures are presently standard.
    • Personalised Suggestions: Interactive inputs for customers to enter their favourite genres and obtain tailor-made film options.
    • Person Engagement Metrics: Visible insights into person rankings and suggestions, which might assist refine suggestion algorithms.

    Lets get began with a step-by-step demo of the best way to construct your individual ML-powered net app.

    Step 1: Setting Up Your Surroundings

    Earlier than diving into the code, guarantee you could have the next:

    • Python 3.7+ put in (3.10.16 beneficial for the beneath code)
    • Required libraries: h2o-wave, pandas, numpy, scikit-learn
    • A code editor and terminal for operating instructions

    Set up the dependencies with:

    !pip set up h2o-wave pandas numpy scikit-learn

    Step 2: Creating Dummy Knowledge and the Suggestion Mannequin

    We start by simulating a small film dataset and producing person viewing historical past knowledge. This dummy knowledge will function the premise for our suggestion mannequin.

    2.1 Creating Dummy Motion pictures and Person Knowledge
    The primary code snippet creates an inventory of 10 motion pictures with particulars like title, style, score, yr, director, and recognition. Subsequent, a operate generate_user_data() creates simulated person rankings, biased in direction of most well-liked genres.

    import random

    # Decreased dummy knowledge with solely 10 motion pictures for quicker processing
    dummy_movies = [
    {'id': 1, 'title': 'Action Hero', 'genre': 'Action', 'rating': 4.5, 'year': 2021, 'director': 'James Cameron', 'popularity': 85},
    {'id': 2, 'title': 'Drama Queen', 'genre': 'Drama', 'rating': 4.2, 'year': 2020, 'director': 'Steven Spielberg', 'popularity': 75},
    {'id': 3, 'title': 'Laugh Out Loud', 'genre': 'Comedy', 'rating': 3.8, 'year': 2022, 'director': 'Judd Apatow', 'popularity': 68},
    {'id': 4, 'title': 'Action Reloaded', 'genre': 'Action', 'rating': 4.7, 'year': 2019, 'director': 'Christopher Nolan', 'popularity': 92},
    {'id': 5, 'title': 'Romance in Paris', 'genre': 'Romance', 'rating': 4.1, 'year': 2023, 'director': 'Nancy Meyers', 'popularity': 79},
    {'id': 6, 'title': 'Space Adventures', 'genre': 'Sci-Fi', 'rating': 4.6, 'year': 2022, 'director': 'Denis Villeneuve', 'popularity': 88},
    {'id': 7, 'title': 'Haunted Night', 'genre': 'Horror', 'rating': 3.5, 'year': 2021, 'director': 'Jordan Peele', 'popularity': 72},
    {'id': 8, 'title': 'Mystery Manor', 'genre': 'Mystery', 'rating': 4.3, 'year': 2020, 'director': 'David Fincher', 'popularity': 81},
    {'id': 9, 'title': 'Galactic Wars', 'genre': 'Sci-Fi', 'rating': 4.8, 'year': 2022, 'director': 'Ridley Scott', 'popularity': 94},
    {'id': 10, 'title': 'Heartbreak Boulevard', 'genre': 'Drama', 'rating': 4.0, 'year': 2021, 'director': 'Greta Gerwig', 'popularity': 76}
    ]

    def generate_user_data(num_users=20, motion pictures=dummy_movies):
    user_data = []
    for user_id in vary(1, num_users + 1):
    preferred_genres = random.pattern(
    ['Action', 'Drama', 'Comedy', 'Sci-Fi', 'Horror', 'Romance', 'Mystery'],
    random.randint(1, 2)
    )
    num_views = random.randint(3, min(5, len(motion pictures)))
    viewed_movies = random.pattern(motion pictures, num_views)
    for film in viewed_movies:
    rating_bias = 1.0 if film['genre'] in preferred_genres else 0
    user_rating = min(5.0, max(1.0, film['rating'] + rating_bias - random.uniform(0, 1.5)))
    user_data.append({
    'user_id': user_id,
    'movie_id': film['id'],
    'score': spherical(user_rating, 1),
    'timestamp': f"2023-{random.randint(1, 6)}-{random.randint(1, 28)}"
    })
    return user_data

    Rationalization:
    This a part of the code defines our dataset and simulates person rankings. The generate_user_data() operate creates a viewing historical past that we’ll later use to construct our suggestion mannequin.

    Show of Variety of Motion pictures, Common Rankings and New Releases within the Complete Dataset

    2.2 Constructing the SVD Suggestion Mannequin
    We use scikit-learn’s TruncatedSVD to decompose our user-movie rankings matrix into latent components. This mannequin lets us reconstruct approximate person rankings for motion pictures after which advocate high titles.

    import pandas as pd
    import numpy as np
    from sklearn.decomposition import TruncatedSVD

    def create_recommendation_model(motion pictures, user_data):
    movies_df = pd.DataFrame(motion pictures)
    ratings_df = pd.DataFrame(user_data)

    user_movie_matrix = ratings_df.pivot_table(
    index='user_id',
    columns='movie_id',
    values='score',
    fill_value=0
    ).values

    customers = sorted(ratings_df['user_id'].distinctive())
    movie_ids = sorted(ratings_df['movie_id'].distinctive())
    idx_to_movie_id = {i: movie_id for i, movie_id in enumerate(movie_ids)}
    movie_id_to_idx = {movie_id: i for i, movie_id in enumerate(movie_ids)}

    if min(user_movie_matrix.form) <= 1:
    print("Matrix too small for SVD, utilizing easy popularity-based suggestions")
    svd = None
    latent_matrix = None
    reconstructed_matrix = None
    elements = None
    else:
    n_components = min(2, min(user_movie_matrix.form) - 1)
    svd = TruncatedSVD(n_components=n_components, random_state=42)
    attempt:
    latent_matrix = svd.fit_transform(user_movie_matrix)
    reconstructed_matrix = np.dot(latent_matrix, svd.components_)
    elements = svd.components_
    print(f"SVD defined variance: {svd.explained_variance_ratio_.sum():.2f}")
    besides Exception as e:
    print(f"SVD failed: {e}")
    svd = None
    latent_matrix = None
    reconstructed_matrix = None
    elements = None

    return {
    'mannequin': svd,
    'movies_df': movies_df,
    'user_movie_matrix': user_movie_matrix,
    'reconstructed_matrix': reconstructed_matrix,
    'latent_matrix': latent_matrix,
    'elements': elements,
    'customers': customers,
    'movie_ids': movie_ids,
    'idx_to_movie_id': idx_to_movie_id,
    'movie_id_to_idx': movie_id_to_idx
    }

    Rationalization:
    This operate filters motion pictures primarily based on the chosen style. If no style is specified, it makes use of the SVD mannequin to generate suggestions for a randomly chosen person. If the ML mannequin isn’t out there, it falls again to sorting by rankings or recognition.

    Step 3: Constructing the H2O Wave Entrance-Finish

    Now, we’ll create an interactive dashboard utilizing H2O Wave. This a part of the code builds the UI, handles person inputs (like filtering by style, minimal score, and yr), and shows suggestions.

    3.1 Setting Up the Format and Preliminary Playing cards
    The UI format is split into zones (header, sidebar, fundamental content material, and so on.) to offer a clear, responsive design.

    from h2o_wave import fundamental, app, Q, ui

    @app('/movie-dashboard')
    async def serve(q: Q):
    if not q.consumer.initialized:
    q.web page['meta'] = ui.meta_card(
    field='',
    title='Film Streaming Dashboard',
    theme='h2o-dark',
    icon='VideoLibrary',
    layouts=[
    ui.layout(
    breakpoint='xs',
    zones=[
    ui.zone('header', size='80px'),
    ui.zone('subheader', size='60px'),
    ui.zone('content', direction=ui.ZoneDirection.ROW, zones=[
    ui.zone('sidebar', size='300px'),
    ui.zone('main', zones=[
    ui.zone('top_row', direction=ui.ZoneDirection.ROW, zones=[
    ui.zone('stats1', size='33%'),
    ui.zone('stats2', size='33%'),
    ui.zone('stats3', size='33%'),
    ]),
    ui.zone('suggestions'),
    ui.zone('discover'),
    ]),
    ]),
    ui.zone('footer', dimension='50px'),
    ]
    )
    ]
    )

    q.web page['header'] = ui.header_card(
    field='header',
    title='Superior Film Streaming Dashboard',
    subtitle='Actual-Time ML Suggestions and Developments',
    icon='Film',
    icon_color='#F39C12'
    )

    q.web page['nav'] = ui.tab_card(
    field='subheader',
    objects=[
    ui.tab(name='#recommendations', label='Recommendations', icon='Star'),
    ui.tab(name='#trending', label='Trending', icon='Trending'),
    ui.tab(name='#genres', label='Genres', icon='Filter'),
    ui.tab(name='#about', label='About', icon='Info')
    ],
    worth='#suggestions'
    )

    q.web page['sidebar'] = ui.form_card(
    field='sidebar',
    title='Discover Motion pictures',
    objects=[
    ui.dropdown(
    name='genre',
    label='Genre',
    placeholder='Select a genre',
    choices=[ui.choice(name=g, label=g) for g in sorted({m['genre'] for m in dummy_movies})]
    ),
    ui.slider(identify='min_rating', label='Minimal Ranking', min=1.0, max=5.0, worth=3.0, step=0.1),
    ui.slider(identify='min_year', label='Minimal Launch Yr', min=2019, max=2023, worth=2019, step=1),
    ui.slider(identify='max_year', label='Most Launch Yr', min=2019, max=2023, worth=2023, step=1),
    ui.separator(),
    ui.button(identify='submit', label='Get Suggestions', main=True, icon='WavingHand'),
    ui.button(identify='reset', label='Reset Filters', icon='Delete'),
    ui.separator(),
    ui.textual content('SVD-Powered Suggestions'),
    ui.toggle(identify='use_ml', label='Use SVD Mannequin', worth=True),
    ui.text_m("Our SVD mannequin analyzes the user-movie score matrix to foretell motion pictures you may take pleasure in.")
    ]
    )

    # Simulated stats playing cards utilizing markdown
    q.web page['stats1'] = ui.markdown_card(
    field='stats1',
    title='Whole Motion pictures',
    content material=f"**{len(dummy_movies)}** in database"
    )
    avg_rating = sum(m['rating'] for m in dummy_movies) / len(dummy_movies)
    q.web page['stats2'] = ui.markdown_card(
    field='stats2',
    title='Common Ranking',
    content material=f"**{avg_rating:.1f}** throughout all motion pictures"
    )
    new_releases = sum(1 for m in dummy_movies if m['year'] >= 2022)
    q.web page['stats3'] = ui.markdown_card(
    field='stats3',
    title='New Releases',
    content material=f"**{new_releases}** from 2022-2023"
    )

    q.web page['recommendations'] = ui.markdown_card(
    field='suggestions',
    title='🎬 Welcome to Film Streaming!',
    content material='''### Get customized film suggestions

    Use the filters on the left to find motion pictures tailor-made to your preferences.
    Our machine studying algorithm can counsel titles primarily based on what comparable customers loved.

    #### Featured genres:
    - Motion
    - Drama
    - Sci-Fi
    - Horror
    '''
    )

    q.web page['explore'] = ui.form_card(
    field='discover',
    title='Prime Rated Motion pictures',
    objects=[
    ui.text_xl('Highest Rated Films in Our Collection'),
    ui.table(
    name='top_movies',
    columns=[
    ui.table_column(name='title', label='Title'),
    ui.table_column(name='genre', label='Genre'),
    ui.table_column(name='rating', label='Rating'),
    ui.table_column(name='year', label='Year')
    ],
    rows=[
    ui.table_row(
    name=f'movie_{m["id"]}',
    cells=[m['title'], m['genre'], str(m['rating']), str(m['year'])]
    )
    for m in sorted(dummy_movies, key=lambda x: x['rating'], reverse=True)[:5]
    ]
    )
    ]
    )

    q.web page['footer'] = ui.footer_card(
    field='footer',
    caption='© 2025 Film Streaming Inc. | Enhanced with H2O Wave and Machine Studying'
    )

    q.consumer.initialized = True
    await q.web page.save()
    return

    Rationalization:
    On this part, the web page format is outlined with zones for header, sidebar, fundamental content material, and footer. The sidebar consists of inputs for filtering motion pictures and toggling between ML-based and easy filter suggestions.
    You’ll be able to see that it was barely 100–200 traces of code for such a posh front-end !!!

    3.2 Dealing with Person Interactions and Displaying Suggestions
    When customers click on the submit button, the app processes the filters, retrieves suggestions (both by style or utilizing the SVD mannequin), and updates the show.

        # Reset filters if requested
    if q.args.reset:
    for comp in q.web page['sidebar'].objects:
    if hasattr(comp, 'identify'):
    if comp.identify == 'style':
    comp.worth = None
    elif comp.identify == 'min_rating':
    comp.worth = 3.0
    elif comp.identify == 'min_year':
    comp.worth = 2019
    elif comp.identify == 'max_year':
    comp.worth = 2023
    await q.web page.save()
    return

    # Deal with suggestions on submit
    if q.args.submit:
    style = q.args.style
    min_rating = float(q.args.min_rating) if q.args.min_rating isn't None else 3.0
    min_year = int(q.args.min_year) if q.args.min_year isn't None else 2019
    max_year = int(q.args.max_year) if q.args.max_year isn't None else 2023
    use_ml = q.args.use_ml

    if use_ml and never style:
    suggestions = get_recommendations(None, recommendation_model)
    title = "🤖 AI-Powered Suggestions"
    else:
    filtered = [
    m for m in dummy_movies
    if (not genre or m['genre'].decrease() == style.decrease()) and
    m['rating'] >= min_rating and
    min_year <= m['year'] <= max_year
    ]
    suggestions = sorted(filtered, key=lambda x: x['rating'], reverse=True)
    title = f"🎭 Prime {style} Motion pictures" if style else "🔍 Motion pictures Matching Your Standards"

    if suggestions:
    objects = [ui.text_xl(title)]
    for i, film in enumerate(suggestions[:5]):
    objects.append(ui.separator())
    objects.append(ui.inline([
    ui.text_l(f"{i+1}. {movie['title']} ({film['year']})"),
    ui.text_xl(f"{'★' * int(spherical(film['rating']))}{' ☆' * (5 - int(spherical(film['rating'])))}")
    ]))
    objects.append(ui.textual content(f"Style: {film['genre']} | Director: {film['director']} | Recognition: {film['popularity']}%"))
    objects.append(ui.progress(
    label='Person Ranking',
    caption=f"{film['rating']}/5.0",
    worth=film['rating'] / 5.0,
    ))
    objects.append(ui.separator())
    if use_ml and never style:
    objects.append(ui.text_s("These suggestions are powered by our SVD mannequin that identifies latent components in person rankings."))
    else:
    objects.append(ui.text_s("These suggestions are primarily based in your filter standards."))
    objects.append(ui.inline([
    ui.button(name='watch_later', label='My List', icon='Add'),
    ui.button(name='show_similar', label='Similar Movies', icon='BulletedTreeList'),
    ui.button(name='surprise_me', label='Surprise Me', icon='Sparkle', primary=True)
    ]))
    q.web page['recommendations'] = ui.form_card(
    field='suggestions',
    title='Personalised Suggestions',
    objects=objects
    )
    else:
    q.web page['recommendations'] = ui.markdown_card(
    field='suggestions',
    title='No Outcomes Discovered',
    content material=f'''
    ## No motion pictures match your filters

    Alter your standards:
    - Style: {style or "None chosen"}
    - Minimal Ranking: {min_rating}
    - Yr Vary: {min_year} - {max_year}

    Or attempt our AI suggestions by toggling "Use SVD Mannequin" within the sidebar.
    '''
    )

    # Replace the exploration desk with filtered motion pictures
    q.web page['explore'] = ui.form_card(
    field='discover',
    title='Discover Motion pictures',
    objects=[
    ui.text_xl(f'{"All" if not genre else genre} Movies ({min_year}-{max_year})'),
    ui.table(
    name='all_movies',
    columns=[
    ui.table_column(name='title', label='Title'),
    ui.table_column(name='genre', label='Genre'),
    ui.table_column(name='year', label='Year'),
    ui.table_column(name='rating', label='Rating'),
    ui.table_column(name='director', label='Director')
    ],
    rows=[
    ui.table_row(
    name=f'movie_{m["id"]}',
    cells=[m['title'], m['genre'], str(m['year']), str(m['rating']), m['director']]
    )
    for m in dummy_movies if (
    (not style or m['genre'].decrease() == style.decrease()) and
    m['rating'] >= min_rating and
    min_year <= m['year'] <= max_year
    )
    ]
    )
    ]
    )
    await q.web page.save()

    Rationalization:
    This part checks for filter resets, processes the person’s filter choices, and updates the suggestions and exploration sections accordingly. The app both makes use of the ML-based (SVD) suggestions or filters motion pictures by the factors supplied by the person.

    Beneath is the total code on your superior film suggestion dashboard. Copy and paste it into your file (e.g., movie_dashboard.py), and run it with:

    wave run movie_dashboard.py

    Open http://localhost:10101/movie-dashboard in your browser to see it in motion!!!



    Source link

    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
    Previous ArticleMeta considers charging for Facebook and Instagram in the UK
    Next Article Invest in the AI That Will Make Chatbots Obsolete
    Team_AIBS News
    • Website

    Related Posts

    Machine Learning

    Reinforcement Learning in the Age of Modern AI | by @pramodchandrayan | Jul, 2025

    July 1, 2025
    Machine Learning

    Finding the right tool for the job: Visual Search for 1 Million+ Products | by Elliot Ford | Kingfisher-Technology | Jul, 2025

    July 1, 2025
    Machine Learning

    Meanwhile in Europe: How We Learned to Stop Worrying and Love the AI Angst | by Andreas Maier | Jul, 2025

    July 1, 2025
    Add A Comment
    Leave A Reply Cancel Reply

    Top Posts

    People are using AI to ‘sit’ with them while they trip on psychedelics

    July 1, 2025

    I Tried Buying a Car Through Amazon: Here Are the Pros, Cons

    December 10, 2024

    Amazon and eBay to pay ‘fair share’ for e-waste recycling

    December 10, 2024

    Artificial Intelligence Concerns & Predictions For 2025

    December 10, 2024

    Barbara Corcoran: Entrepreneurs Must ‘Embrace Change’

    December 10, 2024
    Categories
    • AI Technology
    • Artificial Intelligence
    • Business
    • Data Science
    • Machine Learning
    • Technology
    Most Popular

    Co-op narrowly avoided an even worse cyber attack, BBC learns

    May 15, 2025

    How RPA Secures Data Storage with Encryption

    March 14, 2025

    How AI is Transforming Creativity and Problem-Solving. | by Croslinks | Feb, 2025

    February 17, 2025
    Our Picks

    People are using AI to ‘sit’ with them while they trip on psychedelics

    July 1, 2025

    Reinforcement Learning in the Age of Modern AI | by @pramodchandrayan | Jul, 2025

    July 1, 2025

    How This Man Grew His Beverage Side Hustle From $1k a Month to 7 Figures

    July 1, 2025
    Categories
    • AI Technology
    • Artificial Intelligence
    • Business
    • Data Science
    • Machine Learning
    • Technology
    • Privacy Policy
    • Disclaimer
    • Terms and Conditions
    • About us
    • Contact us
    Copyright © 2024 Aibsnews.comAll Rights Reserved.

    Type above and press Enter to search. Press Esc to cancel.