├── .env ├── requirements.txt ├── README.md ├── app.py └── resume_analyzer.ipynb /.env: -------------------------------------------------------------------------------- 1 | GOOGLE_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx #Write your API key -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | pdf2image==1.17.0 2 | pdfplumber==0.11.4 3 | pytesseract==0.3.13 4 | python-dotenv==1.0.1 5 | streamlit==1.32.0 6 | google.generativeai 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AI-Powered Resume Analyzer 2 | 3 | **AI-Powered Resume Analyzer**, a cutting-edge application designed to mimic the expertise of an HR professional! This tool leverages the power of **Google Generative AI** to analyze resumes, evaluate job compatibility, and offer actionable insights for career enhancement. 4 | 5 | --- 6 | 7 | ## 📋 **Project Overview** 8 | 9 | The **AI-Powered Resume Analyzer** serves as a virtual HR assistant, providing: 10 | - Detailed resume evaluation, including strengths and weaknesses. 11 | - Suggestions for skill improvement and recommended courses. 12 | - Job-specific resume analysis to measure compatibility and alignment with job descriptions. 13 | 14 | Whether you’re a job seeker or a recruiter, this tool simplifies resume assessment and improvement. 15 | 16 | --- 17 | 18 | ## 🔑 **Features** 19 | 20 | ### 1️⃣ **General Resume Analysis** 21 | - Summarizes the resume in one line. 22 | - Highlights existing skill sets. 23 | - Identifies skill gaps and suggests improvements. 24 | - Recommends popular courses to enhance the resume. 25 | - Provides a thorough evaluation of strengths and weaknesses. 26 | 27 | ### 2️⃣ **Resume Matching with Job Description** 28 | - Analyzes resume compatibility with a specific job description. 29 | - Provides a match score in percentage. 30 | - Highlights missing skills and areas needing improvement. 31 | - Suggests whether the resume is ready for the job or requires further enhancements. 32 | 33 | --- 34 | 35 | ## 🛠️ **Tech Stack** 36 | 37 | | **Component** | **Technology** | 38 | |----------------------|----------------------------------| 39 | | **Frontend** | [Streamlit](https://streamlit.io/) | 40 | | **Backend** | Python | 41 | | **AI Model** | [Google Generative AI (Gemini)](https://developers.generativeai.google/) | 42 | | **PDF Parsing** | `pdfplumber` | 43 | | **OCR Fallback** | `pytesseract` | 44 | | **Environment Config** | `.env` for API key security | 45 | 46 | --- 47 | 48 | ## 📊 **How It Works** 49 | 50 | 1. **Resume Parsing** 51 | - Extracts text from PDF files using `pdfplumber` or OCR as a fallback. 52 | 53 | 2. **AI Analysis** 54 | - Utilizes Google Generative AI to summarize and analyze resume content. 55 | - Matches skills with job descriptions for compatibility scoring. 56 | 57 | 3. **Insightful Feedback** 58 | - Provides actionable suggestions for skill enhancement, including course recommendations. 59 | - Highlights strengths and weaknesses to refine resumes for better opportunities. 60 | 61 | --- 62 | 63 | ![image](https://github.com/user-attachments/assets/418e54ef-82d0-474b-a6bc-9a30d72f27f5) 64 | 65 | ## 🙌 **Contributing** 66 | 67 | Welcome contributions to make this tool better! 68 | 69 | 1. **Fork** the repository. 70 | 2. **Create a new branch** for your feature or bug fix. 71 | 3. **Submit a pull request** with detailed information about your changes. 72 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | import os 2 | import streamlit as st 3 | from dotenv import load_dotenv 4 | from PIL import Image 5 | import google.generativeai as genai 6 | from pdf2image import convert_from_path 7 | import pytesseract 8 | import pdfplumber 9 | 10 | # Load environment variables 11 | load_dotenv() 12 | 13 | # Configure Google Gemini AI 14 | genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) 15 | 16 | # Function to extract text from PDF 17 | def extract_text_from_pdf(pdf_path): 18 | text = "" 19 | try: 20 | # Try direct text extraction 21 | with pdfplumber.open(pdf_path) as pdf: 22 | for page in pdf.pages: 23 | page_text = page.extract_text() 24 | if page_text: 25 | text += page_text 26 | 27 | if text.strip(): 28 | return text.strip() 29 | except Exception as e: 30 | print(f"Direct text extraction failed: {e}") 31 | 32 | # Fallback to OCR for image-based PDFs 33 | print("Falling back to OCR for image-based PDF.") 34 | try: 35 | images = convert_from_path(pdf_path) 36 | for image in images: 37 | page_text = pytesseract.image_to_string(image) 38 | text += page_text + "\n" 39 | except Exception as e: 40 | print(f"OCR failed: {e}") 41 | 42 | return text.strip() 43 | 44 | # Function to get response from Gemini AI 45 | def analyze_resume(resume_text, job_description=None): 46 | if not resume_text: 47 | return {"error": "Resume text is required for analysis."} 48 | 49 | model = genai.GenerativeModel("gemini-1.5-flash") 50 | 51 | base_prompt = f""" 52 | You are an experienced HR with Technical Experience in the field of any one job role from Data Science, Data Analyst, DevOPS, Machine Learning Engineer, Prompt Engineer, AI Engineer, Full Stack Web Development, Big Data Engineering, Marketing Analyst, Human Resource Manager, Software Developer your task is to review the provided resume. 53 | Please share your professional evaluation on whether the candidate's profile aligns with the role.ALso mention Skills he already have and siggest some skills to imorve his resume , alos suggest some course he might take to improve the skills.Highlight the strengths and weaknesses. 54 | 55 | Resume: 56 | {resume_text} 57 | """ 58 | 59 | if job_description: 60 | base_prompt += f""" 61 | Additionally, compare this resume to the following job description: 62 | 63 | Job Description: 64 | {job_description} 65 | 66 | Highlight the strengths and weaknesses of the applicant in relation to the specified job requirements. 67 | """ 68 | 69 | response = model.generate_content(base_prompt) 70 | 71 | analysis = response.text.strip() 72 | return analysis 73 | 74 | 75 | # Streamlit app 76 | 77 | st.set_page_config(page_title="Resume Analyzer", layout="wide") 78 | # Title 79 | st.title("AI Resume Analyzer") 80 | st.write("Analyze your resume and match it with job descriptions using Google Gemini AI.") 81 | 82 | col1 , col2 = st.columns(2) 83 | with col1: 84 | uploaded_file = st.file_uploader("Upload your resume (PDF)", type=["pdf"]) 85 | with col2: 86 | job_description = st.text_area("Enter Job Description:", placeholder="Paste the job description here...") 87 | 88 | if uploaded_file is not None: 89 | st.success("Resume uploaded successfully!") 90 | else: 91 | st.warning("Please upload a resume in PDF format.") 92 | 93 | 94 | st.markdown("
", unsafe_allow_html=True) 95 | if uploaded_file: 96 | # Save uploaded file locally for processing 97 | with open("uploaded_resume.pdf", "wb") as f: 98 | f.write(uploaded_file.getbuffer()) 99 | # Extract text from PDF 100 | resume_text = extract_text_from_pdf("uploaded_resume.pdf") 101 | 102 | if st.button("Analyze Resume"): 103 | with st.spinner("Analyzing resume..."): 104 | try: 105 | # Analyze resume 106 | analysis = analyze_resume(resume_text, job_description) 107 | st.success("Analysis complete!") 108 | st.write(analysis) 109 | except Exception as e: 110 | st.error(f"Analysis failed: {e}") 111 | 112 | #Footer 113 | st.markdown("---") 114 | st.markdown("""

Powered by Streamlit and Google Gemini AI | Developed by Sujoy Dutta

""", unsafe_allow_html=True) 115 | -------------------------------------------------------------------------------- /resume_analyzer.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Get The text from the PDF" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": null, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "%pip install pdfplumber pytesseract pdf2image" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": {}, 23 | "outputs": [], 24 | "source": [ 25 | "import pdfplumber\n", 26 | "import pytesseract\n", 27 | "from pdf2image import convert_from_path" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 2, 33 | "metadata": {}, 34 | "outputs": [], 35 | "source": [ 36 | "def extract_text_from_pdf(pdf_path):\n", 37 | " text = \"\"\n", 38 | " try:\n", 39 | " # Try direct text extraction\n", 40 | " with pdfplumber.open(pdf_path) as pdf:\n", 41 | " for page in pdf.pages:\n", 42 | " page_text = page.extract_text()\n", 43 | " if page_text:\n", 44 | " text += page_text\n", 45 | "\n", 46 | " if text.strip():\n", 47 | " return text.strip()\n", 48 | " except Exception as e:\n", 49 | " print(f\"Direct text extraction failed: {e}\")\n", 50 | "\n", 51 | " # Fallback to OCR for image-based PDFs\n", 52 | " print(\"Falling back to OCR for image-based PDF.\")\n", 53 | " try:\n", 54 | " images = convert_from_path(pdf_path)\n", 55 | " for image in images:\n", 56 | " page_text = pytesseract.image_to_string(image)\n", 57 | " text += page_text + \"\\n\"\n", 58 | " except Exception as e:\n", 59 | " print(f\"OCR failed: {e}\")\n", 60 | "\n", 61 | " return text.strip()" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": 3, 67 | "metadata": {}, 68 | "outputs": [ 69 | { 70 | "name": "stdout", 71 | "output_type": "stream", 72 | "text": [ 73 | "\n", 74 | "Extracted Text from PDF:\n", 75 | "SUJOY DUTTA\n", 76 | "West Bengal, India | P: +xxxxxxxxxx | xxxxxxxxxxxxxx@gmail.com | https://www.linkedin.com/in/dutta-sujoy/\n", 77 | "3rd-year Computer Science student at KIIT with expertise in Machine Learning and Deep Learning, and\n", 78 | "practical experience in developing predictive models and recommendation systems. Focused on leveraging\n", 79 | "technology to address real-world challenges, currently engaged in a Generative AI project for predictive\n", 80 | "maintenance in manufacturing.\n", 81 | "EDUCATION\n", 82 | "KALINGA INSTITUTE OF INDUSTRIAL TECHNOLOGY Bhubaneswar, Odisha\n", 83 | "Bachelor in Computer Science and Engineering Expected July 2026\n", 84 | "Cumulative GPA: 8.48 / 10.0\n", 85 | "Relevant Coursework: Data Structures; Databases; Operating Systems; Algorithms; Object-oriented\n", 86 | "programming;\n", 87 | "PROJECTS\n", 88 | "Movie Recommendation System\n", 89 | "Developed a content-based recommendation system using a similarity matrix to enhance movie\n", 90 | "suggestions based on user preferences.\n", 91 | "Integrated the TMDB API to fetch and display detailed information and posters for over 10,000 movies.\n", 92 | "Implemented efficient similarity calculations to ensure accurate recommendations.\n", 93 | "Technologies Used: Python, Scikit-Learn, Streamlit, TMDB API\n", 94 | "GitHub Repo: https://github.com/dutta-sujoy/Movie-Recommendation-System\n", 95 | "House Price Prediction Model\n", 96 | "Developed a Random Forest model that achieved an accuracy of 85% in predicting house prices.\n", 97 | "Processed and analyzed data from 13,000+ housing records to enhance model performance.\n", 98 | "Designed a Streamlit application that reduced user input time by 50% and provided instant price\n", 99 | "predictions.\n", 100 | "Implemented feature engineering techniques that improved model precision by 15%.\n", 101 | "Technologies Used: Python, Scikit-Learn, Streamlit.\n", 102 | "GitHub Repo: https://github.com/dutta-sujoy/Bengaluru-House-Price-Prediction\n", 103 | "TECHNICAL SKILLS\n", 104 | "Programming Languages: Python, Java, C++\n", 105 | "Machine Learning: Scikit-Learn, TensorFlow, Keras, Supervised and Unsupervised Learning, GANs\n", 106 | "Generative Model\n", 107 | "Data Analysis: Pandas, NumPy, Matplotlib, Seaborn\n", 108 | "Database Management: SQL\n", 109 | "ACTIVITIES\n", 110 | "GeeksforGeeks KIIT Chapter February 2024 - Present\n", 111 | "( Core Developer )\n", 112 | "Collaborate with team members to build projects and develop technical solutions.\n", 113 | "AISoC February 2023 - Present\n", 114 | "( Core Member )\n", 115 | "Assisted in organizing workshops, coding events, and seminars for the student community.\n" 116 | ] 117 | } 118 | ], 119 | "source": [ 120 | "pdf_path = \"Resume.pdf\"\n", 121 | "resume_text = extract_text_from_pdf(pdf_path)\n", 122 | "\n", 123 | "print(\"\\nExtracted Text from PDF:\")\n", 124 | "print(resume_text)" 125 | ] 126 | }, 127 | { 128 | "cell_type": "markdown", 129 | "metadata": {}, 130 | "source": [ 131 | "## Set Google GenerativeAI Api Key" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": null, 137 | "metadata": {}, 138 | "outputs": [], 139 | "source": [ 140 | "%pip install google.generativeai python-dotenv" 141 | ] 142 | }, 143 | { 144 | "cell_type": "code", 145 | "execution_count": 4, 146 | "metadata": {}, 147 | "outputs": [ 148 | { 149 | "name": "stderr", 150 | "output_type": "stream", 151 | "text": [ 152 | "c:\\Users\\KIIT\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", 153 | " from .autonotebook import tqdm as notebook_tqdm\n" 154 | ] 155 | } 156 | ], 157 | "source": [ 158 | "import google.generativeai as genai\n", 159 | "import os\n", 160 | "from dotenv import load_dotenv\n", 161 | "\n", 162 | "load_dotenv()\n", 163 | "genai.configure(api_key=os.getenv(\"GOOGLE_API_KEY\"))\n", 164 | "model = genai.GenerativeModel(\"gemini-1.5-flash\")" 165 | ] 166 | }, 167 | { 168 | "cell_type": "code", 169 | "execution_count": 5, 170 | "metadata": {}, 171 | "outputs": [], 172 | "source": [ 173 | "response = model.generate_content(\"What is the capital of India?\")\n" 174 | ] 175 | }, 176 | { 177 | "cell_type": "code", 178 | "execution_count": 6, 179 | "metadata": {}, 180 | "outputs": [ 181 | { 182 | "name": "stdout", 183 | "output_type": "stream", 184 | "text": [ 185 | "response:\n", 186 | "GenerateContentResponse(\n", 187 | " done=True,\n", 188 | " iterator=None,\n", 189 | " result=protos.GenerateContentResponse({\n", 190 | " \"candidates\": [\n", 191 | " {\n", 192 | " \"content\": {\n", 193 | " \"parts\": [\n", 194 | " {\n", 195 | " \"text\": \"The capital of India is **New Delhi**.\\n\"\n", 196 | " }\n", 197 | " ],\n", 198 | " \"role\": \"model\"\n", 199 | " },\n", 200 | " \"finish_reason\": \"STOP\",\n", 201 | " \"avg_logprobs\": -0.002600635588169098\n", 202 | " }\n", 203 | " ],\n", 204 | " \"usage_metadata\": {\n", 205 | " \"prompt_token_count\": 8,\n", 206 | " \"candidates_token_count\": 10,\n", 207 | " \"total_token_count\": 18\n", 208 | " }\n", 209 | " }),\n", 210 | ")\n" 211 | ] 212 | } 213 | ], 214 | "source": [ 215 | "print(response)" 216 | ] 217 | }, 218 | { 219 | "cell_type": "code", 220 | "execution_count": 7, 221 | "metadata": {}, 222 | "outputs": [ 223 | { 224 | "name": "stdout", 225 | "output_type": "stream", 226 | "text": [ 227 | "The capital of India is **New Delhi**.\n", 228 | "\n" 229 | ] 230 | } 231 | ], 232 | "source": [ 233 | "print(response.text)" 234 | ] 235 | }, 236 | { 237 | "cell_type": "markdown", 238 | "metadata": {}, 239 | "source": [ 240 | "## Resume Analysis" 241 | ] 242 | }, 243 | { 244 | "cell_type": "code", 245 | "execution_count": 9, 246 | "metadata": {}, 247 | "outputs": [], 248 | "source": [ 249 | "def analyze_resume(resume_text, job_description=None):\n", 250 | " if not resume_text:\n", 251 | " return {\"error\": \"Resume text is required for analysis.\"}\n", 252 | " \n", 253 | " model = genai.GenerativeModel(\"gemini-1.5-flash\")\n", 254 | " \n", 255 | " base_prompt = f\"\"\"\n", 256 | " You are an experienced HR with Technical Experience in the field of any one job role from Data Science, Data Analyst, DevOPS, Machine Learning Engineer, Prompt Engineer, AI Engineer, Full Stack Web Development, Big Data Engineering, Marketing Analyst, Human Resource Manager, Software Developer your task is to review the provided resume.\n", 257 | " Please share your professional evaluation on whether the candidate's profile aligns with the role.ALso mention Skills he already have and siggest some skills to imorve his resume , alos suggest some course he might take to improve the skills.Highlight the strengths and weaknesses.\n", 258 | "\n", 259 | " Resume:\n", 260 | " {resume_text}\n", 261 | " \"\"\"\n", 262 | "\n", 263 | " if job_description:\n", 264 | " base_prompt += f\"\"\"\n", 265 | " Additionally, compare this resume to the following job description:\n", 266 | " \n", 267 | " Job Description:\n", 268 | " {job_description}\n", 269 | " \n", 270 | " Highlight the strengths and weaknesses of the applicant in relation to the specified job requirements.\n", 271 | " \"\"\"\n", 272 | "\n", 273 | " response = model.generate_content(base_prompt)\n", 274 | "\n", 275 | " analysis = response.text.strip()\n", 276 | " return analysis" 277 | ] 278 | }, 279 | { 280 | "cell_type": "code", 281 | "execution_count": 10, 282 | "metadata": {}, 283 | "outputs": [ 284 | { 285 | "name": "stdout", 286 | "output_type": "stream", 287 | "text": [ 288 | "## Resume Evaluation for Sujoy Dutta - Machine Learning Engineer Role\n", 289 | "\n", 290 | "**Role Alignment:** Sujoy's resume is reasonably well-suited for entry-level Machine Learning Engineer roles. His projects demonstrate practical application of relevant skills, and his coursework aligns with the academic requirements. However, his resume could significantly benefit from improvements to highlight his achievements more effectively and showcase a deeper understanding of the field.\n", 291 | "\n", 292 | "\n", 293 | "**Strengths:**\n", 294 | "\n", 295 | "* **Relevant Projects:** The Movie Recommendation System and House Price Prediction projects are strong points, showcasing his ability to build functional applications using popular ML libraries. The inclusion of quantifiable results (85% accuracy, 50% reduction in user input time, 15% improvement in precision) is excellent.\n", 296 | "* **Technical Skills:** He possesses a good foundation in programming languages (Python, Java, C++) and crucial ML/Data Analysis libraries (Scikit-learn, TensorFlow, Keras, Pandas, NumPy, Matplotlib, Seaborn, SQL). Mentioning GANs is a plus, suggesting exposure to generative models.\n", 297 | "* **Academic Background:** KIIT is a reputable institution. A GPA of 8.48/10 is strong.\n", 298 | "* **Extracurricular Activities:** Participation in GeeksforGeeks and AISoC demonstrates initiative and teamwork skills, which are valuable in a collaborative environment like software engineering.\n", 299 | "\n", 300 | "\n", 301 | "**Weaknesses:**\n", 302 | "\n", 303 | "* **Lack of Depth:** While the projects are good, the descriptions are somewhat superficial. The resume lacks detail on the challenges faced, the solutions implemented, and the learnings gained. Quantifiable results are good, but qualitative insights are missing. For example, what specific feature engineering techniques were used? What were the limitations of the models? What hyperparameter tuning was performed?\n", 304 | "* **Limited Experience:** As a 3rd-year student, limited professional experience is expected. However, the resume could benefit from highlighting other relevant experiences, even if they are personal projects or contributions to open-source projects.\n", 305 | "* **Resume Structure:** The resume lacks a clear summary statement at the top. This would allow for a concise and impactful introduction of his skills and aspirations.\n", 306 | "* **Generative AI Project:** The Generative AI project for predictive maintenance is mentioned but lacks detail. This is a significant opportunity to showcase advanced skills. This should be expanded upon.\n", 307 | "\n", 308 | "\n", 309 | "**Skills Sujoy Already Has:**\n", 310 | "\n", 311 | "* Python programming (with libraries like Scikit-learn, Pandas, NumPy, Matplotlib, Seaborn)\n", 312 | "* Machine Learning (Supervised and Unsupervised learning, GANs)\n", 313 | "* Deep Learning (TensorFlow, Keras)\n", 314 | "* Data Analysis and Visualization\n", 315 | "* SQL Database Management\n", 316 | "* Web Application Development (Streamlit)\n", 317 | "* Teamwork and Collaboration\n", 318 | "\n", 319 | "\n", 320 | "**Skills to Improve:**\n", 321 | "\n", 322 | "* **Model Deployment and MLOps:** Demonstrating knowledge of deploying models to production environments is crucial.\n", 323 | "* **Cloud Computing (AWS, Azure, GCP):** Familiarity with cloud platforms is highly valuable in the industry.\n", 324 | "* **Version Control (Git):** While he mentions GitHub, emphasizing proficiency in Git workflows (branching, merging, pull requests) is important.\n", 325 | "* **Data Wrangling and Preprocessing:** Highlighting advanced techniques in handling missing data, outliers, and feature scaling would be beneficial.\n", 326 | "* **Communication and Documentation:** Improving the clarity and conciseness of project descriptions, and adding technical documentation to the GitHub repositories.\n", 327 | "* **Specific Machine Learning Algorithms:** Going beyond basic algorithms and showcasing expertise in more advanced techniques (e.g., specific types of neural networks, time series analysis, reinforcement learning) depending on target job descriptions.\n", 328 | "\n", 329 | "\n", 330 | "**Suggested Courses:**\n", 331 | "\n", 332 | "* **Cloud Computing Fundamentals (AWS/Azure/GCP):** Many providers offer introductory courses.\n", 333 | "* **MLOps:** Courses on deploying and managing machine learning models in production.\n", 334 | "* **Advanced Machine Learning Techniques:** Specializations in areas like deep learning, NLP, or time series analysis.\n", 335 | "* **Data Engineering:** Courses covering data pipelines, ETL processes, and big data technologies.\n", 336 | "* **Technical Writing and Communication:** Courses to improve his ability to clearly and concisely communicate technical information.\n", 337 | "\n", 338 | "\n", 339 | "**Overall Recommendation:**\n", 340 | "\n", 341 | "Sujoy has a solid foundation for a Machine Learning Engineer role. By addressing the weaknesses mentioned above – particularly adding more detail to his projects, enhancing his technical skills (MLOps, Cloud Computing), and improving the structure and clarity of his resume – he will significantly increase his chances of landing a job. The suggested courses will help him achieve this. He should focus on projects that demonstrate his skills in these areas and quantify the impact of his contributions.\n" 342 | ] 343 | } 344 | ], 345 | "source": [ 346 | "print(analyze_resume(resume_text))\n" 347 | ] 348 | } 349 | ], 350 | "metadata": { 351 | "kernelspec": { 352 | "display_name": "Python 3", 353 | "language": "python", 354 | "name": "python3" 355 | }, 356 | "language_info": { 357 | "codemirror_mode": { 358 | "name": "ipython", 359 | "version": 3 360 | }, 361 | "file_extension": ".py", 362 | "mimetype": "text/x-python", 363 | "name": "python", 364 | "nbconvert_exporter": "python", 365 | "pygments_lexer": "ipython3", 366 | "version": "3.12.4" 367 | } 368 | }, 369 | "nbformat": 4, 370 | "nbformat_minor": 2 371 | } 372 | --------------------------------------------------------------------------------