82 lines
2.8 KiB
Python
82 lines
2.8 KiB
Python
import pandas as pd
|
|
from sklearn.metrics import mean_squared_error
|
|
from xgboost import XGBRegressor
|
|
|
|
# -----------------------------------------------------------------------------------------------------------------------------
|
|
# Input:
|
|
# DataFrame df mit Columns f_umsatz_fakt, firmen, art, v_warengrp
|
|
# kunde (muss enthalten sein in df['firmen']['firma_refid'])
|
|
|
|
# Output:
|
|
# Integer umsetzung (Prognose möglich): 0 ja, 1 nein (zu wenig Daten verfügbar), 2 nein (Daten nicht für Prognose geeignet)
|
|
# DataFrame test: Jahr, Monat, Vorhersage
|
|
# -----------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
# Prognose Umsatz je Firma
|
|
|
|
|
|
def prognose(df, kunde):
|
|
daten = {'Auftrag': [], 'Datum': [], 'Umsatz': []}
|
|
df_firma = df['f_umsatz_fakt'][
|
|
(df['f_umsatz_fakt']['firma_refid'] == kunde)
|
|
& (df['f_umsatz_fakt']['beleg_typ'] == 1)
|
|
& (df['f_umsatz_fakt']['betrag'] > 0)
|
|
]
|
|
for auftrag in df_firma['vorgang_refid'].unique():
|
|
daten['Auftrag'].append(auftrag)
|
|
daten['Datum'].append(
|
|
df_firma[df_firma['vorgang_refid'] == auftrag]['buchungs_datum'].iloc[0]
|
|
)
|
|
daten['Umsatz'].append(df_firma[df_firma['vorgang_refid'] == auftrag]['betrag'].sum())
|
|
|
|
daten = pd.DataFrame(daten)
|
|
daten = daten.sort_values(by='Datum')
|
|
daten = daten.reset_index()
|
|
|
|
# Datenverfügbarkeit prüfen
|
|
if len(daten) >= 100:
|
|
# Entwicklung der Umsätze: definierte Zeiträume Monat
|
|
daten['Jahr'] = daten['Datum'].dt.year
|
|
daten['Monat'] = daten['Datum'].dt.month
|
|
|
|
monthly_sum = daten.groupby(['Jahr', 'Monat'])['Umsatz'].sum().reset_index()
|
|
monthly_sum['Datum'] = (
|
|
monthly_sum['Monat'].astype(str) + '.' + monthly_sum['Jahr'].astype(str)
|
|
)
|
|
monthly_sum['Datum'] = pd.to_datetime(monthly_sum['Datum'], format='%m.%Y')
|
|
monthly_sum = monthly_sum.set_index('Datum')
|
|
|
|
train = monthly_sum.iloc[:-5].copy()
|
|
test = monthly_sum.iloc[-5:].copy()
|
|
|
|
features = ['Jahr', 'Monat']
|
|
target = 'Umsatz'
|
|
|
|
X_train, y_train = train[features], train[target]
|
|
X_test, y_test = test[features], test[target]
|
|
|
|
reg = XGBRegressor(
|
|
base_score=0.5,
|
|
booster='gbtree',
|
|
n_estimators=1000,
|
|
early_stopping_rounds=50,
|
|
objective='reg:squarederror',
|
|
max_depth=3,
|
|
learning_rate=0.01,
|
|
)
|
|
reg.fit(
|
|
X_train, y_train, eval_set=[(X_train, y_train), (X_test, y_test)], verbose=100
|
|
)
|
|
|
|
test.loc[:, 'Vorhersage'] = reg.predict(X_test)
|
|
test = test.reset_index(drop=True)
|
|
|
|
# umsetzung, prognose
|
|
return 0, test
|
|
|
|
# zu wenig Daten verfügbar
|
|
else:
|
|
# umsetzung, prognose
|
|
return 1, None
|