Apriori-Test_Model / model.py
AnishArjun's picture
new files
367219f
Raw History Blame Contribute Delete
3.26 kB
import pandas as pd
from itertools import combinations
from collections import defaultdict
import json
import os
class AprioriModel:
def __init__(self, min_support=0.01):
self.min_support = min_support
self.transactions = []
def load_data(self, folder_path):
"""Load CSV files from a folder and combine them into a single DataFrame."""
combined_df = pd.DataFrame()
for file in os.listdir(folder_path):
if file.endswith('.csv'):
file_path = os.path.join(folder_path, file)
df = pd.read_csv(file_path)
combined_df = pd.concat([combined_df, df], ignore_index=True)
return combined_df
def preprocess_data(self, data):
"""Prepare basket data and transaction sets from raw data."""
basket = data.groupby(['Transaction ID', 'Product'])['Quantity'].sum().unstack().fillna(0)
basket = basket.applymap(lambda x: 1 if x > 0 else 0)
for _, row in basket.iterrows():
self.transactions.append(set(row[row == 1].index))
return basket
def calculate_pair_support(self):
"""Calculate support for all pairs in the transactions."""
pair_count = defaultdict(int)
for transaction in self.transactions:
for pair in combinations(transaction, 2):
pair_count[frozenset(pair)] += 1
return {
pair: count for pair, count in pair_count.items()
if count / len(self.transactions) >= self.min_support
}
def generate_rules(self, frequent_pairs):
"""Generate association rules based on frequent pairs."""
rules = []
for pair, support_count in frequent_pairs.items():
for item in pair:
antecedent = frozenset([item])
consequent = pair - antecedent
antecedent_support = sum(1 for t in self.transactions if antecedent.issubset(t)) / len(self.transactions)
confidence = (support_count / len(self.transactions)) / antecedent_support
consequent_support = sum(1 for t in self.transactions if consequent.issubset(t)) / len(self.transactions)
lift = confidence / consequent_support
rules.append({
"Driver": list(antecedent)[0],
"Attach": list(consequent)[0],
"Support": support_count / len(self.transactions),
"Confidence": confidence,
"Lift": lift
})
return rules
def save_rules(self, rules, output_path):
"""Save generated rules to a CSV file."""
rules_df = pd.DataFrame(rules)
rules_df.to_csv(output_path, index=False)
print("Rules saved successfully to", output_path)
# This function is optional for Hugging Face Inference API (if using API)
def predict(data):
# Example of how to process input for inference
model = AprioriModel(min_support=0.01)
processed_data = model.load_data(data['folder_path'])
model.preprocess_data(processed_data)
frequent_pairs = model.calculate_pair_support()
rules = model.generate_rules(frequent_pairs)
return rules