Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Deze handleiding biedt een end-to-end voorbeeld van een Synapse Data Science workflow in Microsoft Fabric. In het scenario wordt een prognosemodel gebouwd dat gebruikmaakt van historische verkoopgegevens om de verkoop van productcategorie in een superstore te voorspellen.
Prognoses zijn een cruciaal activum in de verkoop. Het combineert historische gegevens en voorspellende methoden om inzicht te krijgen in toekomstige trends. Prognose kan eerdere verkopen analyseren om patronen te identificeren. Het kan ook leren van consumentengedrag om voorraad-, productie- en marketingstrategieën te optimaliseren. Deze proactieve aanpak verbetert de aanpassingsbaarheid, reactiesnelheid en algehele bedrijfsprestaties in een dynamische marketplace.
In deze zelfstudie worden de volgende stappen behandeld:
- De gegevens laden
- Verkennende gegevensanalyse gebruiken om de gegevens te begrijpen en te verwerken
- Een machine learning-model trainen met een opensource-softwarepakket
- Experimenten bijhouden met MLflow en de autologgingfunctie van Fabric
- Sla het uiteindelijke machine learning-model op en maak voorspellingen
- De modelprestaties weergeven met Power BI-visualisaties
Voorwaarden
Een Microsoft Fabric-abonnementophalen. Of meld u aan voor een gratis microsoft Fabric-proefversie.
Meld u aan bij Microsoft Fabric-.
Schakel over naar Fabric met behulp van de ervaringsschakelaar aan de linkerkant van de startpagina.
- Maak zo nodig een Microsoft Fabric Lakehouse, zoals beschreven in de Resource Een lakehouse maken in Microsoft Fabric .
Volg mee in een notitieblok
Om een notitieblok bij te houden, hebt u de volgende opties:
- Open en voer het ingebouwde notebook uit in de Synapse Data Science omgeving.
- Uw notebook uploaden van GitHub naar de Synapse Data Science-ervaring
Het ingebouwde notebook openen
Het voorbeeld Sales forecasting notebook begeleidt deze zelfstudie.
Als u het voorbeeldnotitieblok voor deze zelfstudie wilt openen, volgt u de instructies in Uw systeem voorbereiden op zelfstudies voor gegevenswetenschap.
Zorg ervoor dat je een lakehouse aan het notebook koppelt voordat je code gaat uitvoeren.
Het notebook importeren vanuit GitHub
Het AIsample - Superstore Forecast.ipynb notitieboekje hoort bij deze handleiding.
Als u het bijbehorende notitieblok voor deze zelfstudie wilt openen, volgt u de instructies in Uw systeem voorbereiden op zelfstudies voor gegevenswetenschap om het notebook in uw werkruimte te importeren.
Als u liever de code van deze pagina kopieert en plakt, kunt u een nieuw notitieblok maken.
Zorg ervoor dat een lakehouse aan het notebook koppelen voordat u begint met het uitvoeren van code.
Stap 1: de gegevens laden
De gegevensset heeft 9.995 instances van verkopen van verschillende producten. Het bevat ook 21 kenmerken. Het notebook maakt gebruik van een bestand met de naam Superstore.xlsx. Dit bestand heeft deze tabelstructuur:
| Rij-id | Order-ID | Orderdatum | Verzenddatum | Verzendmethode | Klant-id | Klantnaam | Segment | Land | Stad | Staat | Postcode | Regio | Product-ID | Categorie | Sub-Category | Productnaam | Verkoop | Hoeveelheid | Korting | Winst |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 4 | US-2015-108966 | 2015-10-11 | 2015-10-18 | Standard-klasse | SO-20335 | Sean O'Donnell | Consument | Verenigde Staten | Fort Lauderdale | Florida | 33311 | Zuiden | FUR-TA-10000577 | Meubilair | Tabellen | Bretford CR4500-serie slanke rechthoekige tafel | 957,5775 | 5 | 0.45 | -383.0310 |
| 11 | CA-2014-115812 | 2014-06-09 | 2014-06-09 | Standard-klasse | Standard-klasse | Brosina Hoffman | Consument | Verenigde Staten | Los Angeles | Californië | 90032 | Westen | FUR-TA-10001539 | Meubilair | Tabellen | Rechthoekige vergadertabellen van Chromcraft | 1706.184 | 9 | 0.2 | 85.3092 |
| 31 | US-2015-150630 | 2015-09-17 | 2015-09-21 | Standard-klasse | TB-21520 | Tracy Blumstein | Consument | Verenigde Staten | Philadelphia | Pennsylvania | 19140 | Oosten | OFF-EN-10001509 | Kantoorbenodigdheden | Enveloppen | Poly String Tie-sluitingenveloppen | 3,264 | 2 | 0.2 | 1.1016 |
In het volgende codefragment worden specifieke parameters gedefinieerd, zodat u dit notebook kunt gebruiken met verschillende gegevenssets:
IS_CUSTOM_DATA = False # If TRUE, the dataset has to be uploaded manually
IS_SAMPLE = False # If TRUE, use only rows of data for training; otherwise, use all data
SAMPLE_ROWS = 5000 # If IS_SAMPLE is True, use only this number of rows for training
DATA_ROOT = "/lakehouse/default"
DATA_FOLDER = "Files/salesforecast" # Folder with data files
DATA_FILE = "Superstore.xlsx" # Data file name
EXPERIMENT_NAME = "aisample-superstore-forecast" # MLflow experiment name
De gegevensset downloaden en uploaden naar het lakehouse
Met het volgende codefragment wordt een openbaar beschikbare versie van de gegevensset gedownload en wordt die gegevensset vervolgens opgeslagen in een Fabric Lakehouse:
Belangrijk
U moet een lakehouse toevoegen aan de notebook voordat u ermee werkt. Anders krijgt u een foutmelding.
import os, requests
if not IS_CUSTOM_DATA:
# Download data files into the lakehouse if they're not already there
remote_url = "https://synapseaisolutionsa.z13.web.core.windows.net/data/Forecast_Superstore_Sales"
file_list = ["Superstore.xlsx"]
download_path = "/lakehouse/default/Files/salesforecast/raw"
if not os.path.exists("/lakehouse/default"):
raise FileNotFoundError(
"Default lakehouse not found, please add a lakehouse and restart the session."
)
os.makedirs(download_path, exist_ok=True)
for fname in file_list:
if not os.path.exists(f"{download_path}/{fname}"):
r = requests.get(f"{remote_url}/{fname}", timeout=30)
with open(f"{download_path}/{fname}", "wb") as f:
f.write(r.content)
print("Downloaded demo data files into lakehouse.")
Het volgen van MLflow-experimenten instellen
In Microsoft Fabric worden automatisch de invoerparameterwaarden en metrische uitvoergegevens van een machine learning-model vastgelegd terwijl u het traint. Dit breidt de mogelijkheden voor automatische aanmelding van MLflow uit. De informatie wordt vervolgens vastgelegd in de werkruimte, waar u deze kunt openen en visualiseren met de MLflow-API's of het bijbehorende experiment in de werkruimte. Ga naar de resource Autologging in Microsoft Fabric voor meer informatie over automatisch aanmelden.
Als u automatische aanmelding van Microsoft Fabric in een notebooksessie wilt uitschakelen, roept u aan mlflow.autolog() en stelt u disable=Truedeze in, zoals wordt weergegeven in het volgende codefragment:
# Set up MLflow for experiment tracking
import mlflow
mlflow.set_experiment(EXPERIMENT_NAME)
mlflow.autolog(disable=True) # Turn off MLflow autologging
De ruwe gegevens uit het lakehouse lezen
Het volgende codefragment leest onbewerkte gegevens uit de sectie Bestanden van het lakehouse. Er worden ook meer kolommen toegevoegd voor verschillende datumonderdelen. Dezelfde informatie maakt een gepartitioneerde deltatabel. Omdat de onbewerkte gegevens worden opgeslagen als een Excel-bestand, moet u pandas gebruiken om deze te lezen.
import pandas as pd
df = pd.read_excel("/lakehouse/default/Files/salesforecast/raw/Superstore.xlsx")
Stap 2: Experimentele gegevensanalyse uitvoeren
Bibliotheken importeren
Importeer de vereiste bibliotheken voordat u de analyse start:
# Importing required libraries
import warnings
import itertools
import numpy as np
import matplotlib.pyplot as plt
warnings.filterwarnings("ignore")
plt.style.use('fivethirtyeight')
import pandas as pd
import statsmodels.api as sm
import matplotlib
matplotlib.rcParams['axes.labelsize'] = 14
matplotlib.rcParams['xtick.labelsize'] = 12
matplotlib.rcParams['ytick.labelsize'] = 12
matplotlib.rcParams['text.color'] = 'k'
from sklearn.metrics import mean_squared_error,mean_absolute_percentage_error
De onbewerkte gegevens weergeven
Als u de gegevensset zelf beter wilt begrijpen, controleert u handmatig een subset van de gegevens. Gebruik de display functie om het DataFrame af te drukken. De Chart weergaven kunnen eenvoudig subsets van de gegevensset visualiseren:
display(df)
In deze handleiding wordt een notitieblok behandeld dat zich voornamelijk richt op Furniture verkoopprognoses voor specifieke categorieën. Deze aanpak versnelt de berekening en helpt de prestaties van het model weer te geven. In dit notebook worden echter aanpasbare technieken gebruikt. U kunt deze technieken uitbreiden om de verkoop van andere productcategorieën te voorspellen. Het volgende codefragment selecteert Furniture als productcategorie:
# Select "Furniture" as the product category
furniture = df.loc[df['Category'] == 'Furniture']
print(furniture['Order Date'].min(), furniture['Order Date'].max())
De gegevens vooraf verwerken
Bedrijfsscenario's in de praktijk moeten vaak verkoop voorspellen in drie verschillende categorieën:
- Specifieke productcategorie
- Specifieke klantcategorie
- Specifieke combinatie van productcategorie en klantcategorie
Met het volgende codefragment worden overbodige kolommen verwijderd om de gegevens vooraf te verwerken. Sommige kolommen (Row ID, Order IDenCustomer IDCustomer Name ) zijn niet nodig omdat ze niet relevant zijn. We willen de totale verkoop voorspellen in de gehele staat en regio voor een specifieke productcategorie (Furniture). Daarom kunnen we de Statekolommen , Region, en CountryCityPostal Code kolommen verwijderen. Als u de verkoop voor een specifieke locatie of categorie wilt voorspellen, moet u mogelijk de stap voorverwerken dienovereenkomstig aanpassen.
# Data preprocessing
cols = ['Row ID', 'Order ID', 'Ship Date', 'Ship Mode', 'Customer ID', 'Customer Name',
'Segment', 'Country', 'City', 'State', 'Postal Code', 'Region', 'Product ID', 'Category',
'Sub-Category', 'Product Name', 'Quantity', 'Discount', 'Profit']
# Drop unnecessary columns
furniture.drop(cols, axis=1, inplace=True)
furniture = furniture.sort_values('Order Date')
furniture.isnull().sum()
De gegevensset is dagelijks gestructureerd. We moeten de Order Date kolom resamplen, omdat we een model willen ontwikkelen om de verkoop maandelijks te voorspellen.
Eerst de Furniture categorie op Order Dategroeperen. Bereken vervolgens de som van de Sales kolom voor elke groep om de totale verkoop voor elke unieke Order Date waarde te bepalen. Hersample de kolom Sales met behulp van de MS frequentie om de gegevens per maand samen te voegen. Bereken ten slotte de gemiddelde verkoopwaarde voor elke maand. In het volgende codefragment ziet u de volgende stappen:
# Data preparation
furniture = furniture.groupby('Order Date')['Sales'].sum().reset_index()
furniture = furniture.set_index('Order Date')
furniture.index
y = furniture['Sales'].resample('MS').mean()
y = y.reset_index()
y['Order Date'] = pd.to_datetime(y['Order Date'])
y['Order Date'] = [i+pd.DateOffset(months=67) for i in y['Order Date']]
y = y.set_index(['Order Date'])
maximim_date = y.reset_index()['Order Date'].max()
Toon in het volgende codefragment de impact van Order Date op Sales in de categorie Furniture.
# Impact of order date on the sales
y.plot(figsize=(12, 3))
plt.show()
Voordat u een statistische analyse hebt, moet u de statsmodels Python-module importeren. Deze module biedt klassen en functies voor het schatten van veel statistische modellen. Het biedt ook klassen en functies voor het uitvoeren van statistische tests en statistische gegevensverkenning. In het volgende codefragment ziet u deze stap:
import statsmodels.api as sm
Statistische analyse uitvoeren
In een tijdreeks worden deze gegevenselementen bijgehouden op ingestelde intervallen om de variatie van deze elementen in het tijdreekspatroon te bepalen:
Niveau: Het fundamentele onderdeel dat de gemiddelde waarde voor een specifieke periode aangeeft
Trend: Beschrijft of de tijdreeks afneemt, constant blijft of toeneemt in de loop van de tijd
Seasonality: beschrijft het periodieke signaal in de tijdreeks en zoekt naar cyclische gebeurtenissen die van invloed zijn op de toenemende of afnemende tijdreekspatronen
ruis/residuen: verwijst naar de willekeurige fluctuaties en variabiliteit in de tijdreeksgegevens die het model niet kan uitleggen.
Het volgende codefragment toont deze elementen voor uw gegevensset, na de voorverwerking:
# Decompose the time series into its components by using statsmodels
result = sm.tsa.seasonal_decompose(y, model='additive')
# Labels and corresponding data for plotting
components = [('Seasonality', result.seasonal),
('Trend', result.trend),
('Residual', result.resid),
('Observed Data', y)]
# Create subplots in a grid
fig, axes = plt.subplots(nrows=4, ncols=1, figsize=(12, 7))
plt.subplots_adjust(hspace=0.8) # Adjust vertical space
axes = axes.ravel()
# Plot the components
for ax, (label, data) in zip(axes, components):
ax.plot(data, label=label, color='blue' if label != 'Observed Data' else 'purple')
ax.set_xlabel('Time')
ax.set_ylabel(label)
ax.set_xlabel('Time', fontsize=10)
ax.set_ylabel(label, fontsize=10)
ax.legend(fontsize=10)
plt.show()
In de plots worden de seizoensgebondenheid, trends en ruis in de prognosegegevens beschreven. U kunt de onderliggende patronen vastleggen en modellen ontwikkelen die nauwkeurige voorspellingen doen die tolerantie hebben tegen willekeurige fluctuaties.
Stap 3: Het model trainen en volgen
Nu u de gegevens beschikbaar hebt, definieert u het prognosemodel. In dit notebook past u het seizoensgebonden autoregressieve geïntegreerde bewegende gemiddelde met exogene factoren (SARIMAX) voorspellingsmodel toe. SARIMAX combineert onderdelen van autoregressieve (AR) en zwevend gemiddelde (MA), seizoensgebonden differentiëren en externe voorspellingen om nauwkeurige en flexibele voorspellingen te maken voor tijdreeksgegevens.
U gebruikt ook autologging van MLflow en Fabric om de experimenten bij te houden. Laad hier de deltatabel vanuit het lakehouse. U kunt andere deltatabellen gebruiken die het lakehouse als bron beschouwen. Met het volgende codefragment worden de vereiste bibliotheken geïmporteerd:
# Import required libraries for model evaluation
from sklearn.metrics import mean_squared_error, mean_absolute_percentage_error
Hyperparameters afstemmen
SARIMAX houdt rekening met de parameters die betrokken zijn bij de autoregressief geïntegreerd voortschrijdend gemiddelde (ARIMA) modus (p, d, q), en voegt de seizoensgebondenheidsparameters toe (P, D, Q, s). Deze SARIMAX-modelargumenten worden respectievelijk volgorde (p, d, q) en seizoensvolgorde (P, D, Q), sgenoemd. Daarom moeten we eerst zeven parameters afstemmen om het model te trainen.
De orderparameters:
p: De volgorde van het AR-onderdeel, dat het aantal eerdere waarnemingen in de tijdreeks aangeeft dat wordt gebruikt om de huidige waarde te voorspellen.Normaal gesproken moet deze parameter een niet-negatief geheel getal hebben. Algemene waarden bevinden zich in het bereik van
0tot3. Er zijn echter hogere waarden mogelijk, afhankelijk van de specifieke gegevenskenmerken. Een hogerepwaarde geeft een langer geheugen aan van eerdere waarden in het model.d: De differentiërende volgorde, die het aantal keren aangeeft dat de tijdreeks moet worden aangepast om stationariteit te bereiken.Deze parameter moet een niet-negatief geheel getal hebben. Algemene waarden bevinden zich in het bereik van
0tot2. Eendwaarde van0betekent dat de tijdreeks al stationair is. Hogere waarden geven aan dat het aantal differentiërende bewerkingen dat nodig is om het stationair te maken hoger is.q: De volgorde van het MA-onderdeel. Deze parameter vertegenwoordigt het aantal eerdere fouttermen voor witruis dat wordt gebruikt om de huidige waarde te voorspellen.Deze parameter moet een niet-negatief geheel getal hebben. Algemene waarden bevinden zich in het bereik van
0tot3, maar bepaalde tijdreeksen vereisen mogelijk hogere waarden. Een hogereqwaarde geeft een sterkere afhankelijkheid aan van eerdere fouttermen om voorspellingen te doen.
De parameters voor seizoensorders:
-
P: De seizoensgebonden volgorde van het AR-onderdeel, vergelijkbaar met depparameter, maar die betrekking heeft op het seizoensgebonden deel -
D: De seizoensgebonden volgorde van differentiëren, vergelijkbaar met dedparameter, maar die het seizoensgebonden deel bedekt -
Q: De seizoensgebonden volgorde van het MA-onderdeel, vergelijkbaar met deqparameter, maar die betrekking heeft op het seizoensgebonden deel -
s: Het aantal tijdstappen per seizoensgebonden cyclus (bijvoorbeeld 12 voor maandelijkse gegevens met een jaarlijkse seizoensgebondenheid)
# Hyperparameter tuning
p = d = q = range(0, 2)
pdq = list(itertools.product(p, d, q))
seasonal_pdq = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]
print('Examples of parameter combinations for Seasonal ARIMA...')
print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[1]))
print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[2]))
print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[3]))
print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[4]))
SARIMAX heeft andere parameters:
enforce_stationarity: Of het model moet zorgen voor stationariteit in de tijdreeksgegevens, voordat het SARIMAX-model wordt toegepast.Een
enforce_stationaritywaarde vanTrue(de standaardinstelling) geeft aan dat het SARIMAX-model stationariteit moet afdwingen op de tijdreeksgegevens. Voordat het model wordt aangepast, past het SARIMAX-model automatisch differencing toe op de gegevens om deze stationair te maken, zoals dedenDorders worden gespecificeerd. Dit is gebruikelijk omdat veel tijdreeksmodellen, waaronder SARIMAX, ervan uitgaan dat stationaire gegevens.Voor een niet-stationaire tijdreeks (bijvoorbeeld een reeks die trends of seizoensgebondenheid vertoont), is het verstandig om
enforce_stationarityin te stellen opTrueen het SARIMAX-model het differentiëren te laten uitvoeren om stationariteit te bereiken. Voor een stationaire tijdreeks (bijvoorbeeld één zonder trends of seizoensgebondenheid), stelt uenforce_stationarityin opFalseom onnodige differentiëren te voorkomen.enforce_invertibility: Bepaalt of het model tijdens het optimalisatieproces de omkeerbaarheid moet afdwingen bij de geschatte parameters.Een
enforce_invertibilitywaarde vanTrue(de standaardinstelling) geeft aan dat het SARIMAX-model invertibility moet afdwingen voor de geschatte parameters. Invertibelheid zorgt ervoor dat een goed gedefinieerd model en dat de geschatte AR- en MA-coëfficiënten binnen het bereik van stationariteit terechtkomen.Afdwingbaarheid helpt ervoor te zorgen dat het SARIMAX-model voldoet aan de theoretische vereisten voor een stabiel tijdreeksmodel. Het helpt ook problemen met modelraming en stabiliteit te voorkomen.
Een AR(1) model is de standaardwaarde. Dit verwijst naar (1, 0, 0). Het is echter gebruikelijk om verschillende combinaties van de orderparameters en seizoensgebonden orderparameters uit te proberen en de modelprestaties voor een gegevensset te evalueren. De juiste waarden kunnen variëren van de ene tijdreeks naar de andere.
Het bepalen van de optimale waarden omvat vaak een analyse van de functie autocorrectie (ACF) en een gedeeltelijke functie voor autocorrectie (PACF) van de tijdreeksgegevens. Het omvat ook vaak het gebruik van modelselectiecriteria, bijvoorbeeld het Akaike-informatiecriterium (AIC) of het Bayesiaanse informatiecriterium (BIC).
Stem de hyperparameters af, zoals wordt weergegeven in het volgende codefragment:
# Tune the hyperparameters to determine the best model
for param in pdq:
for param_seasonal in seasonal_pdq:
try:
mod = sm.tsa.statespace.SARIMAX(y,
order=param,
seasonal_order=param_seasonal,
enforce_stationarity=False,
enforce_invertibility=False)
results = mod.fit(disp=False)
print('ARIMA{}x{}12 - AIC:{}'.format(param, param_seasonal, results.aic))
except:
continue
Na de evaluatie van de voorgaande resultaten kunt u de waarden voor zowel de orderparameters als de seizoensgebonden orderparameters bepalen. De keuze is order=(0, 1, 1) en seasonal_order=(0, 1, 1, 12), die de laagste AIC bieden (bijvoorbeeld 279,58). Gebruik deze waarden om het model te trainen. In het volgende codefragment ziet u deze stap:
Het model trainen
# Model training
mod = sm.tsa.statespace.SARIMAX(y,
order=(0, 1, 1),
seasonal_order=(0, 1, 1, 12),
enforce_stationarity=False,
enforce_invertibility=False)
results = mod.fit(disp=False)
print(results.summary().tables[1])
Met deze code wordt een tijdreeksprognose voor verkoopgegevens van meubels gevisualiseerd. In de getekende resultaten worden zowel de waargenomen gegevens als de éénstapsprognose weergegeven, met een gearceerd gebied voor het betrouwbaarheidsinterval. De volgende codefragmenten geven de visualisatie weer:
# Plot the forecasting results
pred = results.get_prediction(start=maximim_date, end=maximim_date+pd.DateOffset(months=6), dynamic=False) # Forecast for the next 6 months (months=6)
pred_ci = pred.conf_int() # Extract the confidence intervals for the predictions
ax = y['2019':].plot(label='observed')
pred.predicted_mean.plot(ax=ax, label='One-step ahead forecast', alpha=.7, figsize=(12, 7))
ax.fill_between(pred_ci.index,
pred_ci.iloc[:, 0],
pred_ci.iloc[:, 1], color='k', alpha=.2)
ax.set_xlabel('Date')
ax.set_ylabel('Furniture Sales')
plt.legend()
plt.show()
# Validate the forecasted result
predictions = results.get_prediction(start=maximim_date-pd.DateOffset(months=6-1), dynamic=False)
# Forecast on the unseen future data
predictions_future = results.get_prediction(start=maximim_date+ pd.DateOffset(months=1),end=maximim_date+ pd.DateOffset(months=6),dynamic=False)
Het volgende codefragment gebruikt predictions om de prestaties van het model te beoordelen door het te vergelijken met de werkelijke waarden. De predictions_future waarde geeft toekomstige prognoses aan.
# Log the model and parameters
model_name = f"{EXPERIMENT_NAME}-Sarimax"
with mlflow.start_run(run_name="Sarimax") as run:
mlflow.statsmodels.log_model(results,model_name,registered_model_name=model_name)
mlflow.log_params({"order":(0,1,1),"seasonal_order":(0, 1, 1, 12),'enforce_stationarity':False,'enforce_invertibility':False})
model_uri = f"runs:/{run.info.run_id}/{model_name}"
print("Model saved in run %s" % run.info.run_id)
print(f"Model URI: {model_uri}")
mlflow.end_run()
# Load the saved model
loaded_model = mlflow.statsmodels.load_model(model_uri)
Stap 4: Het model beoordelen en voorspellingen opslaan
Het volgende codefragment integreert de werkelijke waarden met de voorspelde waarden om een Power BI-rapport te maken. Daarnaast worden deze resultaten opgeslagen in een tabel binnen het lakehouse.
# Data preparation for Power BI visualization
Future = pd.DataFrame(predictions_future.predicted_mean).reset_index()
Future.columns = ['Date','Forecasted_Sales']
Future['Actual_Sales'] = np.NAN
Actual = pd.DataFrame(predictions.predicted_mean).reset_index()
Actual.columns = ['Date','Forecasted_Sales']
y_truth = y['2023-02-01':]
Actual['Actual_Sales'] = y_truth.values
final_data = pd.concat([Actual,Future])
# Calculate the mean absolute percentage error (MAPE) between 'Actual_Sales' and 'Forecasted_Sales'
final_data['MAPE'] = mean_absolute_percentage_error(Actual['Actual_Sales'], Actual['Forecasted_Sales']) * 100
final_data['Category'] = "Furniture"
final_data[final_data['Actual_Sales'].isnull()]
input_df = y.reset_index()
input_df.rename(columns = {'Order Date':'Date','Sales':'Actual_Sales'}, inplace=True)
input_df['Category'] = 'Furniture'
input_df['MAPE'] = np.NAN
input_df['Forecasted_Sales'] = np.NAN
# Write back the results into the lakehouse
final_data_2 = pd.concat([input_df,final_data[final_data['Actual_Sales'].isnull()]])
table_name = "Demand_Forecast_New_1"
spark.createDataFrame(final_data_2).write.mode("overwrite").format("delta").save(f"Tables/{table_name}")
print(f"Spark DataFrame saved to delta table: {table_name}")
Stap 5: Visualiseren in Power BI
In het Power BI-rapport wordt een gemiddelde absolute percentagefout (MAPE) van 16,58 weergegeven. De metriek MAPE bepaalt de nauwkeurigheid van een voorspellingsmethode. Het vertegenwoordigt de nauwkeurigheid van de geraamde hoeveelheden, in vergelijking met de werkelijke hoeveelheden.
MAPE is een eenvoudige metrische waarde. Een MAPE van 10% geeft aan dat de gemiddelde afwijking tussen de voorspelde waarden en de werkelijke waarden 10%is, ongeacht of de afwijking positief of negatief was. De normen van wenselijke MAPE-waarden verschillen per bedrijfstak.
De lichtblauwe lijn in deze grafiek vertegenwoordigt de werkelijke verkoopwaarden. De donkerblauwe lijn vertegenwoordigt de voorspelde verkoopwaarden. Vergelijking van de werkelijke en geraamde verkoop blijkt dat het model de verkoop voor de Furniture categorie in de eerste zes maanden van 2023 effectief voorspelt.
Op basis van deze observatie kunnen we vertrouwen hebben in de prognosemogelijkheden van het model voor de totale verkoop in de afgelopen zes maanden van 2023 en uitbreiden tot 2024. Dit vertrouwen kan strategische beslissingen geven over voorraadbeheer, inkoop van grondstoffen en andere zakelijke overwegingen.