גירוד וניתוח נתוני חלקי חילוף - Tesla Model S
נבנה מערכת Python שמושכת נתוני חלקי חילוף לטסלה Model S מהאינטרנט,
מנתחת מחירים, זמינות ומגמות שוק - כמו Data Scientist אמיתי!
כדי לגשת לנתונים בצורה מקצועית, נשתמש ב-API. בצעו את השלבים הבאים:
חשוב! שמרו את המפתח במקום בטוח. אל תשתפו אותו ואל תעלו אותו ל-GitHub!
לאחר ההרשמה, צרו קובץ בשם .env בתיקיית הפרויקט:
# קובץ .env - אל תעלו ל-GitHub! RAPIDAPI_KEY="המפתח_שלכם_כאן"
התקינו את הספריות הנדרשות בטרמינל:
# התקנת ספריות
pip install requests pandas python-dotenv beautifulsoup4 matplotlib
צרו תיקיית פרויקט חדשה:
# יצירת מבנה תיקיות
mkdir tesla_parts_analysis
cd tesla_parts_analysis
mkdir data output
צרו קובץ scrape_tesla_parts.py והעתיקו את הקוד:
# scrape_tesla_parts.py - גירוד חלקי חילוף לטסלה import requests import pandas as pd from dotenv import load_dotenv import os import json from datetime import datetime # טעינת משתני סביבה load_dotenv() API_KEY = os.getenv('RAPIDAPI_KEY') def get_tesla_parts(part_type="brake"): """ שליפת חלקי חילוף לטסלה Model S part_type: brake, battery, motor, suspension, body """ # דוגמה עם API של RapidAPI url = "https://car-parts-api.p.rapidapi.com/parts" headers = { "X-RapidAPI-Key": API_KEY, "X-RapidAPI-Host": "car-parts-api.p.rapidapi.com" } params = { "make": "Tesla", "model": "Model S", "year": "2020-2024", "part_type": part_type } try: response = requests.get(url, headers=headers, params=params) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: print(f"שגיאה בשליפת נתונים: {e}") return None def scrape_alternative_source(): """ גירוד מאתר חלופי (לדוגמה בלבד) בפועל נשתמש ב-API או באתרים שמאפשרים גירוד """ # נתוני דוגמה - בשיעור נחליף ב-API אמיתי sample_data = [ {"part": "Front Brake Pads", "price": 450, "vendor": "TeslaParts.com", "stock": 15}, {"part": "Rear Brake Pads", "price": 380, "vendor": "EVSpares", "stock": 23}, {"part": "Battery Module", "price": 5500, "vendor": "TeslaParts.com", "stock": 3}, {"part": "Drive Unit Motor", "price": 8900, "vendor": "EVSpares", "stock": 2}, {"part": "Air Suspension Compressor", "price": 1200, "vendor": "AutoZone", "stock": 8}, {"part": "Touchscreen Display", "price": 1800, "vendor": "TeslaParts.com", "stock": 5}, {"part": "Door Handle Assembly", "price": 320, "vendor": "EVSpares", "stock": 12}, {"part": "Headlight Assembly", "price": 950, "vendor": "AutoZone", "stock": 6}, ] return sample_data def save_to_csv(data, filename): """שמירת הנתונים לקובץ CSV""" df = pd.DataFrame(data) df['scraped_date'] = datetime.now().strftime('%Y-%m-%d %H:%M') df.to_csv(f'data/{filename}', index=False, encoding='utf-8-sig') print(f"✅ נשמרו {len(df)} רשומות לקובץ {filename}") return df # הרצה ראשית if __name__ == "__main__": print("🚗 מתחיל גירוד חלקי חילוף לטסלה Model S...") # שליפת נתונים parts_data = scrape_alternative_source() # שמירה לקובץ df = save_to_csv(parts_data, 'tesla_parts.csv') # תצוגה מקדימה print("\n📊 תצוגה מקדימה:") print(df.to_string())
צרו קובץ analyze_parts.py:
# analyze_parts.py - ניתוח נתוני חלקי החילוף import pandas as pd import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams['font.family'] = 'Arial' def load_and_analyze(csv_path): """טעינה וניתוח בסיסי של הנתונים""" df = pd.read_csv(csv_path) print("=" * 50) print("📈 ניתוח נתוני חלקי חילוף - Tesla Model S") print("=" * 50) # סטטיסטיקות בסיסיות print(f"\n🔢 סה\"כ חלקים: {len(df)}") print(f"💰 מחיר ממוצע: ${df['price'].mean():.2f}") print(f"💰 מחיר מינימום: ${df['price'].min()}") print(f"💰 מחיר מקסימום: ${df['price'].max()}") print(f"📦 מלאי ממוצע: {df['stock'].mean():.1f} יחידות") return df def analyze_by_vendor(df): """ניתוח לפי ספק""" print("\n🏪 ניתוח לפי ספק:") vendor_stats = df.groupby('vendor').agg({ 'price': ['mean', 'count'], 'stock': 'sum' }).round(2) print(vendor_stats) return vendor_stats def find_best_deals(df, top_n=3): """מציאת העסקאות הטובות ביותר""" print(f"\n🏆 {top_n} החלקים הזולים ביותר:") cheapest = df.nsmallest(top_n, 'price')[['part', 'price', 'vendor']] print(cheapest.to_string(index=False)) return cheapest def create_visualizations(df): """יצירת גרפים""" fig, axes = plt.subplots(1, 2, figsize=(14, 5)) # גרף 1: מחירים לפי חלק colors = ['#e31937' if x > df['price'].mean() else '#3b82f6' for x in df['price']] axes[0].barh(df['part'], df['price'], color=colors) axes[0].set_xlabel('Price ($)') axes[0].set_title('Tesla Model S Parts - Price Comparison') axes[0].axvline(df['price'].mean(), color='green', linestyle='--', label='Average') axes[0].legend() # גרף 2: התפלגות לפי ספק vendor_counts = df.groupby('vendor')['price'].sum() axes[1].pie(vendor_counts, labels=vendor_counts.index, autopct='%1.1f%%', colors=['#e31937', '#3b82f6', '#10b981']) axes[1].set_title('Market Share by Vendor (Total Value)') plt.tight_layout() plt.savefig('output/tesla_parts_analysis.png', dpi=150, bbox_inches='tight') print("\n📊 גרפים נשמרו ל-output/tesla_parts_analysis.png") # הרצה if __name__ == "__main__": df = load_and_analyze('data/tesla_parts.csv') analyze_by_vendor(df) find_best_deals(df) create_visualizations(df)
| Part | Price ($) | Vendor | Stock |
|---|---|---|---|
| Front Brake Pads | 450 | TeslaParts.com | 15 |
| Battery Module | 5,500 | TeslaParts.com | 3 |
| Drive Unit Motor | 8,900 | EVSpares | 2 |
| Air Suspension | 1,200 | AutoZone | 8 |
בשיעור נרחיב את הקוד, נחבר ל-API אמיתי,
ונבנה דשבורד אינטראקטיבי לניתוח מחירים!