Read about the journey that brought me to pursing a career in software development.
TL;DR: Brendan Medoro has
a B.S. in Mathematics with minors in Computer Science and Business
Administration. As a former professional baseball player, he understands what dedication,
hard work, and a great team can create...
Thanks for checking out my website and taking some time to learn more about me! My name's Brendan Medoro, and growing up, my gut always told me: "Numbers run the world." I used to think that meant "numbers" in the context of math, statistics, or money, but more recently, I think the numbers that really run the world now are the ones inside computers. These 1's and 0's have become deeply embedded into our daily lives, and they can influence whether we're having a good day or bad one. I want to be part of a team that leverages these digital numbers to create helpful resources for users.
Student-Athlete When I committed to play NCAA Division I baseball at Fairleigh Dickinson University (FDU) in my senior year of high school, I thought I wanted to be an actuary. Prior to committing to FDU in Teaneck, New Jersey, I was under the impression that they had a Bachelor of Science in Mathematics degree with a concentration in Actuarial Science. However, this concentration was actually only offered at the other FDU New Jersey campus (Florham). Because of this slight mix up, I elected to pursue a Mathematics degree with a minor in Business Administration. My academic advisor also informed me that because my major was math, I would be able to earn a Computer Science minor by taking a few extra classes. I had taken technology classes in high school and enjoyed learning about computers, so adding this minor felt like a no-brainer. Looking back, the classes that I took for my minors were very influential in helping me realize the true range of interesting career options available.
A few years into my degree, I realized that I didn't want to be an actuary. Outside of baseball, I didn't know exactly what I wanted to do for a career. Still, I was enjoying a majority of my classes, and my non-math classes always seems to lead to or mention concepts my math classes were covering (especially Discrete Structures, Differential Equations, Calculus III, and Linear Algebra concepts). Clearly, high level math (or abstractions of the concepts) is everywhere, so I stuck with my degree, knowing it would likely apply to my future career in one way or another. Because of the pandemic in 2020, I was granted another year of eligibility. I also finished my undergraduate degree a semester early, so I was able to complete 3 semesters towards my Master's degree in Sports Management during my time at FDU. Since I loved baseball, pursing a career in the sports industry after my playing career sounded appealing.
Professional Baseball This is where my story gets a little...unconventional. I was blessed to be able to be a main contributor on the FDU Knights pitching staff for 5 seasons and a team captain in 2022 and 2023. When I first arrived at FDU, the program was struggling to re-establish itself, and we finished the 2019 season with a 15-37-1 record. Fast forward to my final season in 2023, and we finished 31-21-1, setting the program record for team wins in a season. The teammates from my freshman year that stayed at FDU, and I, played a crucial role in helping FDU baseball reestablish itself by putting in consistent effort on and off the field during our student-athlete careers. Individually, I had over 250 innings pitched in 81 career appearances. In 2023, I recorded my 20th career win, and I had a 9-0 record overall that season. These are the current program records for most individual wins in a career and season. I also recorded 16 saves in my college career, tied for 2nd most in program history.
After my last college game, I knew I wanted to play professional baseball, but I didn't receive any interest from affiliate teams or any professional teams. A hometown friend who I played Little League with told me about a league in Washington, Pennsylvania that he was playing in, where the goal was to sign players to independent baseball league contracts. At the time I really didn't know anything about indy ball; I just knew this was a good opportunity to get to professional baseball, so instead of driving home to Florida, I was off to Pennsylvania. After a month of living in another generous friend's living room, I signed my first professional contract with the Spire City Ghost Hounds in the Atlantic League. My first professional appearance was on July 4th, 2023. This is also the day I earned my first professional win. My experience on the Ghost Hounds helped me sign with the Billings Mustangs of the Pioneer League the following season, where I led the team in wins and innings pitched. Most recently, I pitched for the Charleston Dirty Birds of the Atlantic League in 2025. In Charleston, West Virginia, I had the opportunity to be a part of the CAMC Women and Children’s Hospital Kids Only Press Conference, which was definitely one of the coolest moments in my baseball career.
AI and Software Development In the off-season after playing with the Ghost Hounds, I started working on projects for DataAnnotation.tech. This gave me hands on experience training AI models, and I gained intuition about the capabilities and shortcomings of AI, which is quickly becoming the center of our collective attention. As AI continues to integrate into everything we do (like developing quality software for users), it's important to be able to communicate effectively with models and evaluate their outputs critically. Blind trust of AI can lead to catastrophic failures or misunderstandings, but at the same time, not using any AI makes you slower than the competition.
The next blog post (particularly the final paragraphs) contain some of my personal experiences with the most well known LLMs. I also discuss using Gemini and Firebase Studio to create Lineup Legends. Leading up to creating and deploying Lineup Legends, I had been learning Python to prepare for finding a job in the tech industry, but I didn't really know what kind of job I wanted. The process of bringing my idea to life while trying to consider real users playing the game is what has brought me to pursuing software development. Right now, there are more tools than ever available to build software that can do just about anything. I want to be on a team that leverages these tools to create amazing things that people love to use. To do this at a level that meets my expectations, I need to keep learning about programming, system design, and leveraging AI.
While in college, I had classes where I used HTML, CSS, JavaScript, C++, Java, R and SQL. The course names that incorporated these languages always resonated with me as something I was genuinely interested in doing (e.g. "Programming For the Internet", "Mobile App Development", "Big Data Analytics with R"). However, I wouldn't say my experiences with those languages in college made me completely comfortable working when them long term. Honestly, sometimes it was even discouraging. For example, I finished Mobile App Development with experience building multiple small projects in Android Studio with Java, but I would not have been comfortable enough to say that I could completely develop a mobile app or was great with Java. In reality, I learned how to do something useful in all of those classes (e.g. querying a database, learning about data structures), but I lacked a true understanding of how to connect everything I was learning to build the best possible version of whats needed. My more recent experiences self-learning and developing a personal portfolio with HTML, CSS, and JavaScript have made me comfortable with those languages. Also, the Python Essentials 1 course from the Python Institute helped me build foundational skills, but my own personal projects and debugging AI generated and my own code has been very beneficial in helping me learn more, especially for libraries. I love learning new, useful information, and a career in software development definitely involves life-long learning.
Wrap Up Overall, my skills are a mixture of technical and personal. I have always been interested in numbers and their grip on humanity. Math bleeds into everything, and being able to solve complex problems by breaking them down into smaller problems is a nice consequence of that. At the same time, my experiences in baseball have made me value an ambitious team of real people. Being able to communicate internally, and even externally, as a team is important to create something that satisfies requirements and makes the team proud. I believe I can be an asset for any team because I take pride in what is trying to be accomplished, and I am willing to learn and apply anything necessary to reach the goal.
Here Comes AI, doo-doo-doo-doo
Are we cooked? Should we rejoice to the tune of The Beatles, or is it just doo-doo?
TL;DR: Based on making Lineup Legends
with AI assistance, and other personal experiences, I say we're somewhere in-between still...
"Did this guy really just yap about his AI chats for four paragraphs?" Yes...(it's an epilogue now), but you basically have all the context behind my final speculations if you read it. Sometime in 2025, a free month trial of Gemini Pro was in front of me, and I bit. I figured I would try it for a month and cancel my subscription at the end. I still have Gemini Pro, and these most recent interactions have cemented my current beliefs about AI in general. I started generating code regularly with Gemini toward the end of the Python Essentials 1 course from the Python Institute. Sometimes, Gemini helped me spot overlooked formatting errors, which prevented me from putting my fist into my laptop. Other times, it just showed me better ways to implement my if-elif-else statements. Did I become an OG ChatGPT Zoomer from paragraph 1? No, Gemini became a helpful learning resource while getting my feet wet in Python. But I still felt like the way I was going about my journey back to coding didn't make sense.
The Python Essentials 1 course definitely helped me learn some Python fundamentals, as I had never written a Python script prior to that. However, I felt like some of the exercises at the end of the course were designed to use impractical methods of development for the sake of practicing vanilla Python. For example, one of the exercises involved implementing a Tic-Tac-Toe game where you play against the computer. They requested that the computer could only choose a random space to play, and the specifications called for the user to have to keyboard input the number of the space they wanted to use for their turn. They also wanted the computer to always start with an X in the middle space.
I get that this is for simplicity and hammering fundamentals, but nobody wants to play that game. Just draw a tic-tac-toe board and use eeny, meeny, miny, moe. My point being, Gemini would make a better python game with a simple prompt like: This One. Bang. A functional, more visually appealing tic-tac-toe Python game in a few minutes. However, that brings us to the crux of why feelings about AI range from "best thing ever" to "slop". If you play the game, you'll see that every key instruction is satisfied, but when the game ends, there's an issue with the play again screen. There are X's and O's on top of messages on the screen. The player has to struggle to read the message clearly if there are any X's or O's played in the middle row, and it's visually unappealing. This is unfortunate because the board fading out was actually a clever idea that Gemini incorporated.
What do we do now? Pretend we didn't see it? Ask Gemini to fix it? How about we take a look at the code? We see the board is set up as a 2D array where all values are initially None. As the players select their moves, the array gets filled with "X"'s and "O"'s, which triggers drawing an X or O over the corresponding spaces. There's also a function that draws the play again screen when it's called. I edited the code in this function (draw_play_again_screen(result_text))to set the middle row values back to None which retains the appealing fade out while making the text in the middle of the screen readable. Gemini provided a very strong foundation, and I was able to learn about pygame while making the game better. Maybe it isn't that much of a hot take anymore, but I believe this is the future of software development and life in general. Humans augmented with AI. To me, it seems similar to the adoption of the Internet. This chart shows the rapid increase of American adults that used the Internet from 1995 (14%) to 2014 (87%). At first, technical understanding limited meaningful interactions, but as the Internet evolved and users became accustomed, it grew to being inescapable. Now that people are becoming comfortable with prompting and AI powered tools are being created for any task you can imagine, AI truly is becoming inescapable. Adapt or get left behind. For me, the most fun way to see how well I could adapt was vibecoding a sports game.
For a few days, I tried to think of an app that solved a real problem, but I couldn't really come up with anything original that I felt like I could get to a final product by myself. In retrospect, I could have chosen an unoriginal idea (e.g. goal tracker) and tried to execute it perfectly, but I think I was too focused on doing something more unique. Regardless, one night I was mulling over some options before bed and it hit me. It'd be fun to make a game similar to Immaculate Grid, and baseball fans could be looking for some additional nostalgia during the off season. How about a game where you get a random MLB lineup from the past that needs to be arranged in the correct order? If that sounds like fun, and you want to try to guess what year the lineup is from, then you should check out Lineup Legends!
Initially, Lineup Legends started as a vibecoded Python game with two random MLB lineups that updated automatically once a day through the MLB Stats API. The game was straightforward, everyday, there are two lineups (one from the current season and one from before that) that are given to the player in the incorrect order. The associated stats are in the correct order and could be used to help make informed guesses. Then, to complete the challenge, the player needs to guess the correct year of the given lineup. Since older lineups have pitchers that could help players identify the correct final spot in the order, I decided to add the "View Subs" feature in hopes that people would give a few good-faith attempts before spamming guesses. The View Subs toggle places an asterisk next to any spot in the order that was pinch hit for during the game. This would benefit users who can identify players that often platoon or are often removed in favor of a better hitter late in games.
If you made it to this paragraph, hopefully you at least get a laugh. My development process up to that point was...flawed to say to the least. If I wanted to to implement a fix (let's say make sure the View Subs asterisks always stay in the same spot when toggled on), here was my workflow: I tell Gemini the problem, Gemini rewrites every line of code, I copy and paste the code into a Python file, (IDLE please run), make sure the game works as intended. Some comments. There were definitely times where I would be stuck in a loop of copying and pasting between Gemini and my file. This was while making sure I was either saving working code into its own file or selecting all and commenting out older versions that might be worth keeping or having in case something went wrong. It was just pathetically inefficient, and even if I did make my own changes in the code (say changing "2024" to "2025"), Gemini would decide to change it back sometimes. Or even worse, sometimes I would fix one issue and then when I'm halfway through fixing something else, I'd notice that whatever I just fixed wasn't working again. The worst feeling was thinking that everything was working as intended until I'd test the game as a normal player and realize that the asterisks were moving around the screen as players were swapped. To be fair, my experiences in AI training has helped me become pretty good at prompting models, recognizing hallucinations, and getting a sense of when I should rethink my approach. I completed my goal of vibecoding a game, but it definitely was not all vibes.
After a few days of trying to create Lineup Legends through the most inefficient way possible, I decided that I wanted to put it on the Internet. That's what brought me to Firebase (free hosting) and Firebase Studio. Looking back, it may have made more sense to learn how to get the game I made onto the web with WebAssembly and pygbag or looked into Django, but this was also my first ambitious Python project. I think the most likely explanation is that I was hoping the prototyper version of Gemini on Firebase Studio would just be able to do everything for me. Realistically, my new Gemini friend had no issues recreating the game with NextJS and React. It definitely struggled to implement the MLB Stats API correctly to get the two lineups and update them correctly at first, but when I gave it the Python code that was getting the original version to work, the prototyper Gemini was able get it. Also, because this model built the new version from scratch with a plan and saved previous versions after each prompt, I actually had some form of version control! I was able to try more "risky" prompts or try to make code changes myself, knowing that I could revert to the last version with the click of a button. Admittedly though, I had no prior experience with TypeScript, React, NextJS, or API usage, and frankly, I was more concerned about vibecoding a finished product than complete understanding.
I knew I wanted to implement a database and authentication so that players could save their coins, and doing this all as a Firebase project with one Firebase workspace and Gemini was fairly simple. Mainly, I just had to make sure I was understanding the documentation and applying it to my situation. I also had to get comfortable in the IDE and understanding how to incorporate Gemini correctly. I honestly find it impossible to believe that I graduated without having Visual Studio Code on my laptop. I had been doing almost all of my coding in college on Visual Studio 2019, and honestly, I'm excited to have recently downloaded Visual Studio Code (January 2026) so that I can actually feel comfortable in my development environment. To finish up my tangent, this whole process of trying to vibecode a working app showed me so many gaps in my previous understanding that it's truly hard to swallow sometimes, but I'm just happy to know that there are resources available to learn everything (sometimes the hard part is just picking and sticking...more on that later). So, now that I've tested the database and got everything functioning as intended (with a better design), it was time to deploy. I didn't want to make an account to use Firebase App Hosting, so Gemini figured out a way to deploy using Firebase Hosting and we were live.
Viola we made it! Lineup Legends is a full-stack daily baseball puzzle web application that challenges users to reconstruct MLB starting lineups based on a provided box score, where the player names are in a random order. Users can also create an account to collect coins and commemorate completing challenges. It ends here right? Not quite. Like I said, this was my first time really using an API and hosting a website that I'm going to try to drive traffic to. So, the MLB Stats API makes it clear that "Only individual, non-commercial, non-bulk use of the Materials is permitted", and I respect that. For this reason, I took down the Lineup Legends version that updates via API, and I had Gemini replace it with a version that could be updated manually. In reality, I had been developing the game to work so that the Historical Challenge could be updated manually, while the Current Challenge would exclusively use the API. Gemini was able to re implement this easily after I cloned the workspace that I had previously deployed. In the current deployment, both lineups must be updated manually. Eventually, I would like to create a database using data from Retrosheet, and restore the automatic game generation.
This led to my next learning experience: Git. How do I save this code or send it somewhere else efficiently? Realistically, Firebase Studio has enough AI power to where all you have to do is make a GitHub and link it to get everything to sync. Still, I definitely learned the basics of making and using different branches in git, and I gained experience using GitHub in a meaningful way (even though I detached a head in the process). I feel like this helped open my eyes to how a team can confidently collaborate on the same repository and avoid catastrophic losses. I'm looking forward to further understanding a professional workflow, but for now, I have been able to successfully update the live version of Lineup Legends by creating a new branch, changing the data.ts file, merging the branches and re deploying.
So to finally recap, it sounded simple and fun at first, but I learned what it's like jumping into vibecoding without a well-defined plan. I kept moving the goal post on my own project (hosting, new environment, new features, etc.). I learned a lot, and Lineup Legends was a great way for me to experience what it's like solo developing a modern web application. New tools, new frustrations, and new lessons learned. This project also helped me realize that I want to develop software that is accessible and intuitive. Nobody likes reading how to use something, they want to use the feature they came for and move on. My goal for my next project is to develop an application that people love to use and will get utility value out of. To accomplish this, I will develop a detailed plan for development before starting. Here's the preview: Reading can be Fun.
If you read the whole post...wow...you had some time on your hands, so I'll give you my two cents of the current state and future of AI. You may have noticed we completed our goal of making Lineup Legends, but we never heard a doo-doo-doo-doo. That's because my feelings are still in-between, and they're unlikely to change. Yes, AI has definitely advanced to the point where it can code amazing things, and it drastically increases development speed. However, it's not the best thing ever. AI makes mistakes, and it requires an overseer to generate something meaningful. So really, if you're going to use AI to code, you need to have a solid understanding of what need to be implemented. At the least, the project needs to be well-researched, and ideally, there is an expert available. If you have both and the model can understand you perfectly, your team may be unstoppable, but..
THERE IS NO AGI AND THERE NEVER WILL BE!
While there are excellent models that can be orchestrated to help complete the most insane task you can think of, they still need guidance. The model still need to be configured to the task to really help. Specific agents with the correct tools and context are a necessity, not a nice to have. There are definitely ways to make it seem like AGI exists right now, and that's because humans starting to fully embrace AI augmentation. It's obvious that an individual can now find information and create much faster because of new AI applications, so it's not going anywhere. It will never be who has the best model, but who uses the model best. If it doesn't know exactly what you want, you're just hoping for a lucky output; that's why it's important to have an expert for the project itself and someone who's an expert at communicating with the model.
To keep pushing AI towards the subjective AGI threshold, I think it will be important to continue to optimize how information is stored. This will help models narrow the scope of what they need to use for a response. Think about trying to do research for a paper. Wouldn't it be easier if every possible resource connected to a topic was in one place instead of scattered across the digital and physical world? Something else that I think will also end up advancing AI is consistent individual use. We're somewhat close to this now, but I believe everyone will have their own personal LLM. Specifically, I think there will be some kind of standard model assigned to everyone, and an agent will be tailored to them and focused on perfect intent understanding. It will continually gather context, learn, and adapt to the user. Ideally, there will come a time where there is enough shared understanding to allow precision, unconscious prompting. The goal would be having every person augmented with AI intelligence, and you could theoretically do anything with this knowledge. Will it happen? Honestly, I hope not, but just as the Internet became integrated into everything, and I wouldn't be surprised if AI does the same, taken a step further. I really do think it would just be more beneficially for humanity and AI growth to organize the Internet better. It's the largest collection of human intelligence, but everything isn't linked as intuitively as it's made to seem. But who knows...maybe we get AGI in 2026, maybe you think we're already there, or maybe the government has had it for ten years.
Prologue that became Epilogue. Prequel? I remember when generative AI became a permanent seed in my brain. It was very subtle. I was in my final year of college (Fall 2022 or Spring 2023), and one of my teammates made a surprise visit to our house. I was in my room doing homework at my desk when he walked in to say what's up. Zack said something along the lines of, "Dude...every time I come over you're doing homework. Just use ChatGPT." I asked him to explain. He proceeded to tell me about the magical robot students were using to do their homework instantly. He told me how it worked for some classes, which often happened to already have answers or help online, and how ChatGPT would fail some assignments miserably, making it obvious when a student cheated. Zack said it was common to see responses on discussion boards where even the phrasing in discussion posts made it obvious that someone used AI, but he knew the secret technique. "Just put it through Quillbot two times before submitting." My counterargument was essentially, "Bro...at that point just do the assignment. Either way you have to make sure the answer is right to be worth it." Our conversation drifted. I didn't see ChatGPT that day, but the concept became real. My preconceived notion became "People use this, but it's not worth it. It makes mistakes." Verdict at that time: doo-doo
Fast forward to the end of 2023, and I still had never had a conversation with ChatGPT, but it was definitely becoming a hotter topic. Looking for work after a professional baseball season, I found an application for DataAnnotation.Tech. This website offers freelance work training AI models. If you're at all interested it's worth checking out! This is when I started chatting with AI models on a daily basis, and I was able to see that these models can actually produce expert level responses in seconds. On the other had, they could make simple mistakes or completely hallucinate. I still avoided AI outside of work, as I didn't have many personal uses for it at the time. I remember thinking, "If a model could produce excellent code, I'd use it." Verdict at the time: in-between
The first LLM I remember interacting with regularly was Grok when they put it on X. Honestly, I've never been someone who's on Twitter or X regularly. A running joke with a teammate that I lived with was how long it would take me to see a dm on Twitter. Tom would say, "I know Medoro's bored when I get a response to a 4 month old tweet." However, Grok was right there to interact with. I didn't have to make an account to use it, and I had seen some crazy responses where Grok coded particle simulations and games, so I decided it would be worth it to interact. Grok definitely helped me get a grasp of some math concepts that I just never fully wrapped my head around in college (shout out Group Theory) and refresh on topics I hadn't thought about for a while (I remember a conversation about unit vectors that was particularly helpful). Around that time, my stance evolved to, "Dang, this would have been a great tool to help me learn in college." Still, I was never able to get Grok to create a working app, and when I tried to implement very specific prompts, it would take forever to respond and usually violated a key aspect of my prompt, making the response a useless waste of time. Verdict at the time: still in-between
Eventually, I switched to using whatever the free version of ChatGPT was, assuming it would offer a more consistent experience. For me, ChatGPT was helpful for brainstorming. There were times where I founded myself asking ChatGPT things that I would normally just Google. I appreciated the depth and details of responses, which usually made me think of more questions to ask. There was also a few days where I spent a fair amount of free time trying to write a science fiction movie script with Chat's help. This was after I saw an Instagram post saying that a director claimed ChatGPT could do it. It looks like that was early 2025, and the director was Paul Schrader. Looking back at the conversation now, I actually started trying to implement this AI use case after clicking an example prompt: "Please create a Renaissance-style painting of a Mars rover. Use techniques like chiaroscuro and a warm color palette." I thought the picture was flat out cool, and I experimented with the image, having Chat "Make it gloomy", "Incorporate water in a way that could make sense", and "Make it creepy" in subsequent prompts. Chat asked me if I wanted to "push the eerie factor even further". I said yes, and that resulted in my favorite picture, which had a creepy little alien lurking by the Mars rover in an ominous setting. There was one problem, 2 unwanted candles that were added in the foreground. Easy fix for a human, but in multiple prompts, Chat seemed to want to try anything except provide an image without candles. I ended up sending the image I liked best with the prompt "Write a movie plot with this image as the film poster?" I followed up with more precise prompts to flesh out the prompt and had Chat add, remove, and revise many elements of the original story. We were collaborating well, but the responses would sometimes change parts of the story (even main character names) that I wanted to keep. In short, free ChatGPT helped me get information and come up with ideas, but it couldn't fully execute to create something that met my expectations. Verdict at the time: still in-between
Project Talk: MLB Game Frequency Visualization
Read about my experience using historical MLB regular season data from
Retrosheet to create a useful data visualization dashboard with Python.
TL;DR: You can use this
dashboard by following the steps I provide. There are limitations in using this data,
but future improvements can correct them...
How to Get MLB Game Frequency Analyzer: 1. Create a new, empty folder. 2. Download the Python file. 3. Save the file as "main.py" in the folder you created. 4. In the same folder, create a new folder called "schedules". 5. Download the zip file with all the data. 6. Place the zip file in the schedules folder and unzip it. 7. Ensure that you have the "pandas" and "plotly" libraries installed. 8. Run the main.py file. This will create an HTML dashbaord in the same folder as main.py. Open the file and explore!
What days have a regular season MLB game never been played on? That was the motivating question for this analysis. Well, thanks to this simple dashboard, I can report that according to data from Retrosheet, the earliest in the year that an MLB regular season game has been is March 18th. That's not too surprising, as it occurred last year (2025), when the Dodgers and Cubs opened up the season in Japan. More interestingly, we can easily see that an MLB game has been played on every day from March 18th to October 19th, except March 24th. It's also immediately obvious that the most MLB games have been played on July 4th, with a whopping 1,990 MLB games played on the 4th of July since 1877. The only day relatively close to that amount of games is May 30th, with 1,903 games.
Users have the option to select up to 10 years of individual data to display in the chart. Using this feature shows us that in the past 5 MLB seasons (2021-2025), there are 2 days that are tied for most games played, and neither of them are July 4th. In that range, May 14th and July 2nd are tied with 79 games. The 4th of July just missed the top 5 with 75 total games played on that day since 2021. Instead of selecting individual years, there are also preset year ranges to explore and compare when games were played across eras. Another feature that's in development is individual team data. Currently, you can get a chart for any individual team's 2025 season. One use case for this feature in the current state would be an easy visual comparison of teams' off days and double header days from 2025. Unfortunately, some franchises have had the audacity to change locations over the past century, some even multiple times! This means that some teams have a different 2025 identifier in the input files from other years. For example, the Miami Marlins ("MIA" 2025 identifier) were originally called the Florida Marlins ("FLO" identifier). The Marlins were easy to correct, but most teams who have different identifiers across files still need to be addressed.
Still, this dashboard can help answer some simple questions that normally require research or combing through data. The x-axis is labeled 1-365, where each point corresponds to a day in a standard year (no MLB regular season game has ever occurred on February 29).The y-axis is a count for the number of games that have occurred on a given day, according to the data. 150 CSV files of MLB regular season data (1877-2025) from Retrosheet are used to analyze the frequency of MLB regular season games. The games in each file are organized chronologically by "Date" in yyyymmdd format. Each game has a "Postponed" field that indicates if the game was not played as scheduled. This field also indicates if "No makeup game" was played, meaning that the game was never actually played. For games that were postponed and made up on another day, the "Makeup" field indicates what day the game was played, meaning the game goes into the count for the makeup date instead of the "Date" field date.
First, column aliases are defined for only the necessary columns. Then, the script looks for all files in the schedules folder that end with .csv, except 2020sched-orig.csv. This is because the zip file from Retrosheet includes the original 2020 schedule and the pandemic shortened scheduled that was actually played. Next, the script ensures that each file has the required columns and removes any rows that are missing a date. It also extracts the 30 MLB team identifiers from the 2025 file which makes it possible to sort by team. Then, rows that contain a makeup date have their date column updated to the makeup date. Rows that indicate there was no makeup game played are also removed.
The current project code definitely suffers from AI overkill. There is also more HTML, CSS, and JS in the file than Python, and there is definitely code that is unnecessary and inefficient. This became the case after I felt the need to incorporate a user interface. Originally, the goal was just to get all of the data from the CSVs assigned to the correct days to answer a few quick questions, but that didn't take very long. As I started adding features and getting errors, the AI started trying to address aspects of the code that weren't causing problems, adding unnecessary complexity. This will be a good project to remake from scratch and optimize as I continue to get comfortable in Python. It's also worth noting that if a team played more than 162 games in a regular season (which has happened more often than you'd think), none of those game are included in the Retrosheet data, so this limits overall accuracy to the input data. However, it would be possible to add files that include any missing data (e.g. all games past game 162 in a season, postseason games, spring training games) to improve the accuracy or relevance of the output.