How I (Vibe) Code with Cursor + Python

Shaw Talebi · Beginner ·🧠 Large Language Models ·1y ago

Key Takeaways

This video demonstrates how to build an Upwork AI job dashboard from scratch using Python, Cursor, and Streamlit, with a focus on integrating LLMs for fast coding and data analysis.

Full Transcript

Oh, that's slick. That is slick. We are now vibe coding. I guess we've been vibe coding for a while, but now it's absolutely official. Let's see if this works. Oh, yeah. A The thing about visualizations is that it just takes a lot of coding and trial and error to get it looking good, which makes it one of the best things to vibe code cuz no one's got time for that. Here we go. Yeah, look at that. But that looks really good. Whoa. Reinforcement Learning Plus 19. Hey everyone, I'm Shaw. In this video, I'm going to show you how I code with cursor. I'm going to do this by building an Upwork job dashboard completely from scratch using Python. My goal with this video is to show you how and when I use AI to code fast without accumulating insurmountable technical debt. Got cursor opened up here. And if you're not familiar with cursor, it's just an IDE. So, it's an integrated development environment. That's just a fancy way of saying it's an application you can use to write code. While there are many IDEs out there, Cursor is well known for being one of the first to integrate AI coding assistance directly into the user interface. Just to show you what Cursor looks like, it's actually built on top of VS Code. So, if you're familiar with that, the interface is basically exactly the same. And of course, there are many other AI powered idees out there. While I haven't used those before, I would imagine the user interface is going to be pretty similar. The key UI feature with cursor is this AI panel. We have this chat window where we can talk to an LLM and have it write us code or give us feedback or whatever it is. Interesting thing about cursor is that they have these two modes. They have this ask mode. So, this is kind of like question answer and it'll just spit back a response and give you like a code block that you can easily apply to some file that you're working on. But there's also this agent mode which is a bit more powerful because the agent is given a set of tools like rewriting files or running terminal commands. This allows the LLM to do much more of the development work than just a simple ask system. And then there's this manual which I don't use often, but basically this is if you want to limit the context that you're passing to the LLM, you can use this manual mode, but ask mode will automatically get context from your codebase as well as the agent. not going to go through all the UI components of cursor because that's not what this video is about here. I'm going to show you live me working through a real project so you can see all the nitty-gritty details of how I code with cursor, how I debug issues, and how I use LLMs to help me code much faster. I have this CSV file with a bunch of jobs from Upwork. This first one is a automation specialist for content distribution. We have the responsibilities, basically the job post here, but then we have other things like how much they're paying for it, the experience they're looking for, the estimated time. Here's just like a different view of it. This is when the job was posted. This is the title. This is the link. This is some data that was scraped. if the payment is verified of the client, the rating of the client, how much the client has spent, where they're based, how much it's paying, what they're looking for, the job description, and then some tags with the job, and some other things. All these headers are not very helpful, and there's a lot of missing data. So, this is going to be a common thing you run into in any kind of data science or data analytics project. You have a lot of information, but it's not clean. It's not in a format that's ready to start using. The first step here is going to be getting this data into a clean format so that we can create the dashboard. Typically this is a very timeconuming process but let's see how fast we can do it using claude. So we can select a bunch of different models with cursor. They have the popular ones from anthropic Google openai. So I have the pro plan with cursor. So, a lot of this stuff is included, but some of these models I guess you got to pay extra for, like these Max models or for 03 you got to pay extra for, but the default is to do the auto select. Basically, cursor has a way of deciding what will be the best model to use for whatever request. We see already the CSV file is available in the chat window. So, we can start using it as context to ask LLM's questions. The first thing we need to do is to clean this data. In order to decide what clean is, we need to figure out what data do we need to keep, what can we get rid of, how do we handle missing values and things like that. And so at this point, we really have three options. First option is that we can just sit down and manually design what we want the final table to look like and write out all these transformations that need to happen in order to take this raw CSV file and create it into the final table that we want. The second option is that we can have this collaboration with a large language model to kind of figure out how we want to design this final table and how to make the transformations. Or third, and finally, we can just have the LLM do this entire project for us. I'm going to do something in the middle cuz I already have somewhat of an idea of what I want to do, but maybe there's some gaps in my expectations because I haven't done this project before. So maybe doing this back and forth conversation is going to give me a bit more clarity and give us a nice action plan. I'm just going to give the LLM context on what problem I'm trying to solve and the solution I have in mind for it. I want to create a Upwork job dashboard based on the data in the attached CSV file. The goal is to get insight into the most high demand skills and services on Upwork to help freelancers define their services. That's kind of like the problem we're trying to solve and the solution bundled together. And then let's give it a direction. Can you help me transform the data in the CSV file for this dashboard? This is a pretty big ask. Not only are we asking the large language model to write some code for us to translate data set one into data set 2, but we're also having it figure out what transformations to make in the first place based on the context of this problem. And so let's see what happens. So, we can see that automatically the model will just start reading the CSV file and then it's going to be off to the races to start cleaning it. It looks like it's doing the entire project in one shot. So, let's see how good this did. We can see that it created a requirements file. It created this Python script. It also created a readme file for us. And then it wants us to do that and then run the script with bash. Basically, the agent just solved the entire project. I guess this is more option three than option two. But let's just humor the model and accept all these changes and then we'll create a new Python environment. Let's go here. So this is the script. So it's going to be using a few things. Map plot lib seour and wordcloud. And then let's see plain data extract skills. Interesting process upwork data. Let's just run it and see what happens. I'm going to open up a new one of these. So I'm just going to create a new environment env. And I'm going to activate this. Then I'll install the requirements. We could have also run these in the chat. So instead of like writing all this stuff out, we could have done this. But I guess there a couple problems because if we were to just run this command, it would install these requirements in my global Python environment. I don't want that. I wanted to have a special environment. That's why I didn't run these commands here. And generally, I don't like running the commands here. Even though that's one of the upsides of having an agent is that it can do these things on your behalf. I just prefer to run any kind of terminal command myself just so I know what's going on. So we have this then we can run this Python script. So I'll just copy paste that over. So this is the ultimate challenge with approach number three where we basically have the model do the entire task is that now that something has gone wrong, debugging it is going to be a major challenge. And I feel like another problem with this clean text is that it never checks for any kind of duplicate values or anything like that. This doesn't seem like it's going to be a promising direction. Okay, so let's take a step back. We can see that what the model came up with wasn't very helpful. So, let's try a different approach. We just undid everything cursor did cuz it was trying to do a lot. Let's not do it in agent mode this time. Let's do it in ask mode. And the great thing about chat is that it tends to explain what it wants to do while the agent just kind of was thinking everything. It didn't really tell us what its thought process was. I think this looks pretty good for the most part, but I don't want to go down the same rabbit hole we just did. So, let's try to build a solid foundation of this project so that the LLM has a bit more context and knows what direction to go in because when it is trying to do the whole thing all by itself, this gives us more opportunity for it to go off the rails or just do something that isn't super helpful or what we're looking for. So, I'm going to make a file called data prep and we're just going to prepare the data. We've already installed a bunch of stuff. And I guess the most important thing is we have pandas and we got a bunch of other stuff now that isn't helpful and we lost our requirements file. Let's deactivate the environment and then I'll delete this. So I think this is good because we saw what happened when the AI tried to do the entire project by itself. It generated a bunch of code and it ran really quickly, but an error came up. And while we could have spent time trying to debug that, I feel like the vibe of the whole application just didn't feel like it was going in the right direction of what I wanted. That's one of the situations where I'll just take a step back and start coding it myself. But like imagine if the AI did it and it basically transformed the data in a way that was aligned with what I had in mind. Maybe I would have gone that route of trying to debug and edit the code. But since the final result the model was going for was so different than what I had in mind. It just feels easier to start from scratch and then try again. The upside of cursor is not just this chat window here, but also this tab complete. So I just wrote this comment of remove duplicates and it wrote out some completion for us. So I'll hit tab and it's going to write all this code for us. But I don't want that and I don't want this. But I do want to drop the duplicates and I want to see how that changes the data frame. So, let's create a new environment again. We should have everything now. And then we'll do Python data prep. Okay. So, it didn't drop any duplicates. One of the problems is that the headers aren't very helpful. So, let's see if we can have an LLM help us with that specific task. This isn't going to be something it can probably figure out in tab. So, I'm going to open up a new chat and I'm going to say something like, "Can you write me some code to change the column names in Upwork CSV extract?" Okay, please infer the header names from the content. We've narrowed the task, so hopefully it doesn't go off the rails again. Okay, so this is struggling. So, let's not do the agent. Let's just do ask cuz this should be a pretty straightforward thing. Maybe the the CSV file is too big and it's struggling to see it. Let's do this. So, I'm just going to paste in the first 50 lines. Let's see if that helps. Okay, so it's figured out a mapping. Date posted, job title, job URL, category, payment status. That's probably not right. Rating text, rating value, rating details. Okay, so some of these are good. This is also like a hard thing for the model. So, let's try something else. Let's try to make a notebook and then we'll go to this put Jupiter lab I pi kernel and then we'll install. So I spelled that wrong and we'll try again. Seems like it worked. So we can open this markdown file in here and just say data prep for upwork job extract. So we could do this and then write the code here. But personally I don't like the interface for notebooks in cursor or VS code. I prefer it in Jupyter Lab. So, we can just launch Jupyter Lab here. And we can see that first line's there. Usually, I do all my data prep in Jupyter Lab anyway because you need that quick feedback. Since cursor wasn't able to do this for us, we'll just do it the oldfashioned way. Now, we're in a better position to see if those headers were any helpful. Let me just steal this code here and I'll paste it over here. Let's just do the top one. This saying it's the date posted. That's fine. Job title. That's good. Job URL. Job category. We might need to see some other examples. So, let me see what like 400 looks like. Okay. So, I'm going to call this search because this is what I used to search for these jobs. Payment status. Okay. Payment verified rating. So, I'll call this client rating. Oh, I see. So, these are all like different kinds of client ratings. So, I'm going to say client rating text, client rating value, client rating, I guess details. That was fine. Client total spent. That's good. Well, it's getting cut off now. Okay. So, client status. I got to do this. That might be noise. So, let's go look at another record. Spent spent. Okay. So, what does 100 say? Spent. Spent. Spent. Let's try tail. Okay. So, that isn't really a helpful thing. So we'll call it spent client location job rate. So that's hourly one. Let's see if we can find any other examples. Hourly hourly. Hourly hourly. Fixed price. Fixed price. So we'll just put hourly or fixed here. Job expertise level. Interesting. It looks like estimated time got its own thing. Oh, it's either estimated time or estimated budget. Time or budget. Job hours per week. Let's do duration or budget. Job description, skill one, skill two, skills three, skill four, skill five, proposal label. Let's go back here cuz I had already manually did one. Number of proposals is proposal label. So, let's call that numbum proposals. I feel like that's good enough. So, let's rename everything. So, we redid that. And let's make sure everything was changed. Yeah, that looks good. Now, it seems like there's a lot of things that we don't need. So, the thing we care about are going to be the job description and the skills for those jobs and then how much those jobs are paying. Yeah, maybe we can just get it from the job title. We can keep URL. We'll keep search term. Payment status isn't super important. Client rating, all this stuff isn't important for now. Maybe a future thing. Spent is not helpful cuz it was just saying spent over and over again. Hourly versus fixed is good. Job expertise, I guess that's not super important either. Estimated budget or time. So, we're going to have to write some logic here because this field, it's either going to be the estimated time or budget. And if it's estimated time, it usually has a hourly rate associated with it. And then there's also budget, job description, and then the different skills. We don't need this. I think that should be good. Let's just keep these columns. And then we'll do this. DF new new head. This is much easier to parse. Now we can do some manipulations. We'll change the column names. And then we'll drop a bunch of columns. And then I guess another thing we can do is we need to drop duplicates. So it didn't seem like anything got dropped. Let's try this. Try to do the URL. Aha. Okay. So there were duplicates. Oh, okay. Got it. So there were no duplicates based on the row because the search term could have been different. But if we do the URLs, we see that there are duplicates. So let's drop duplicates. Duplicate jobs. I guess we'll just call this DF. DF. Sure. Okay. Relax. Relax cursor. Okay, that's good. Let's say save first 10 rows. Let's try to run this. So I'm going to open a new terminal. I need to activate the environment. And then I'll run data prep. Hopefully, this is easier to work with for the LLM because we're going to need to do some things here. Let me just explain the problem to the LM and maybe we can brainstorm and let me not use the agent cuz it loves to go off the rails. So, this is one of the benefits of using LLMs is that you're forced to explain what you're trying to do clearly and in English. So, maybe this is the main value here. So, I have two kinds of jobs. They're hourly based or fixed price based. and I want to capture how much people are willing to pay for that job and represent it in the table. So how can I do that in a single table? So this is going to be a helpful like brainstorming situation. I want to use this data to represent how much people are willing to pay for each job. However, jobs can be either fixed price or hourly. How can I organize these into a table? Seems like it's coming up with something. So, it correctly identified that these are the three columns that matter. You want a table where each row is a job. Single column represents the comparable pay. Interesting. For the hourly jobs, extract that. Min, max, estimated hours per week. So, let's add data prep. So let's see how it handles this. Close this out. Close that out. Go back here. So it's making a bunch of helper functions. Let me actually make a new file and I'll call it functions cuz I don't want all these here. It's importing numpy. Numpy and reg x. Don't do that. And no need for this. Probably will need pandas. And then numpy should be installed. So I'll do pip list. Numpy is installed cuz pandas uses numpy. So we don't have to have that in the requirements file. reg x is a standard Python library. I typically like it to have doc strings new chat and then highlight all this stuff. And we can do command L and it'll automatically add these functions to the chat window which is really nice. And I'll just say like can you add doc strings? So that's doing that. We don't need to do this. So we'll go back here. We can see that it's suggesting all these changes. So we can go through one by one and like accept them one at a time. But I'll just go ahead and accept this whole file. I'm sure it's fine. Back to this chat here. And then we'll copy this code. But it doesn't have hourly rate max hourly rate min job title, job URL, pay type, estimated total pay. Let's add data. And you add these columns to the data frame. Okay. So let's see what this does. Let me just do one change and I'll say if you are writing functions write them in functions.py and we try again. Looks like all the other functions were already there. So it just added this one function and then it's updating the main script. Remove unneeded columns. That's pretty good. That's a good guess. Hourly or fixed duration or budget cuz now we have this. That looks fine. And then let's say reorder columns. That looks pretty good. Job top new search term. That looks pretty good. Okay, now let's save the whole thing. Save CSV to file and then we'll put Upwork cleaned CSV. So let's run this whole thing. What is this? Detected unusual line terminators. Remove them. I don't know. Let's see what that does. Job title, job URL, search term, pay type, hourly min. Here's it with numbers. This looks a lot better. Search term, paid type, hourly, min, hourly max, estimated hours per week, estimated total pay, job description, proposals, skill five is not helpful. It's good that we looked at the data. So, we'll just go ahead and remove that. What else? These like later skills don't seem super helpful, but I guess it's fine. We'll keep them around. I guess if it doesn't have an estimate, then we should drop it. So, let's do one last thing. Drop rows is nan or empty. We're going to have this boolean here and it's going to be is not nan. And I don't know if we want and we want the or. What is or? We can do shift command L and it'll create a new chat. I don't remember what the amperand does. So, what does amperand mean here? Yeah, it's a and. How do we do or yeah vertical bar? So this is why you should read the code. It's not always going to work as expected. So let's run this again. I changed the name. One data prep. So let's see if this updated. Didn't seem to change it. Yeah, that didn't work. So this is where we can go to the notebook. So it's always handy to have like a notebook on standby. Notebooks are really helpful for exploring data because you always end up doing something like this. Estimated total pay nan. Okay. So let's do is nan and we'll sum it 140. Okay. So maybe let's just drop this. They should all run some kind of calculation. So now none are nan. So let's just try to run this whole thing again. And then I'll just load in the data here. Upwork clean. Kill that. DF head. Upwork cleaned. Looks like they all have the estimate total pay now. Awesome. Why is search term nan? I feel like we got some more work to do cuz that shouldn't be nan. Impute missing values of search term using previous rows search term. FF fill. What is this? Let's go to the panda stock. Phil na. Wait. Deprecated. What? What does that mean? Now it's its own method. Okay, well that's good that we went to the doc. Fill name in by propagating the last observed value to the next. Okay, so let's just do that. Claude's letting us down. Impute missing value search term previous search term. Let's try to run this again. Then we'll go to our handy notebook. Let's see what that looks like. Yeah, that looks good. Hourly rate. Now we can start interrogating our data. Let's do a sample. Do the head 100. Perfect. And then we'll run this again. Can you count the number of rows that are hourly but have missing hourly rates in Upwork clean this one? You can run it. Oh, that's annoying. It doesn't have an environment set up. Let's just go to the handy dandy notebook and run this number total number of hourly jobs zero. It's cuz this needs to be capitalized. That's good enough for now. We might go further and realize there's some problems with the data and we have to backtrack and update our data pipeline. But this is like most of the work when it comes to data analytics and data science, creating the data pipeline and making sure we're getting all the information that we want. And of course, it's taken us a while to do this. Right now, we've been doing this for like an hour. Maybe it would have taken me 2 hours or more to do this from scratch in a notebook or something like that. So, I think we're in a good spot. I'll delete this. I'll keep our notebook around. No need for that. And let's just run this one more time. And I don't need this. And I'll leave that. Analyze hourly rates. We don't need that. That wasn't helpful. Thanks for not being helpful, agent. That's fine. Functions data prep. I think we're in a good spot. Now, let's create a file to create the actual dashboard. Create dashboard. And maybe it'll be helpful if we constrain the text stack. So, I'm going to have it use streamllet. Let me say something like, can you use streamllet to create a dashboard summarizing the job data in Upwork cleaned? It's too big. So, we'll just have this truncated version and we can just swap out the data as needed. What the Maybe it's trying to anticipate something. I don't know what's going on. Can you stream create dashboard summarizing the job data in this file? Let's give it some things. Here are some things to include. Include a bar plot of the top five most popular skills. Highest paying jobs. So, it's going to have to figure out how to do that. And then let's do highest paying skills. So, it's running some stuff. Okay. So, let's just accept this file. And then why are you trying to get rid of my Jupiter lab, bro? So I'll reject do that. We'll just bring in plotly and streamlet. Did all that and then we'll copy this. So let's do a pip install requirements.txt. Clear that out. We'll run this streamllet dashboard. What the Okay, here we go. Hopefully this works. Whoa. So let's see. Most popular skills. AI is a skill. Interesting. Agent development. Shouldn't be super surprised about that. Highest paying skills. How did it infer that? Average hourly rate. That's cool. I like this key statistics here. 100 jobs, hourly rate. Maybe we could do this. So, let's make some changes to this. Delete all this. Here's something to include. Key stats cuz I liked how it did that. Let's do number of jobs. Key stats at the top. Number of jobs. Average hourly rate. average fixed price average estimated total pay with dropdown to select search term. Let's start simple and just have the following component and then I will do the ask version of this continue without reverting. Now we gave it a lot more guidance. I liked that we let it try on its own first because it gave me some ideas on what the dashboard could look like. I'm just apply this over. And now I'm taking a step back and going to build it out like one piece at a time. So let's kill this and then we'll try to run the dashboard again. Okay, nice. This looks good. Upwork job dashboard number job hourly rate fixed estimated total pay. Okay, so this is not right. Let's go in the code and try to figure out where search term search term is not normalized. Let's go to our handy notebook to understand why. So df search term interesting. So let's take a step back. Standardize search term values. Yes, we'll do that. Can you further standardize the search term values to be any of the following AI, ML, statistics, data engineering? Here are the unique values. I don't think that bit is necessary. Let's see. Can you wrap this in a function and write it in functions pi? Why did you add this? You monster. Oh, wait. Did I have that? Oh, I did have that. Oh, it's just doing the whole thing. That's fine. What is this? Wait, replace the block. Did that apply? Let's see if that. Wow. Okay, nice. And then I'll just do that. And that should work. I'll kill this. Clear it out. And then we'll run this pipeline again. So that ran. Let me just keep this head in there. It's pretty helpful. Now let's run this dashboard again. Okay. So, oh gosh. Oh, that makes sense. This is just the first 100 rows. Aha. All right. So, now we have these three. We have 735 jobs after everything. So, here's the average hourly rate for all of them. Fixed price. Average total pay. Okay. So, that's cool. Maybe one thing we can do is go to a previous chat. Boom. Okay, looks great. Can you update this so that when a search term is selected, the key stats are compared to the key stats for all the jobs. See if we can do this. So, this is now the fun part. Before the building of the data pipeline is a lot of work. It's tedious and AI isn't super helpful because we can't fit the full data set in the context window of the LLM. So, it makes it less helpful. But once we got that settled, playing around with the UI is much easier, much more fun. Okay, so do this. Then I'll do this restart. Oh, that's slick. That is slick. Okay, ML data engineering. Oh, come on. And I guess statistics is the worst. But I guess there's very small number of jobs in statistics. Mel AI. That looks great. Let's do something else below this. We need to have like some kind of bar chart. Yeah. So let's do the estimated total pay distribution of each. Perfect. Now below this, can you add a distribution of the estimated total pay which is also filtered by the search term selected? All right, it's writing code. It's doing stuff. Apply. Okay. Oh no, I need to import my plot lib. Matt plot lib. Why is plotly being imported? Yeah, maybe we'll we'll have to get rid of plotly. I don't know why it's being installed. So, we're going to install that plot l and then we'll try again. A doesn't seem like the plot changed much. Oh, yeah. It's changing. I'd love to hover over and see the key metrics for each of those cohorts. Is it possible to make the bar chart interactive so that when you hover over a bar, it shows key stats like total number of jobs in group average. So we'll use plotly instead of mplot lib interactive histogram. What code? I don't see any code. Got a little wonky there for a second, but let's see if this works. Kill this. Run dashboard again. Okay, range. Interesting. Looks nice. AI. So, high hourly rate. So, I guess you want to do the AI jobs. Perfect. Let's do all. And then below, I want to do a ranking of the top skills. Below that histogram, I want a horizontal bar chart showing the top skills for the jobs. Additionally, I want this to get filtered based on the selected search term. Finally, I'd like an option to sort by count. i.e. most popular and highest paying based on the estimated total pay. So, this will probably be the last thing. I think this will be like a pretty cool thing to see. Accept file. Let's see if this works. Oh, yeah. A sort option not defined. Let's see. I got an error. Okay. Yeah. So, don't put it there. We're supposed to put it here. So, correct. Yeah, I think that's good. So, we are now vibe coding. We are officially vibe coding. Well, I guess we've been vibe coding for a while. But now it's absolutely official because I have no idea what's going on here. Cuz the thing about visualizations is that it just takes a lot of coding and trial and error to get it looking good, which makes it one of the best things to vibe code cuz no one's got time for that. Here we go. Yeah, look at that. But that looks really good. Ice ping. Whoa. reinforcement learning plus 19. What is + 19? Where's he getting these skills from? Looks like we got to fix the data. We're going to take this and we're going to go to our handy notebook to see what the hell is going on here. So, we'll replace this with this. This is just empty series. Yeah. Okay. So, now we're going to go through this process of actually adding skills to that. So, we're going to gather all the skills into a single series. you monster. Replace all. Run it. So now let's see what skills looks like. Plus three. What is What is plus three? What does that mean? Well, first let's do this. I think it's just adding each unique skill into its own thing. Yeah, there shitload of skills. Okay, so skills. And let's do this now. We'll go to our handy AI and say, "Can you write me some code to standardize these skills and remove ones that are not skills at all?" EG plus one. It's just noise from the scraping. So, it's thinking it through first, which is great. How can I integrate this code into and functions? code looked good, but it was all over the place. So, we'll apply this to the functions except file and then data prep. Apply you to data prep. Looks good. Do this. Clear that out. Oh, clear. Python one data prep. Clear. And then this should be much better now. So, we're going to streaml it. Run. Oh, nice. Okay, this is helpful. Average estimated total pay. image processing, reinforcement learning, media analytics, sign language, organic traffic growth, competitive intelligence, automate speech recognition, business consulting, AI generated code, technical SEO, psychology, healthcare, mental health. Okay, let's add a couple more things. I know I need to stop because I'm just going to like keep adding things, but this is like the fun part. Since I don't have to go through the arduous work of coding all this, I can just let my imagination run and have the AI make all these fun little features. Looks great. Can you update the tool tips on the skill horizontal bar plot to include average estimated total pay and total number of jobs listing the skill? Okay, interesting. That's cool. For the full plotting now looks like this. Okay, we don't need that. Camera's about to die, so I gotta really finish this. So, tool tip. Yeah, look at that. Total number of jobs, average pay. Nice. Highest paying image processing. See, that's the thing. This is why it's important to know this because this is just one job. One job is just paying really well. And that's the thing about fat tails. Organic traffic growth. Yeah, these are all oneoffs. That's why it's helpful to have both of these views. This is what people are asking for. or they will ask for artificial intelligence and data science, but also Python, data entry, machine learning, and then you can see like the typical pay. So, easy way to increase your revenue if you're a data scientist, don't say data science, say AI. Look at that $2,000 pay increase right there. Machine learning, Excel, data analysis, AI agent development. Okay, that's on the rise. Super high leverage. Look at that. $24,000 average estimated pay. So, that's another thing you can do. So you don't want it to just be popular. You want it to be in demand. So machine learning, don't even say AI, say machine learning because the people who know are willing to pay for it. Data analytics, that's good. AI agent development. Just put agent at the end of AI and you'll make significantly more money. JavaScript, data scraping, automation. Beautiful. Let's test this. So let's do AI. And then these are the jobs under AI. And we got Yeah, this would have taken me like a weekend if I was not using AI to help me code it. And I probably wouldn't be able to make something look this snazzy. This took me 2 hours to code completely from scratch. Probably would have taken me 2 days to code if I wasn't using LLMs to help me along the way. A lot of the work was just getting the data together and figuring out what I actually wanted to code. I feel like part of the problem is that it's hard to fully know what you want when it comes to like data projects like this from the outside because you need to look at the data, interact with the data, see what's available before you can start planning out what you want. So, I do find that you want to do a little bit of planning, but you can't do too much planning cuz you just have to dive in and look at the data, all that kind of stuff. Just to recap, there are like three major buckets when it comes to coding with AI assistants. One is just have the AI do the entire project for you. That's what we tried initially for this project and we saw that it threw out an error. The code was pretty complicated and it didn't even feel like it was something that was salvageable kind of align with the end product that I had in mind that looks something like this. The other extreme is you don't use AI assistance at all. You just code it from scratch. for this project. Since it was kind of complicated and it was kind of unclear what I wanted, it was helpful that I started just writing the code from scratch and then bringing in the LLM slowly to code up specific pieces of it. And then that kind of led to this middle ground where a lot of the code was already written and we could just use this AI in chat mode to write code and apply it to the existing codebase. So, I hope this walkthrough was helpful. It just showed you the nitty-gritty details and the reality of what it actually looks like for me to code a project from scratch. I'll share this code on GitHub. And if you have any questions, please feel free to let me know in the comment section below. And as always, thank you so much for your time and thanks for watching.

Original Description

🤝 Work with me: https://aibuilder.academy/yt/uItWjWjH_Rs 🚀 Ship AI apps in weeks, not months: https://aibuilder.academy/courses/yt/uItWjWjH_Rs Here, I build an Upwork AI job dashboard from scratch using Python, Cursor, and Streamlit. 💻 Code: https://github.com/ShawhinT/upwork-job-dashboard Coming up - 0:00 Introduction - 0:30 Cursor UI - 1:13 Going from 0 to 1 - 2:27 Agent does everything - 6:30 Starting over (lol) - 8:30 Fixing headers in a notebook - 11:55 Transforming data with LLMs - 16:45 Creating dashboard with Streamlit - 24:15 Adding features (fun part) - 28:57 Final result & recap - 37:28
Watch on YouTube ↗ (saves to browser)
Sign in to unlock AI tutor explanation · ⚡30

Playlist

Uploads from Shaw Talebi · Shaw Talebi · 0 of 60

← Previous Next →
1 biometricDashboard2 DEMO
biometricDashboard2 DEMO
Shaw Talebi
2 biometricDahboard3 DEMO
biometricDahboard3 DEMO
Shaw Talebi
3 Time Series, Signals, & the Fourier Transform | Introduction
Time Series, Signals, & the Fourier Transform | Introduction
Shaw Talebi
4 The Fast Fourier Transform | How does it (actually) work?
The Fast Fourier Transform | How does it (actually) work?
Shaw Talebi
5 The Wavelet Transform | Introduction & Example Code
The Wavelet Transform | Introduction & Example Code
Shaw Talebi
6 Principal Component Analysis (PCA) | Introduction & Example (Python) Code
Principal Component Analysis (PCA) | Introduction & Example (Python) Code
Shaw Talebi
7 Independent Component Analysis (ICA) | EEG Analysis Example Code
Independent Component Analysis (ICA) | EEG Analysis Example Code
Shaw Talebi
8 Kmeans-based Blink Detecter DEMO
Kmeans-based Blink Detecter DEMO
Shaw Talebi
9 Shit Happens, Stay Solution Oriented
Shit Happens, Stay Solution Oriented
Shaw Talebi
10 Why Conflict Is Good & How You Can Use It
Why Conflict Is Good & How You Can Use It
Shaw Talebi
11 Causality: An Introduction | How (naive) statistics can fail us
Causality: An Introduction | How (naive) statistics can fail us
Shaw Talebi
12 Causal Inference | Answering causal questions
Causal Inference | Answering causal questions
Shaw Talebi
13 Causal Discovery | Inferring causality from observational data
Causal Discovery | Inferring causality from observational data
Shaw Talebi
14 How to Be Antifragile | 7 Practical Tips
How to Be Antifragile | 7 Practical Tips
Shaw Talebi
15 Multi-kills: How to Do More With Less (no, not by multi-tasking)
Multi-kills: How to Do More With Less (no, not by multi-tasking)
Shaw Talebi
16 Topological Data Analysis (TDA) | An introduction
Topological Data Analysis (TDA) | An introduction
Shaw Talebi
17 The Mapper Algorithm | Overview & Python Example Code
The Mapper Algorithm | Overview & Python Example Code
Shaw Talebi
18 Persistent Homology | Introduction & Python Example Code
Persistent Homology | Introduction & Python Example Code
Shaw Talebi
19 What Is Data Science & How To Start? | A Beginner's Guide
What Is Data Science & How To Start? | A Beginner's Guide
Shaw Talebi
20 How to do MORE with LESS - multikills
How to do MORE with LESS - multikills
Shaw Talebi
21 Causal Effects | An introduction
Causal Effects | An introduction
Shaw Talebi
22 Causal Effects via Propensity Scores | Introduction & Python Code
Causal Effects via Propensity Scores | Introduction & Python Code
Shaw Talebi
23 Causal Effects via the Do-operator | Overview & Example
Causal Effects via the Do-operator | Overview & Example
Shaw Talebi
24 Causal Effects via DAGs | How to Handle Unobserved Confounders
Causal Effects via DAGs | How to Handle Unobserved Confounders
Shaw Talebi
25 Smoothing Crypto Time Series with Wavelets | Real-world Data Project
Smoothing Crypto Time Series with Wavelets | Real-world Data Project
Shaw Talebi
26 Causal Effects via Regression w/ Python Code
Causal Effects via Regression w/ Python Code
Shaw Talebi
27 5 Reasons Why Every Data Scientist Should Consider Freelancing
5 Reasons Why Every Data Scientist Should Consider Freelancing
Shaw Talebi
28 An Introduction to Decision Trees | Gini Impurity & Python Code
An Introduction to Decision Trees | Gini Impurity & Python Code
Shaw Talebi
29 10 Decision Trees are Better Than 1 | Random Forest & AdaBoost
10 Decision Trees are Better Than 1 | Random Forest & AdaBoost
Shaw Talebi
30 Dimensionality Reduction & Segmentation with Decision Trees | Python Code
Dimensionality Reduction & Segmentation with Decision Trees | Python Code
Shaw Talebi
31 How to Make a Data Science Portfolio With GitHub Pages (2025)
How to Make a Data Science Portfolio With GitHub Pages (2025)
Shaw Talebi
32 My $100,000+ Data Science Resume (what got me hired)
My $100,000+ Data Science Resume (what got me hired)
Shaw Talebi
33 How to Create a Custom Email Signature in Gmail (2025)
How to Create a Custom Email Signature in Gmail (2025)
Shaw Talebi
34 I Spent $675.92 Talking to Top Data Scientists on Upwork—Here’s what I learned
I Spent $675.92 Talking to Top Data Scientists on Upwork—Here’s what I learned
Shaw Talebi
35 Lessons from Spending $675.92 to Talk to Top Data Scientists on Upwork #freelance #datascience
Lessons from Spending $675.92 to Talk to Top Data Scientists on Upwork #freelance #datascience
Shaw Talebi
36 A Practical Introduction to Large Language Models (LLMs)
A Practical Introduction to Large Language Models (LLMs)
Shaw Talebi
37 The OpenAI (Python) API | Introduction & Example Code
The OpenAI (Python) API | Introduction & Example Code
Shaw Talebi
38 The Hugging Face Transformers Library | Example Code + Chatbot UI with Gradio
The Hugging Face Transformers Library | Example Code + Chatbot UI with Gradio
Shaw Talebi
39 Why I Quit My $150,000 Data Science Job
Why I Quit My $150,000 Data Science Job
Shaw Talebi
40 Prompt Engineering: How to Trick AI into Solving Your Problems
Prompt Engineering: How to Trick AI into Solving Your Problems
Shaw Talebi
41 The REALITY of entrepreneurship. #entrepreneurship #startup #smallbusiness
The REALITY of entrepreneurship. #entrepreneurship #startup #smallbusiness
Shaw Talebi
42 Fine-tuning Large Language Models (LLMs) | w/ Example Code
Fine-tuning Large Language Models (LLMs) | w/ Example Code
Shaw Talebi
43 How to Build an LLM from Scratch | An Overview
How to Build an LLM from Scratch | An Overview
Shaw Talebi
44 I Have 90 Days to Make $10k/mo—Here's my plan
I Have 90 Days to Make $10k/mo—Here's my plan
Shaw Talebi
45 I Spent $716.46 Talking to Data Scientists on Upwork—Here’s what I learned.
I Spent $716.46 Talking to Data Scientists on Upwork—Here’s what I learned.
Shaw Talebi
46 Pareto, Power Laws, and Fat Tails
Pareto, Power Laws, and Fat Tails
Shaw Talebi
47 Do NOT become an entrepreneur #entrepreneurship
Do NOT become an entrepreneur #entrepreneurship
Shaw Talebi
48 Detecting Power Laws in Real-world Data | w/ Python Code
Detecting Power Laws in Real-world Data | w/ Python Code
Shaw Talebi
49 How I’d learn data analytics (if I had to start over in 2024) #dataanalytics
How I’d learn data analytics (if I had to start over in 2024) #dataanalytics
Shaw Talebi
50 4 Ways to Measure Fat Tails with Python (+ Example Code)
4 Ways to Measure Fat Tails with Python (+ Example Code)
Shaw Talebi
51 Fine-tuning EXPLAINED in 40 sec #generativeai
Fine-tuning EXPLAINED in 40 sec #generativeai
Shaw Talebi
52 How Much YouTube Paid Me in My First 6 Months of Monetization (as a Data Science Creator)
How Much YouTube Paid Me in My First 6 Months of Monetization (as a Data Science Creator)
Shaw Talebi
53 5 Questions Every Data Scientist Should Hardcode into Their Brain
5 Questions Every Data Scientist Should Hardcode into Their Brain
Shaw Talebi
54 AI for Business: A (non-technical) introduction
AI for Business: A (non-technical) introduction
Shaw Talebi
55 LLMs EXPLAINED in 60 seconds #ai
LLMs EXPLAINED in 60 seconds #ai
Shaw Talebi
56 3 Ways to Make a Custom AI Assistant | RAG, Tools, & Fine-tuning
3 Ways to Make a Custom AI Assistant | RAG, Tools, & Fine-tuning
Shaw Talebi
57 What is #ai? — Simply Explained
What is #ai? — Simply Explained
Shaw Talebi
58 QLoRA—How to Fine-tune an LLM on a Single GPU (w/ Python Code)
QLoRA—How to Fine-tune an LLM on a Single GPU (w/ Python Code)
Shaw Talebi
59 How to Improve LLMs with RAG (Overview + Python Code)
How to Improve LLMs with RAG (Overview + Python Code)
Shaw Talebi
60 Text Embeddings, Classification, and Semantic Search (w/ Python Code)
Text Embeddings, Classification, and Semantic Search (w/ Python Code)
Shaw Talebi

This video teaches how to build an Upwork AI job dashboard using Python, Cursor, and Streamlit, and demonstrates the power of integrating LLMs for fast coding and data analysis. By following along, viewers can learn how to apply LLMs to real-world problems and improve their coding efficiency.

Key Takeaways
  1. Build an Upwork job dashboard from scratch using Python
  2. Integrate LLMs for fast coding and data analysis
  3. Use Cursor to generate code and run it
  4. Create a dashboard using Streamlit
  5. Use Plotly to create interactive visualizations
  6. Standardize search term values
  7. Filter results by selected search term
  8. Add ranking of top skills for jobs with horizontal bar chart
💡 The hybrid approach to coding with AI assistants, which involves writing code from scratch and then using AI to assist with specific pieces, can save time and improve code quality.

Related AI Lessons

I Asked ChatGPT to Fix My Life. It Couldn’t — Until I Changed One Thing
Learn how to effectively use AI like ChatGPT to improve your life by changing your approach
Medium · AI
I Asked ChatGPT to Fix My Life. It Couldn’t — Until I Changed One Thing
Learn how to effectively use ChatGPT to solve personal problems by changing your approach
Medium · ChatGPT
Claude Sonnet 5 Is Here: Why It Might Replace Your Opus Subscription
Learn about Claude Sonnet 5, a new AI model that offers near-flagship performance at a lower price, and its potential to replace Opus subscriptions
Medium · Programming
Introducing Claude Sonnet 5 on AWS: Anthropic’s most capable Sonnet model
Learn about Claude Sonnet 5, Anthropic's most advanced Sonnet model, now available on AWS, and how it delivers top-tier intelligence for coding, agents, and professional tasks
AWS Machine Learning
Up next
5 Levels of AI Agents - From Simple LLM Calls to Multi-Agent Systems
Dave Ebbelaar (LLM Eng)
Watch →