Reputation: 5
I am using xgboost algorithm for sales forecasting with having some input features. My forecasting month are Jan25, Feb25, March25. i want to check how much any two specific columns input value changes if i have fixed target value for jan, feb, march. I am getting output but output is values are same for all 3 months. Below is my code.
target_values = {
'2025-01-01': 12000,
'2025-02-01': 15000,
'2025-03-01': 16000
}
base_data = pd.DataFrame(index=pd.to_datetime(['2025-01-01', '2025-02-01', '2025-03-01']))
base_data['ds'] = base_data.index
base_data['month'] = base_data['ds'].dt.month
base_data['day_of_year'] = base_data['ds'].dt.dayofyear
base_data['sin_month'] = np.sin(2 * np.pi * base_data['month'] / 12)
base_data['cos_month'] = np.cos(2 * np.pi * base_data['month'] / 12)
if test_data.index.duplicated().any():
print("Warning: test_data has duplicate index values. Resetting index.")
test_data = test_data.reset_index(drop=True)
last_row = test_data.iloc[-1].copy()
static_cols = ['a', 'b', 'c', 'd', 'e',
'f', 'g', 'h']
for col in static_cols:
base_data[col] = last_row[col]
base_data['SB'] = last_row['SB']
base_data['Leads'] = last_row['Leads']
def predict_y(inputs, base_row, scaler, model):
row = base_row.copy()
row['SB'] = inputs[0]
row['Leads'] = inputs[1]
X = row[['SB', 'a', 'b', 'sin_month','cos_month','c', 'd', 'e',
'f', 'g', 'h',
'Leads']].values.reshape(1, -1)
X_scaled = scaler.transform(X)
prediction = model.predict(X_scaled)[0]
print(f"Inputs for {base_row.name}: SB={inputs[0]:.2f}, Leads={inputs[1]:.2f}, Predicted y={prediction:.2f}")
return prediction
def objective_function(inputs, target, base_row, scaler, model):
predicted_y = predict_y(inputs, base_row, scaler, model)
print(f"Target for {base_row.name}: {target}, Predicted y: {predicted_y:.2f}, Difference: {(predicted_y - target)**2:.2f}")
return (predicted_y - target) ** 2
results = {}
for date, target in target_values.items():
base_row = base_data.loc[date]
initial_guess = [base_row['SB'], base_row['Leads']]
print(f"\nOptimizing for {date} with target {target}")
print(f"Initial Guess: SB={initial_guess[0]:.2f}, Leads={initial_guess[1]:.2f}")
result = minimize(
objective_function,
initial_guess,
args=(target, base_row, scaler, model13),
method='Powell',
bounds=[(0, None), (0, None)],
options={'disp': True}
)
if result.success:
results[date] = {'SB': result.x[0], 'Leads': result.x[1]}
else:
results[date] = {'Error': 'Optimization failed'}
for date, vals in results.items():
print(f"\nFor {date}:")
if 'Error' in vals:
print(vals['Error'])
else:
print(f"SB = {vals['SB']:.2f}, Leads = {vals['Leads']:.2f}")
print(f"\nFinal optimization details for {date}:")
print(f"Initial Guess: SB={initial_guess[0]:.2f}, Leads={initial_guess[1]:.2f}")
print(f"Success: {result.success}, Final Values: SB={result.x[0]:.2f}, Leads={result.x[1]:.2f}")
Upvotes: -2
Views: 45