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