Browse Source

GCHR2 Performance verbessert

gc-server3 6 days ago
parent
commit
8609c374a9
8 changed files with 128 additions and 50 deletions
  1. BIN
      dist/gchr2.exe
  2. BIN
      dist/gcstruct_uebersetzung.exe
  3. 9 0
      gchr/gchr.py
  4. 6 1
      gchr/gchr_bookings.py
  5. 71 47
      gchr/gchr_translate.py
  6. 11 1
      gchr2.py
  7. 5 1
      gchr2_local.py
  8. 26 0
      gcstruct/gcstruct.py

BIN
dist/gchr2.exe


BIN
dist/gcstruct_uebersetzung.exe


+ 9 - 0
gchr/gchr.py

@@ -4,6 +4,7 @@ import os
 from datetime import datetime
 from pathlib import Path
 
+# import numpy as np
 import pandas as pd
 
 from gchr.gchr_bookings import GchrBookings
@@ -140,6 +141,14 @@ class GCHR:
         df.to_csv(export_csv, decimal=",", sep=";", encoding="latin-1", index=False)
         df = df[df["IsNumeric"] != False].groupby(ACCOUNT_INFO, as_index=False).aggregate("sum")
 
+        if True:
+            # Nur Konten mit Inhalt exportieren
+            entries_with_content = pd.DataFrame(df["CumulatedYear"] != 0)
+            period_columns = [p for p in df.columns if p.startswith("Period")]
+            for p in period_columns:
+                entries_with_content[p] = df[p] != 0
+            df = df[entries_with_content.any(axis="columns")]
+
         # Infos ergänzen
         df["Decimals"] = 2
         # df.sort_values(by=["Konto_Nr_SKR51"], inplace=True)

+ 6 - 1
gchr/gchr_bookings.py

@@ -80,6 +80,7 @@ class GchrBookings:
         prev_year_closed = True
 
         df_opening_balance = self._df_bookings[(self._df_bookings["Bookkeep Period"] == filter_opening)]
+
         if df_opening_balance.shape[0] == 0:
             df_opening_balance = self._df_bookings[
                 (self._df_bookings["Bookkeep Period"] == filter_prev_opening)
@@ -88,10 +89,14 @@ class GchrBookings:
                     & (self._df_bookings["Bookkeep Period"] < filter_from)
                 )
             ].copy()
+            # df_opening_balance.dropna(subset="Konto_Nr_Händler", inplace=True)
             df_opening_balance["Bookkeep Period"] = filter_opening
             prev_year_closed = False
 
-        df_opening_balance = df_opening_balance[(df_opening_balance["Konto_Nr_Händler"].str.contains(r"-[013]\d\d+-"))]
+        df_opening_balance = df_opening_balance[
+            (~df_opening_balance["Konto_Nr_Händler"].isna())
+            & (df_opening_balance["Konto_Nr_Händler"].str.contains(r"-[013]\d\d+-"))
+        ]
         opening_balance = df_opening_balance["amount"].aggregate("sum").round(2)
         logging.info("Gewinn/Verlustvortrag")
         logging.info(opening_balance)

+ 71 - 47
gchr/gchr_translate.py

@@ -1,4 +1,5 @@
 import logging
+from pathlib import Path
 
 import numpy as np
 import pandas as pd
@@ -22,13 +23,35 @@ TRANSLATE = [
 def load_translation(
     account_translation: str, debug_file: str, export_invalid_filename: str
 ) -> tuple[dict[str, str], dict[str, str], pd.DataFrame, pd.DataFrame]:
+    account_translation_gchr = account_translation[:-4] + "_GCHR.csv"
+
+    if (
+        Path(account_translation_gchr).exists()
+        and Path(account_translation_gchr).stat().st_mtime >= Path(account_translation).stat().st_mtime
+        and False
+    ):
+        df_translate = pd.read_csv(
+            account_translation_gchr,
+            decimal=",",
+            sep=";",
+            encoding="latin-1",
+            converters={i: str for i in range(0, 200)},
+        )
+        makes = get_makes_from_translation(df_translate)
+        sites = get_sites_from_translation(df_translate)
+        df_translate2 = (
+            df_translate.copy().drop(columns=["Konto_Nr_Händler"]).drop_duplicates().set_index("Konto_Nr_SKR51")
+        )
+        return (makes, sites, df_translate, df_translate2)
+
     df_translate_import = pd.read_csv(
         account_translation,
         decimal=",",
         sep=";",
         encoding="latin-1",
         converters={i: str for i in range(0, 200)},
-    ).reset_index()
+        usecols=["Konto_Nr_Händler", "Konto_Nr_SKR51", "Marke", "Standort", "Marke_HBV", "Standort_HBV"],
+    )  # .reset_index()
 
     makes = get_makes_from_translation(df_translate_import)
     sites = get_sites_from_translation(df_translate_import)
@@ -42,7 +65,7 @@ def load_translation(
         .copy()
         .sort_values(by=["Kontoart", "Konto_Nr_SKR51"])
     )
-    df_translate3.to_csv(account_translation[:-4] + "_GCHR.csv", decimal=",", sep=";", encoding="latin-1", index=False)
+    df_translate3.to_csv(account_translation_gchr, decimal=",", sep=";", encoding="latin-1", index=False)
     return (makes, sites, df_translate, df_translate2)
 
 
@@ -102,92 +125,93 @@ def special_translation(
     df["Marke_Standort"] = df["Marke"] + "-" + df["Standort"]
     df["Standort"] = np.where(df["Marke_Standort"].isin(sites.keys()), df["Standort"], "01")
 
-    df_debug = df.drop(columns=["Bilanz"])
-    logging.info(df_debug.groupby(["Kontoart"]).aggregate("sum"))
-    logging.info(df_debug.groupby(["Kontoart", "Konto_1"]).aggregate("sum"))
-    logging.info(df_debug.groupby(["Konto_Nr"]).aggregate("sum"))
-    df_debug.groupby(["Konto_Nr"]).aggregate("sum").to_csv(debug_file, decimal=",", sep=";", encoding="latin-1")
+    if False:
+        df_debug = df.drop(columns=["Bilanz"])
+        logging.info(df_debug.groupby(["Kontoart"]).aggregate("sum"))
+        logging.info(df_debug.groupby(["Kontoart", "Konto_1"]).aggregate("sum"))
+        logging.info(df_debug.groupby(["Konto_Nr"]).aggregate("sum"))
+        df_debug.groupby(["Konto_Nr"]).aggregate("sum").to_csv(debug_file, decimal=",", sep=";", encoding="latin-1")
 
     # Bereinigung GW-Kostenträger
-    df["NW_Verkauf_1"] = (df["Konto_Nr"].str.match(r"^[78]0")) & (df["Kostenstelle"].str.match(r"^[^1]\d"))
-    df["Kostenstelle"] = np.where(df["NW_Verkauf_1"] == True, "11", df["Kostenstelle"])
+    kst_nw_verkauf_1 = (df["Konto_Nr"].str.match(r"^[78]0")) & (df["Kostenstelle"].str.match(r"^[^1]\d"))
+    df["Kostenstelle"] = np.where(kst_nw_verkauf_1 == True, "11", df["Kostenstelle"])
 
-    df["Konto_7010"] = df["Konto_Nr"].str.match(r"^[78]01[01]")
-    df["Kostenstelle"] = np.where(df["Konto_7010"] == True, "14", df["Kostenstelle"])
+    kst_konto_7010 = df["Konto_Nr"].str.match(r"^[78]01[01]")
+    df["Kostenstelle"] = np.where(kst_konto_7010 == True, "14", df["Kostenstelle"])
 
-    df["GW_Verkauf_2"] = (df["Konto_Nr"].str.match(r"^[78]1")) & (df["Kostenstelle"].str.match(r"^[^2]\d"))
-    df["Kostenstelle"] = np.where(df["GW_Verkauf_2"] == True, "21", df["Kostenstelle"])
+    kst_gw_verkauf_2 = (df["Konto_Nr"].str.match(r"^[78]1")) & (df["Kostenstelle"].str.match(r"^[^2]\d"))
+    df["Kostenstelle"] = np.where(kst_gw_verkauf_2 == True, "21", df["Kostenstelle"])
 
-    df["GW_Verkauf_3"] = (df["Konto_Nr"].str.match(r"^[78]3")) & (df["Kostenstelle"].str.match(r"^[^3]\d"))
-    df["Kostenstelle"] = np.where(df["GW_Verkauf_3"] == True, "31", df["Kostenstelle"])
+    kst_gw_verkauf_3 = (df["Konto_Nr"].str.match(r"^[78]3")) & (df["Kostenstelle"].str.match(r"^[^3]\d"))
+    df["Kostenstelle"] = np.where(kst_gw_verkauf_3 == True, "31", df["Kostenstelle"])
 
-    df["GW_Verkauf_4"] = (df["Konto_Nr"].str.match(r"^[78]4")) & (df["Kostenstelle"].str.match(r"^[^4]\d"))
-    df["Kostenstelle"] = np.where(df["GW_Verkauf_4"] == True, "41", df["Kostenstelle"])
+    kst_gw_verkauf_4 = (df["Konto_Nr"].str.match(r"^[78]4")) & (df["Kostenstelle"].str.match(r"^[^4]\d"))
+    df["Kostenstelle"] = np.where(kst_gw_verkauf_4 == True, "41", df["Kostenstelle"])
 
-    df["GW_Verkauf_x420"] = df["Konto_Nr"].str.match(r"^[78]420")
-    df["Kostenstelle"] = np.where(df["GW_Verkauf_x420"] == True, "42", df["Kostenstelle"])
+    kst_gw_verkauf_x420 = df["Konto_Nr"].str.match(r"^[78]420")
+    df["Kostenstelle"] = np.where(kst_gw_verkauf_x420 == True, "42", df["Kostenstelle"])
 
-    df["GW_Verkauf_5"] = (df["Konto_Nr"].str.match(r"^[78]50")) & (df["Kostenstelle"].str.match(r"^[^5]\d"))
-    df["Kostenstelle"] = np.where(df["GW_Verkauf_5"] == True, "51", df["Kostenstelle"])
+    kst_gw_verkauf_5 = (df["Konto_Nr"].str.match(r"^[78]50")) & (df["Kostenstelle"].str.match(r"^[^5]\d"))
+    df["Kostenstelle"] = np.where(kst_gw_verkauf_5 == True, "51", df["Kostenstelle"])
 
-    df["GW_Verkauf_50"] = (df["Konto_Nr"].str.match(r"^[78]")) & (df["Kostenstelle"].str.match(r"^2"))
-    df["Kostenträger"] = np.where(df["GW_Verkauf_50"] == True, "52", df["Kostenträger"])
+    kst_gw_verkauf_50 = (df["Konto_Nr"].str.match(r"^[78]")) & (df["Kostenstelle"].str.match(r"^2"))
+    df["Kostenträger"] = np.where(kst_gw_verkauf_50 == True, "52", df["Kostenträger"])
     df["Kostenträger"] = np.where(
-        (df["GW_Verkauf_50"] == True) & (df["Marke"] == "01"),
+        (kst_gw_verkauf_50 == True) & (df["Marke"] == "01"),
         "50",
         df["Kostenträger"],
     )
 
-    df["NW_Verkauf_00"] = (
+    ktr_nw_verkauf_00 = (
         (df["Konto_Nr"].str.match(r"^[78]2"))
         & (df["Kostenstelle"].str.match(r"^1"))
         & (df["Kostenträger"].str.match(r"^[^01234]"))
     )
-    df["Kostenträger"] = np.where(df["NW_Verkauf_00"] == True, "00", df["Kostenträger"])
+    df["Kostenträger"] = np.where(ktr_nw_verkauf_00 == True, "00", df["Kostenträger"])
 
-    df["GW_Stk_50"] = (df["Konto_Nr"].str.match(r"^9130")) & (df["Kostenstelle"].str.match(r"^2"))
-    df["Kostenträger"] = np.where(df["GW_Stk_50"] == True, "52", df["Kostenträger"])
-    df["Kostenträger"] = np.where((df["GW_Stk_50"] == True) & (df["Marke"] == "01"), "50", df["Kostenträger"])
+    ktr_gw_stk_50 = (df["Konto_Nr"].str.match(r"^9130")) & (df["Kostenstelle"].str.match(r"^2"))
+    df["Kostenträger"] = np.where(ktr_gw_stk_50 == True, "52", df["Kostenträger"])
+    df["Kostenträger"] = np.where((ktr_gw_stk_50 == True) & (df["Marke"] == "01"), "50", df["Kostenträger"])
 
     df["Kostenträger"] = np.where(df["Bilanz"] == True, "00", df["Kostenträger"])
 
-    df["Konto_5er"] = (df["Konto_Nr"].str.match("^5")) | (df["Konto_Nr"].str.match("^9143"))
-    df["Absatzkanal"] = np.where(df["Konto_5er"] == True, "99", df["Absatzkanal"])
+    abs_konto_5 = (df["Konto_Nr"].str.match("^5")) | (df["Konto_Nr"].str.match("^9143"))
+    df["Absatzkanal"] = np.where(abs_konto_5 == True, "99", df["Absatzkanal"])
 
-    df["Konto_5005"] = (df["Konto_Nr"].str.match("^5005")) & (df["Kostenstelle"].str.match(r"^[^12]"))
-    df["Kostenstelle"] = np.where(df["Konto_5005"] == True, "20", df["Kostenstelle"])
-    df["Kostenträger"] = np.where(df["Konto_5005"] == True, "50", df["Kostenträger"])
+    kst_ktr_konto_5005 = (df["Konto_Nr"].str.match("^5005")) & (df["Kostenstelle"].str.match(r"^[^12]"))
+    df["Kostenstelle"] = np.where(kst_ktr_konto_5005 == True, "20", df["Kostenstelle"])
+    df["Kostenträger"] = np.where(kst_ktr_konto_5005 == True, "50", df["Kostenträger"])
 
-    df["Konto_5007"] = (df["Konto_Nr"].str.match("^5007")) & (df["Kostenstelle"].str.match(r"^([^4]|42)"))
-    df["Kostenstelle"] = np.where(df["Konto_5007"] == True, "41", df["Kostenstelle"])
-    df["Kostenträger"] = np.where(df["Konto_5007"] == True, "70", df["Kostenträger"])
+    kst_ktr_konto_5007 = (df["Konto_Nr"].str.match("^5007")) & (df["Kostenstelle"].str.match(r"^([^4]|42)"))
+    df["Kostenstelle"] = np.where(kst_ktr_konto_5007 == True, "41", df["Kostenstelle"])
+    df["Kostenträger"] = np.where(kst_ktr_konto_5007 == True, "70", df["Kostenträger"])
 
-    df["Konto_914er"] = (df["Konto_Nr"].str.match("^914[34]")) & (df["Kostenträger"].str.match(r"^[^7]"))
-    df["Kostenträger"] = np.where(df["Konto_914er"] == True, "70", df["Kostenträger"])
+    ktr_konto_914x = (df["Konto_Nr"].str.match("^914[34]")) & (df["Kostenträger"].str.match(r"^[^7]"))
+    df["Kostenträger"] = np.where(ktr_konto_914x == True, "70", df["Kostenträger"])
 
-    df["Teile_30_60"] = (
+    ktr_teile_30_60 = (
         (df["Konto_Nr"].str.match(r"^[578]"))
         & (df["Kostenstelle"].str.match(r"^[3]"))
         & (df["Kostenträger"].str.match(r"^[^6]"))
     )
-    df["Kostenträger"] = np.where(df["Teile_30_60"] == True, "60", df["Kostenträger"])
+    df["Kostenträger"] = np.where(ktr_teile_30_60 == True, "60", df["Kostenträger"])
 
-    df["Service_40_70"] = (
+    ktr_service_40_70 = (
         (df["Konto_Nr"].str.match(r"^[578]"))
         & (df["Kostenstelle"].str.match(r"^[4]"))
         & (df["Kostenträger"].str.match(r"^[^7]"))
     )
-    df["Kostenträger"] = np.where(df["Service_40_70"] == True, "70", df["Kostenträger"])
+    df["Kostenträger"] = np.where(ktr_service_40_70 == True, "70", df["Kostenträger"])
 
-    df["MW_KTR_70"] = (df["Konto_Nr"].str.match(r"^[78]50")) & (df["Kostenträger"].str.match(r"^70"))
-    df["Kostenträger"] = np.where(df["MW_KTR_70"] == True, "00", df["Kostenträger"])
+    ktr_mw_70 = (df["Konto_Nr"].str.match(r"^[78]50")) & (df["Kostenträger"].str.match(r"^70"))
+    df["Kostenträger"] = np.where(ktr_mw_70 == True, "00", df["Kostenträger"])
 
-    df["MW_KTR_70_VZ"] = (
+    ktr_mw_70_vz = (
         (df["Konto_Nr"].str.match(r"^5"))
         & (df["Kostenstelle"].str.match(r"^5[156]"))
         & (df["Kostenträger"].str.match(r"^70"))
     )
-    df["Kostenträger"] = np.where(df["MW_KTR_70_VZ"] == True, "00", df["Kostenträger"])
+    df["Kostenträger"] = np.where(ktr_mw_70_vz == True, "00", df["Kostenträger"])
 
     # Volkswagen Specials
     kto_1250 = (df["Konto_Nr"].str.match(r"^1250")) & ~(df["Kostenstelle"].str.match(r"^1"))

+ 11 - 1
gchr2.py

@@ -1,7 +1,17 @@
 import os
 
+import typer
+
 from gchr.gchr import GCHR
 
-if __name__ == "__main__":
+app = typer.Typer()
+
+
+@app.command()
+def main():
     gchr = GCHR(os.getcwd())
     gchr.export_all_periods()
+
+
+if __name__ == "__main__":
+    app()

+ 5 - 1
gchr2_local.py

@@ -1,3 +1,4 @@
+import cProfile
 import os
 from pathlib import Path
 
@@ -15,4 +16,7 @@ def gchr_local() -> None:
 
 
 if __name__ == "__main__":
-    gchr_local()
+    cProfile.run(
+        "gchr_local()",
+        "temp/gchr_local.prof",
+    )

+ 26 - 0
gcstruct/gcstruct.py

@@ -115,6 +115,27 @@ def get_structure_exports(s):
     return result
 
 
+def extract_acct_info(df: pd.DataFrame, account_col: str) -> pd.DataFrame:
+    acct_info = [
+        "Marke",
+        "Standort",
+        "Konto_Nr",
+        "Kostenstelle",
+        "Absatzkanal",
+        "Kostenträger",
+    ]
+    has_five_dashes = df[account_col].str.count("-") == 5
+    invalid = "XX-XX-XXXX-XX-XX-XX"
+
+    df[account_col] = np.where(
+        has_five_dashes,
+        df[account_col],
+        invalid,
+    )
+    df[acct_info] = df[account_col].str.split(pat="-", n=6, expand=True)
+    return df
+
+
 class GCStruct:
     config = {
         "path": "c:/projekte/python/gcstruct",
@@ -476,8 +497,13 @@ class GCStruct:
                 encoding="latin-1",
                 converters={i: str for i in range(0, 200)},
             )
+            if "Konto_Nr_Händler" in df_temp.columns:
+                df_temp = extract_acct_info(df_temp, "Konto_Nr_Händler")
+                df_temp.drop(columns=["Konto_Nr_Händler"], inplace=True)
+
             if "Kostenträger_Marke" not in df_temp.columns:
                 df_temp["Kostenträger_Marke"] = df_temp["Marke"]
+
             df2.append(df_temp)
         df_source = pd.concat(df2)