plan_export.py 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import pandas as pd
  2. import numpy as np
  3. base_dir = '/home/robert/projekte/python/planner/export/'
  4. id_header = ['Ebene' + str(i) for i in range(1, 11)]
  5. values2_header = ['VJ', 'AJ', 'FC', 'Plan_ori', 'Plan_Prozent', 'Stk', 'VAK', 'BE_Prozent', 'Plan_VJ', 'Plan_Stk_VJ', 'Plan',
  6. 'Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez', 'Periode13']
  7. season_header = ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez']
  8. info_header = ['text', 'costcenter', 'department']
  9. header = info_header + id_header + values2_header
  10. season_export_header = info_header + season_header
  11. source_header = ['department', 'text', 'costcenter', 'Ebene1', 'Plan', 'Periode13']
  12. export_header = ['Betrieb Nr', 'Zeile mit Bez', 'Bereich', 'Vstufe 1', 'Gesamt', 'Periode13'] # 'Version', 'Konto', 'Jahr']
  13. def expand(df, header, values_label):
  14. for i, key in enumerate(header):
  15. df[key] = df[values_label].str[i]
  16. return df
  17. def apply_season(df):
  18. df['Saison'] = df['Ebene1'].str.contains('Umsatzerlöse|Materialaufwand|Verkaufsabh. Kosten')
  19. for i, key in enumerate(season_header):
  20. df['temp'] = np.where((df['Saison']) & (df[key + '_2'] != 8.3333), df['Plan'] * df[key + '_2'] / 100, df['Plan'] / 12)
  21. df[key] = np.where(df[key] == 0, df['temp'], df[key] * df['Minus1'])
  22. df['Dez'] = df['Plan'] - df[season_header].sum(axis=1) + df['Dez']
  23. return df
  24. def data_cleansing(filename):
  25. df = pd.read_json(filename)
  26. df['values2'] = df['values2'].apply(lambda v: list(v.items()))
  27. df = df.explode('values2')
  28. df['department'], df['values2'] = zip(*df['values2'])
  29. df['id'] = df['id'].str.split(';')
  30. df = expand(df, id_header, 'id')
  31. df = expand(df, values2_header, 'values2')
  32. return df
  33. def export_plan(version, target_year, amount_value):
  34. df = data_cleansing(f'{base_dir}/{target_year}_{version}.json')
  35. season = df[(df['level'] == 2) & (df['Ebene1'] == 'Umsatzerlöse')].copy()
  36. season['Dez'] = (100 - season[season_header].sum(axis=1) + season['Dez']).round(4)
  37. season[season_export_header].to_csv(f'{base_dir}/Planner_{target_year}_{version}_Saison.csv',
  38. encoding='latin_1', sep=';', decimal=',', index=False)
  39. df['Minus1'] = np.where(df['Ebene1'] != 'Umsatzerlöse', -1, 1)
  40. df['Plan'] = df[amount_value] * df['Minus1']
  41. if amount_value == 'Plan':
  42. df['Periode13'] = df['Periode13'] * df['Minus1']
  43. else:
  44. df['Periode13'] = 0
  45. plan = df[df['accounts'].apply(lambda a: len(a) > 0)]
  46. plan = pd.merge(plan, season, how='left', on=['Ebene2', 'department'], suffixes=('', '_2'))
  47. plan = apply_season(plan)
  48. plan = plan[source_header + season_header].rename(columns=dict(zip(source_header, export_header)))
  49. # Reisacher Spezialbedingungen
  50. plan['Zeile'] = plan['Zeile mit Bez'].str.slice(stop=4)
  51. plan['Zeile'] = np.where(plan['Zeile mit Bez'].isin(['BMW aus Leasingrücklauf BFS', 'BMW aus Leasingrücklauf Alphabet']),
  52. '3040', plan['Zeile'])
  53. plan['Zeile'] = np.where(plan['Zeile mit Bez'].isin(['BMW an Wiederverkäufer BFS', 'BMW an Wiederverkäufer Alphabet']),
  54. '3120', plan['Zeile'])
  55. desciption = pd.read_csv(f'{base_dir}/Planner_Zeilen_Bez.csv', sep=';', encoding='latin-1', dtype={0: str, 1: str})
  56. plan = pd.merge(plan, desciption, how='left', on=['Zeile'], suffixes=['', '_3'])
  57. plan['Zeile mit Bez'] = plan['Zeile mit Bez_3']
  58. plan.drop(['Zeile mit Bez_3'], axis=1, inplace=True)
  59. if amount_value == 'Stk':
  60. plan = plan[plan['Vstufe 1'] == 'Umsatzerlöse']
  61. plan['Vstufe 1'] = 'Verk. Stückzahlen'
  62. plan['Version'] = version
  63. plan['Konto'] = ''
  64. plan['Jahr'] = target_year
  65. plan.to_csv(f'{base_dir}/Planner_{target_year}_{version}_{amount_value}.csv', encoding='latin_1',
  66. sep=';', decimal=',', index=False)
  67. if __name__ == '__main__':
  68. # export_plan('V3', '2021', 'Plan')
  69. # export_plan('V3', '2021', 'Stk')
  70. export_plan('V2', '2022', 'Plan')
  71. export_plan('V2', '2022', 'Stk')