Spaces:
Sleeping
Sleeping
File size: 6,458 Bytes
a97839e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | import sqlite3
import random
from datetime import datetime, timedelta
import os
DB_PATH = os.path.join("data", "ecommerce.db")
FIRST_NAMES = ["Alice", "Bob", "Carol", "David", "Eva", "Frank", "Grace", "Henry",
"Irene", "Jack", "Karen", "Liam", "Mona", "Nate", "Olivia", "Paul",
"Quinn", "Rachel", "Sam", "Tina", "Uma", "Victor", "Wendy", "Xander",
"Yara", "Zoe", "Aaron", "Bella", "Chris", "Diana"]
LAST_NAMES = ["Smith", "Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller",
"Davis", "Wilson", "Taylor", "Anderson", "Thomas", "Jackson", "White",
"Harris", "Martin", "Thompson", "Robinson", "Clark", "Lewis"]
CITIES = ["New York", "Los Angeles", "Chicago", "Houston", "Phoenix", "Philadelphia",
"San Antonio", "San Diego", "Dallas", "San Jose", "Austin", "Jacksonville",
"Mumbai", "Delhi", "Chennai", "Bangalore", "Hyderabad", "Kolkata"]
CATEGORIES = ["Electronics", "Clothing", "Books", "Home & Garden", "Sports",
"Beauty", "Toys", "Food & Grocery", "Automotive", "Music"]
PRODUCTS = [
("Wireless Headphones", "Electronics", 79.99),
("Bluetooth Speaker", "Electronics", 49.99),
("USB-C Hub", "Electronics", 34.99),
("Mechanical Keyboard", "Electronics", 129.99),
("Gaming Mouse", "Electronics", 59.99),
("Webcam HD", "Electronics", 89.99),
("Monitor 24inch", "Electronics", 249.99),
("Phone Stand", "Electronics", 14.99),
("Running Shoes", "Clothing", 89.99),
("Denim Jacket", "Clothing", 64.99),
("Cotton T-Shirt", "Clothing", 19.99),
("Yoga Pants", "Clothing", 44.99),
("Winter Coat", "Clothing", 149.99),
("Baseball Cap", "Clothing", 24.99),
("Python Programming", "Books", 39.99),
("Data Science Handbook", "Books", 49.99),
("Machine Learning Guide", "Books", 54.99),
("Cook Book Deluxe", "Books", 29.99),
("History of AI", "Books", 34.99),
("Garden Hose 50ft", "Home & Garden", 44.99),
("Plant Pots Set", "Home & Garden", 29.99),
("LED Desk Lamp", "Home & Garden", 39.99),
("Yoga Mat", "Sports", 34.99),
("Resistance Bands", "Sports", 19.99),
("Dumbbell Set 20kg", "Sports", 79.99),
("Jump Rope", "Sports", 12.99),
("Face Moisturizer", "Beauty", 24.99),
("Shampoo Pro", "Beauty", 14.99),
("Perfume Set", "Beauty", 59.99),
("Building Blocks", "Toys", 34.99),
]
STATUSES = ["completed", "completed", "completed", "pending", "cancelled"]
def create_tables(conn):
conn.executescript("""
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS products;
DROP TABLE IF EXISTS customers;
CREATE TABLE customers (
customer_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
city TEXT NOT NULL,
signup_date TEXT NOT NULL
);
CREATE TABLE products (
product_id INTEGER PRIMARY KEY,
product_name TEXT NOT NULL,
category TEXT NOT NULL,
price REAL NOT NULL,
stock INTEGER NOT NULL
);
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
quantity INTEGER NOT NULL,
total_amount REAL NOT NULL,
order_date TEXT NOT NULL,
status TEXT NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
""")
print("Tables created.")
def seed_customers(conn, n=100):
used_emails = set()
rows = []
for i in range(1, n + 1):
fn = random.choice(FIRST_NAMES)
ln = random.choice(LAST_NAMES)
base_email = f"{fn.lower()}.{ln.lower()}{i}@example.com"
while base_email in used_emails:
base_email = f"{fn.lower()}.{ln.lower()}{i}_{random.randint(10,99)}@example.com"
used_emails.add(base_email)
city = random.choice(CITIES)
days_ago = random.randint(30, 730)
signup = (datetime.now() - timedelta(days=days_ago)).strftime("%Y-%m-%d")
rows.append((i, fn, ln, base_email, city, signup))
conn.executemany(
"INSERT INTO customers VALUES (?,?,?,?,?,?)", rows
)
print(f"Inserted {n} customers.")
def seed_products(conn):
rows = []
for i, (name, cat, price) in enumerate(PRODUCTS, start=1):
stock = random.randint(0, 200)
rows.append((i, name, cat, price, stock))
conn.executemany(
"INSERT INTO products VALUES (?,?,?,?,?)", rows
)
print(f"Inserted {len(PRODUCTS)} products.")
def seed_orders(conn, n=600):
rows = []
base_date = datetime(2024, 1, 1)
for i in range(1, n + 1):
cust_id = random.randint(1, 100)
prod_id = random.randint(1, len(PRODUCTS))
qty = random.randint(1, 5)
price = PRODUCTS[prod_id - 1][2]
total = round(price * qty, 2)
days_offset = random.randint(0, 364)
order_date = (base_date + timedelta(days=days_offset)).strftime("%Y-%m-%d")
status = random.choice(STATUSES)
rows.append((i, cust_id, prod_id, qty, total, order_date, status))
conn.executemany(
"INSERT INTO orders VALUES (?,?,?,?,?,?,?)", rows
)
print(f"Inserted {n} orders.")
def main():
os.makedirs("data", exist_ok=True)
conn = sqlite3.connect(DB_PATH)
create_tables(conn)
seed_customers(conn)
seed_products(conn)
seed_orders(conn)
conn.commit()
# Quick sanity check
cur = conn.cursor()
print("\n--- Sanity Check ---")
for table in ["customers", "products", "orders"]:
cur.execute(f"SELECT COUNT(*) FROM {table}")
print(f" {table}: {cur.fetchone()[0]} rows")
# Preview a joined query
cur.execute("""
SELECT c.first_name, c.last_name, p.product_name, o.total_amount, o.order_date
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
JOIN products p ON o.product_id = p.product_id
LIMIT 5
""")
print("\n--- Sample joined rows ---")
for row in cur.fetchall():
print(" ", row)
conn.close()
print(f"\nDatabase saved to: {DB_PATH}")
if __name__ == "__main__":
main() |