Figure Friday 2025 - week 19

join the Figure Friday session on May 16, at noon Eastern Time, to showcase your creation and receive feedback from the community.

What percentage of the TLC driver applications get accepted? What are the main reasons driver applications get rejected?

Answer these and many other questions by using Plotly and Dash on the TLC Driver Application dataset.

Things to consider:

  • what can you improve in the app or sample figure below (bar chart)?
  • would you like to tell a different data story using a different graph?
  • can you create a different Dash app?

Sample figure:

Code for sample figure:
from dash import Dash, dcc
import dash_ag_grid as dag
import plotly.express as px
import pandas as pd


df = pd.read_csv("https://raw.githubusercontent.com/plotly/Figure-Friday/refs/heads/main/2025/week-19/TLC_New_Driver_Application.csv")
df['App Date'] = pd.to_datetime(df['App Date'])

# Add week and month columns for grouping
df['Month'] = df['App Date'].dt.strftime('%B %Y')
df['Week'] = df['App Date'].dt.strftime('%U-%Y') 
df['Week_label'] = 'Week ' + df['App Date'].dt.strftime('%U, %Y')  # For better readability

# Group by month and status, then count
monthly_counts = df.groupby(['Month', 'Status']).size().reset_index(name='Count')

fig = px.bar(
    monthly_counts,
    x='Month',
    y='Count',
    color='Status',
    title='Status Counts by Month',
    labels={'Count': 'Number of Applications', 'Month': 'Month', 'Status': 'Application Status'},
    barmode='group' 
)

grid = dag.AgGrid(
    rowData=df.to_dict("records"),
    columnDefs=[{"field": i, 'filter': True, 'sortable': True} for i in df.columns],
    dashGridOptions={"pagination": True},
    columnSize="sizeToFit"
)

app = Dash()
app.layout = [
    grid,
    dcc.Graph(figure=fig)
]


if __name__ == "__main__":
    app.run(debug=False)

Participation Instructions:

  • Create - use the weekly data set to build your own Plotly visualization or Dash app. Or, enhance the sample figure provided in this post, using Plotly or Dash.
  • Submit - post your creation to LinkedIn or Twitter with the hashtags #FigureFriday and #plotly by midnight Thursday, your time zone. Please also submit your visualization as a new post in this thread.
  • Celebrate - join the Figure Friday sessions to showcase your creation and receive feedback from the community.

:point_right: If you prefer to collaborate with others on Discord, join the Plotly Discord channel.

Data Source:

Thank you to NYC Open Data for the data.

1 Like

I used this figurefriday for

  • try vibecoding something that would take a lot of time (this took roughly 2 hours)
  • see if sankey would be interesting.

The initial instructions for the vibecoding are in a separate document on py.cafe.
Step 1, had all the flows in it which was confusing.
Step 2 left out people who didn’t make the requirement.

The order of requirements more or less follows what is written on reddit (see py.cafe source for link).

Not much analysing going on here, I’m still with the migration figurefriday, between regions.
And now I’m waiting for the app which makes it possible to compare the resulting numbers
of vibecoding with numbers from someone who calculated the numbers themselves. Difficult to trust this
blindly.

5 Likes

Hello everyone!
I’ve built an interactive Dash app to explore the TLC Driver Application dataset. It includes data preprocessing, feature engineering, and visualizations to dive into application statuses and rejection reasons.

Feel free to check it out and share your feedback or suggestions—I’d love to hear your thoughts!

4 Likes

Hey everyone, this week I built something I really enjoyed working on:

It’s like a website that helps you get your head around how new taxi driver applications get approved in New York City. It uses info from old applications to show you how the whole process works, point out any snags, and even guess if a new application will likely get the thumbs up!

To make it easy to see what’s going on, the app uses different kinds of simple charts:

  • The Big Slide: Imagine a funnel – it shows how applications move through each step, from start to finish. You can see where most applications are at and if any get stuck along the way.
  • Time Traveler: This chart shows how the number of applications has gone up or down over time, day by day. You can also see if approvals, rejections, etc., have been changing.
  • Traffic Jams: This one highlights the steps in the process where lots of applications are waiting or haven’t been finished yet. It helps spot where things are slowing down.
  • Status Check: These are like little info cards that tell you the total number of applications in different stages – like how many are approved, still waiting, or were turned down.
  • What Really Matters: This chart shows which parts of the application process (like passing the driving test or drug screening) are the biggest factors in whether someone gets approved, according to the app’s “smart brain.”
  • The Crystal Ball: For a specific application, this visual thingy (like a dial) shows you how likely it is to get approved, based on the “smart brain’s” guess. It might even tell you briefly why it made that prediction, like if important steps are done or not.
  • For the look of things, I kept it clean and brought in those yellow and black taxi colors from New York. Wanted it to be nice to look at and super simple to use.

This app is still under development and may contain errors. Furthermore, the funnel chart or the approval prediction could present interpretation challenges for some users.

If you have any doubts, comments, or suggestions, feel free to share them!
Some images:



I didn’t share the code here due to space limitations. If you’d like to know more, you can access it through the PyCafe link on the web app.

the app:

2 Likes

Hey @feanor_92 nice app. I also commented on LinkedIn.

I’m not sure if this is a bug or something intentional, but when I’m on the Visuals tab (and the dropdown Status is set to All), if I click on one of the items in the bar graph legend it will jump to a new Status Distribution graph.

@Avacsiglo21 How do you make those cards pop out like that when the mouse hovers over them? That’s really cool.

I like your funnel chart as well. Do you think it would look better if we removed the FRU Interview Scheduled step since none of them are applicable? Perhaps this was a past requirement for drivers but not anymore.

Another idea would be to remove the PDR and VDR application type from the dataset or from the funnel because they don’t require medical clearance or a drug test or the WAV course.

Lastly, it doesn’t look like the TLC department has a priority order for the requirement, so maybe we can take the liberty to re-arrange the funnel steps so they go for highest number to lowest: applications → fru → wav course → defensive driviing → etc.

This chart is an interesting way to look at the data. I wonder why no applications have been approved after April 21.

1 Like

Nice one, @marieanne . The end of the funnel caught my attention. You think there are 81 incomplete applications because not all requirements are available in the dataset? Or could it be that 81 people passed their driving exam but did not complete a previous step?

Hi Adams, This effect is css style

/* Card hover effects */
.card {
transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.card:hover {
transform: translateY(-5px);
box-shadow: 0 8px 16px rgba(0,0,0,0.2) !important;
}

The animation, creating the “popping out” effect when you hover over a card, is due to the transition property which slightly moves it up and adds a subtle shadow(see the code snippet above).

Regarding the funnel chart, even though I know these stages aren’t sequential and initially thought it was essential, based on your information, it can be removed. I’m honestly unsure if it will look better.

I actually modified the priority order to its current state after reviewing Marianne’s information. Ultimately, I want to highlight the application flow here.

Regarding the trend chart, you know I don’t know for sure, but perhaps some applications have been approved but not yet had a license issued. This is because in the data it appears as “Approval - Licensed Issue,” so maybe they record the approval only once the license is issued.

(post deleted by author)

I’m not 100% sure but you could pass all these requirements and end up with “Fingerprints needed; Copy of DMV license needed” And if I remember correctly I gave the instruction that FRU Interview Scheduled with a date got the benefit of the doubt. Your asking for the part where I was “vibe-coding” instead of counting , 4 days ago. :grinning_face:

1 Like