Monthly Challenge Solution: June 2026
And now… KNIME’s solution to the first monthly challenge here in the new community! This is by no means the only way to approach things (or even the best way) - it’s just what we did. You can find it on the KNIME Community Hub here:
We’ll pick a winner for this first round soon, and will have another challenge coming for you later this week!
Solution Summary: The solution starts with accessing the cleaned Letterboxd dataset. We continue preprocessing the data by creating a “decade” column and splitting multi genre films into the individual values.
To find the top 5 most popular and top 5 best rated genres, we first aggregate the data by “genre” and calculate the average rating and average popularity. Then, we sort and filter the table to find the top 5 genres each and lastly compare the two tables to discover which genre is in both tables.
To compare runtime across genres, we first categorize our data into movie runtimes ("Short Film", "Standard", and "Epic"). We then create a Pivot table to get the average runtime for each genre and runtime category. Lastly, we filter the Pivot table to our favorite genres and visualize the results.
To observe how the average film ratings of the different genres have changed over time, we create another Pivot table that calculates the average movie rating per genre and decade. We filter the data to genres “Action”, “Crime”, “Romance”, and “Music” and lastly visualize the results.
Finally, to find the hidden gems (i.e., movies that are highly rated yet not extremely popular), we filter the data according to assumptions we have made and then calculate a custom "Hidden Gem Score". The formula is inspired by TF-IDF principles. Lastly, we present the top 25 hidden gems in a table.
Solution Details: We start by accessing the cleaned Letterboxd dataset using a CSV Reader node. With the Expression node we create a “decade” column: We divide the ‘’year_released’’ column values by 10, apply a floor function to that value, multiply it with 10, and add ”s” at the end.
Note: Instead of Rule Engine, use the mighty expression node to create the decade column here for efficiency.
As many movies fall into multiple genres, we use a Cell Splitter node to split them into unique values, followed by an Ungroup node so that each movie-genre pair occupies its own row. A Column Renamer node is used to quickly clean up and rename the “genres_SplitResultList” column to "genre".
From here, the preprocessed data splits into four branches.
First branch: Top 5 Most Popular vs. Top 5 Best Rated Genres. We use a GroupBy node to aggregate the data by “genre” and calculate the average for “rating” and “popularity”. Use two parallel Top k Row Filter nodes, one keeps the top 5 best rated genres, while the other keeps the top 5 most popular genres. Both filtered tables connect to a Reference Row Filter node, which identifies the overlapping genres that rank in the top 5 for both criteria.
Second branch: Comparing Runtimes Across Genres. An Expression node categorizes each movie into runtime groups based on duration: "Short Film" (< 60 minutes), "Standard" (< 150 minutes), and "Epic". A Pivot node then calculates the average runtime of movies by genre and runtime category. We use a Row Filter node to narrow our focus to specific genres (“Documentary”, “History,” and “Crime”), assign different colors to each genre using a Color Manager node and lastly visualize output with a Bar Chart node for easier comparison.
Third branch: Average Rating of Genres Over Time. To analyze rating trends, a Pivot node calculates the average movie rating grouped by decade and genre. We apply a Column Filter node and choose “Action”, “Crime”, “Romance”, and “Music” columns. Lastly, we connect the aggregated data to a Line Plot node to visualize how audience ratings have changed over decades.
Fourth branch: Hidden Gems. To uncover overlooked masterpieces, i.e., movies that are highly rated yet not extremely popular, the original dataset is connected to a Row Filter node that filters out low-quality or obscure entries. We filter the data as follows:
“vote_count” between 100 and 2000: To ensure that the movies have a wide enough audience and at the same time are no Hollywood legacies,
“vote_average” higher than 7.5: To ensure we are generally looking at highly rated movies, and
popularity less than 40: To ensure that massive blockbusters will not dominate the chart.
Note: Here, popularity refers to a real-time hype meter measuring how many people are actively talking about, searching for, and logging the movie right now.
After filtering the data, we use an Expression node to apply a custom formula to calculate the Hidden Gem Score (HGS). Note that there’s no official formula for discovering hidden gems. We have used a formula inspired by TF-IDF from document analysis that penalizes high popularity and rewards high ratings:
$["vote_average"]/(log10($["popularity"]+10))
Lastly, we use a Top k Row Filter node to pick the top 25 and visualize the resulting table with Table View node.