123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- import pandas as pd
- import numpy as np
- base_dir = "/home/robert/projekte/planner/export"
- id_header = ["Ebene" + str(i) for i in range(1, 11)]
- # values2_header = ['VJ', 'AJ', 'FC', 'Plan_ori', 'Plan_Prozent', 'Stk', 'VAK', 'BE_Prozent', 'Plan_VJ', 'Plan_Stk_VJ', 'Plan',
- # 'Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez', 'Periode13']
- values2_header = [
- "Plan",
- "Jan",
- "Feb",
- "Mar",
- "Apr",
- "Mai",
- "Jun",
- "Jul",
- "Aug",
- "Sep",
- "Okt",
- "Nov",
- "Dez",
- "Periode13",
- "Plan_ori",
- "Plan_Prozent",
- "Stk",
- "VAK",
- "BE_Prozent",
- "frei",
- "VJ",
- "VJ_Stk",
- "AJ",
- "AJ_Stk",
- "AJ_Okt",
- "AJ_Okt_Stk",
- "FC",
- "FC_Stk",
- "Plan_VJ",
- "Plan_VJ_Stk",
- ]
- season_header = ["Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"]
- info_header = ["text", "costcenter", "department"]
- header = info_header + id_header + values2_header
- season_export_header = info_header + season_header
- source_header = ["department", "text", "costcenter", "Ebene1", "Plan", "Periode13"]
- export_header = [
- "Betrieb Nr",
- "Zeile mit Bez",
- "Bereich",
- "Vstufe 1",
- "Gesamt",
- "Periode13",
- ] # 'Version', 'Konto', 'Jahr']
- def expand(df, header, values_label):
- for i, key in enumerate(header):
- df[key] = df[values_label].str[i]
- return df
- def apply_season(df):
- df["Saison"] = df["Ebene1"].str.contains("Umsatzerlöse|Materialaufwand|Verkaufsabh. Kosten")
- df["saison_sum"] = df[season_header].sum(axis=1)
- for i, key in enumerate(season_header):
- df["temp"] = np.where(
- (df["Saison"]) & (df[key + "_2"] != 8.3333), df["Plan"] * df[key + "_2"] / 100, df["Plan"] / 12
- )
- df[key] = np.where(df["saison_sum"] == 0, df["temp"], df[key] * df["Minus1"])
- df["Dez"] = df["Plan"] - df[season_header].sum(axis=1) + df["Dez"]
- return df
- def data_cleansing(filename):
- df = pd.read_json(filename)
- df["values2"] = df["values2"].apply(lambda v: list(v.items()))
- df = df.explode("values2")
- df["department"], df["values2"] = zip(*df["values2"])
- df["id"] = df["id"].str.split(";")
- df = expand(df, id_header, "id")
- df = expand(df, values2_header, "values2")
- return df
- def export_plan(filename, version, target_year, amount_value):
- df = data_cleansing(f"{base_dir}/{filename}.json")
- season = df[(df["level"] == 2) & (df["Ebene1"] == "Umsatzerlöse")].copy()
- season["Dez"] = (100 - season[season_header].sum(axis=1) + season["Dez"]).round(4)
- season[season_export_header].to_csv(
- f"{base_dir}/Planner_{target_year}_{version}_Saison.csv", encoding="latin_1", sep=";", decimal=",", index=False
- )
- df["Minus1"] = np.where(df["Ebene1"] != "Umsatzerlöse", -1, 1)
- df["Plan"] = df[amount_value] * df["Minus1"]
- if amount_value == "Plan":
- df["Periode13"] = df["Periode13"] * df["Minus1"]
- else:
- df["Periode13"] = 0
- plan = df[df["planlevel"] == True]
- plan = pd.merge(plan, season, how="left", on=["Ebene2", "department"], suffixes=("", "_2"))
- plan = apply_season(plan)
- plan = plan[source_header + season_header].rename(columns=dict(zip(source_header, export_header)))
- # Reisacher Spezialbedingungen
- plan["Zeile"] = plan["Zeile mit Bez"].str.slice(stop=4)
- plan["Zeile"] = np.where(
- plan["Zeile mit Bez"].isin(["BMW aus Leasingrücklauf BFS", "BMW aus Leasingrücklauf Alphabet"]),
- "3040",
- plan["Zeile"],
- )
- plan["Zeile"] = np.where(
- plan["Zeile mit Bez"].isin(["BMW an Wiederverkäufer BFS", "BMW an Wiederverkäufer Alphabet"]),
- "3120",
- plan["Zeile"],
- )
- desciption = pd.read_csv(
- f"{base_dir}/../data/Planner_Zeilen_Bez.csv", sep=";", encoding="latin-1", dtype={0: str, 1: str}
- )
- plan = pd.merge(plan, desciption, how="left", on=["Zeile"], suffixes=["", "_3"])
- plan["Zeile mit Bez"] = plan["Zeile mit Bez_3"]
- plan.drop(["Zeile mit Bez_3"], axis=1, inplace=True)
- if amount_value == "Stk":
- plan = plan[plan["Vstufe 1"] == "Umsatzerlöse"]
- plan["Vstufe 1"] = "Verk. Stückzahlen"
- plan["Version"] = version
- plan["Konto"] = ""
- plan["Jahr"] = target_year
- plan.to_csv(
- f"{base_dir}/Planner_{target_year}_{version}_{amount_value}.csv",
- encoding="latin_1",
- sep=";",
- decimal=",",
- index=False,
- )
- if __name__ == "__main__":
- # export_plan('V3', '2021', 'Plan')
- # export_plan('V3', '2021', 'Stk')
- filename = "../save/2023_V1_20230214225753"
- export_plan(filename, "V1", "2023", "Plan")
- export_plan(filename, "V1", "2023", "Stk")
|