86 lines
3.4 KiB
Python
86 lines
3.4 KiB
Python
import pandas as pd
|
|
import joblib
|
|
import os
|
|
|
|
class AssessmentInference:
|
|
def __init__(self, company_id, num_assessments, model_dir='models'):
|
|
self.company_id = company_id
|
|
self.num_assessments = num_assessments
|
|
self.model_dir = model_dir
|
|
self.model = None
|
|
self.latest_data = None
|
|
|
|
def load_model(self):
|
|
# Load the trained model
|
|
model_path = os.path.join(self.model_dir, 'assessment_prediction', self.company_id, f'{self.company_id}_model.pkl')
|
|
self.model = joblib.load(model_path)
|
|
print(f"Model loaded from {model_path}")
|
|
|
|
def load_latest_data(self):
|
|
# Load the latest assessment data
|
|
latest_data_path = os.path.join(self.model_dir, 'assessment_prediction', self.company_id, f'{self.company_id}_latest_data.csv')
|
|
self.latest_data = pd.read_csv(latest_data_path)
|
|
print(f"Latest data loaded from {latest_data_path}")
|
|
|
|
def predict_next_assessment(self, current_data, assessment_type):
|
|
# Update assessment type (weekly, biweekly, quarterly) in the data for prediction
|
|
current_data['assessment_type_weekly'] = 1 if assessment_type == 'weekly' else 0
|
|
current_data['assessment_type_biweekly'] = 1 if assessment_type == 'biweekly' else 0
|
|
current_data['assessment_type_quarterly'] = 1 if assessment_type == 'quarterly' else 0
|
|
|
|
# Exclude target variables (open_items, red_flags) from the feature set
|
|
features = current_data.drop(columns=['open_items', 'red_flags'])
|
|
|
|
# Predict the next open items and red flags
|
|
prediction = self.model.predict(features)
|
|
open_items_pred, red_flags_pred = prediction[0]
|
|
|
|
# Ensure the predictions are integers by rounding
|
|
open_items_pred = int(round(open_items_pred))
|
|
red_flags_pred = int(round(red_flags_pred))
|
|
|
|
return {
|
|
'assessment_type': assessment_type,
|
|
'open_items': open_items_pred,
|
|
'red_flags': red_flags_pred
|
|
}
|
|
|
|
def predict_next_assessments(self):
|
|
predictions = []
|
|
current_data = self.latest_data.copy()
|
|
|
|
# Iteratively forecast the next assessments
|
|
for i in range(self.num_assessments):
|
|
print(f"\nForecasting assessment {i + 1}/{self.num_assessments}")
|
|
|
|
# Predict for weekly, biweekly, and quarterly for the same forecast step
|
|
weekly_prediction = self.predict_next_assessment(current_data, 'weekly')
|
|
biweekly_prediction = self.predict_next_assessment(current_data, 'biweekly')
|
|
quarterly_prediction = self.predict_next_assessment(current_data, 'quarterly')
|
|
|
|
# Append predictions for all types in one forecast step
|
|
predictions.append({
|
|
'forecast_step': i + 1,
|
|
'weekly': weekly_prediction,
|
|
'biweekly': biweekly_prediction,
|
|
'quarterly': quarterly_prediction
|
|
})
|
|
|
|
# Update the current data with the weekly prediction (or any of the predictions) for the next step
|
|
current_data['open_items'] = weekly_prediction['open_items']
|
|
current_data['red_flags'] = weekly_prediction['red_flags']
|
|
|
|
return predictions
|
|
|
|
def run(self):
|
|
self.load_model()
|
|
self.load_latest_data()
|
|
predictions = self.predict_next_assessments()
|
|
return predictions
|
|
|
|
|
|
# Example usage
|
|
#inference = AssessmentInference(company_id='testid', num_assessments=5)
|
|
#predictions = inference.run()
|
|
#print(predictions)
|