RecommendationAPI / sample.py
Vaibhav84's picture
API
d034937
raw
history blame
4.72 kB
import pandas as pd
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
from scipy import sparse
# Load the purchase history data from Excel file and convert Purchase_Date to datetime
purchase_history = pd.read_excel('datasetsample.xlsx', sheet_name='Transaction History',
parse_dates=['Purchase_Date']) # Add this parameter
# Ensure Customer_Id is treated as string
purchase_history['Customer_Id'] = purchase_history['Customer_Id'].astype(str)
# Create a dictionary to store product categories
product_categories = purchase_history[['Product_Id', 'Category']].drop_duplicates().set_index('Product_Id')['Category'].to_dict()
# Count the number of purchases for each user and product combination
purchase_counts = purchase_history.groupby(['Customer_Id', 'Product_Id']).size().unstack(fill_value=0)
# Convert the purchase counts to a sparse matrix
sparse_purchase_counts = sparse.csr_matrix(purchase_counts)
# Compute the cosine similarity matrix between the products
cosine_similarities = cosine_similarity(sparse_purchase_counts.T)
def get_customer_items_and_recommendations(user_id, n=5):
"""
Get both purchased items and recommendations for a user
Parameters:
user_id (str): The customer ID as string
n (int): Number of recommendations to return
Returns:
tuple: (purchased_items_info, recommended_items_info)
"""
# Convert user_id to string if it's not already
user_id = str(user_id)
# Check if user exists in the data
if user_id not in purchase_counts.index:
return [], []
# Get purchased items
purchased_items = list(purchase_counts.columns[purchase_counts.loc[user_id] > 0])
# Get purchased items details
purchased_items_info = []
user_purchases = purchase_history[purchase_history['Customer_Id'] == user_id]
for item in purchased_items:
item_purchases = user_purchases[user_purchases['Product_Id'] == item]
total_amount = item_purchases['Amount (In Dollars)'].sum()
last_purchase = pd.to_datetime(item_purchases['Purchase_Date'].max()) # Ensure datetime
category = product_categories.get(item, 'Unknown')
purchased_items_info.append({
'product_id': item,
'category': category,
'total_amount': total_amount,
'last_purchase': last_purchase
})
# Get the user's index in the matrix
user_idx = purchase_counts.index.get_loc(user_id)
# Get the user's purchase history
user_history = sparse_purchase_counts[user_idx].toarray().flatten()
# Compute similarities and get recommendations
similarities = cosine_similarities.dot(user_history)
purchased_indices = np.where(user_history > 0)[0]
similarities[purchased_indices] = 0
recommended_indices = np.argsort(similarities)[::-1][:n]
recommended_items = list(purchase_counts.columns[recommended_indices])
# Remove any purchased items from recommendations
recommended_items = [item for item in recommended_items if item not in purchased_items]
# Get recommended items details
recommended_items_info = [
{
'product_id': item,
'category': product_categories.get(item, 'Unknown')
}
for item in recommended_items
]
return purchased_items_info, recommended_items_info
def display_customer_profile(user_id, n=5):
"""
Display customer's purchase history and recommendations with categories
Parameters:
user_id (str): The customer ID as string
n (int): Number of recommendations to return
"""
purchased_items_info, recommended_items_info = get_customer_items_and_recommendations(user_id, n)
print(f"\nCustomer Profile for {user_id}")
print("-" * 70)
print("\nPurchase History:")
if purchased_items_info:
print(f"{'Product ID':<15} {'Category':<20} {'Total Amount':>12} {'Last Purchase'}")
print("-" * 70)
for item in purchased_items_info:
print(f"{item['product_id']:<15} {item['category']:<20} ${item['total_amount']:>11.2f} {item['last_purchase'].strftime('%Y-%m-%d')}")
else:
print("No purchase history found")
print("\nRecommended Items:")
if recommended_items_info:
print(f"{'Product ID':<15} {'Category':<20}")
print("-" * 35)
for item in recommended_items_info:
print(f"{item['product_id']:<15} {item['category']:<20}")
else:
print("No recommendations available")
print("-" * 70)
# Example usage:
customer_id = 'CUST2025A' # Replace with your actual customer ID
display_customer_profile(customer_id)