From a7d187050dafc6fdcaa4a7d2d726f546da19bdca Mon Sep 17 00:00:00 2001 From: chrwm Date: Wed, 26 Apr 2023 16:40:06 +0200 Subject: [PATCH 1/7] Add script to get es_structure from B&W share The script merges the "Processes" table and "input_output" table. `default` parameters are set for the processes from "Process" table. --- scripts/sedos_structure_parser.py | 60 +++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 scripts/sedos_structure_parser.py diff --git a/scripts/sedos_structure_parser.py b/scripts/sedos_structure_parser.py new file mode 100644 index 0000000..7eddcab --- /dev/null +++ b/scripts/sedos_structure_parser.py @@ -0,0 +1,60 @@ +import pandas as pd + + +def parse_es_structure(file_path: str, output_path: str) -> None: + """ + Parses the es_structure in SEDOS project from two different B&W share tables. + + Parameters + ---------- + file_path: str + Path to B&W raw xlsx + output_path: str + Path to output file + + Returns + ------- + None + """ + + # structure_file = settings.STRUCTURES_DIR / f"{default_structure}.csv" + processes = pd.read_excel( + io=file_path, engine="openpyxl", sheet_name="Processes", usecols=["Input", "Process", "Output"] + ) + + input_output = pd.read_excel( + io=file_path, engine="openpyxl", sheet_name="input_output", usecols=["parameter", "process", "input", "output"] + ) + + inputs_outputs_default = pd.DataFrame( + data={ + "parameter": "default", + "process": processes.Process, + "input": processes.Input, + "output": processes.Output, + } + ) + + es_structure = pd.concat([inputs_outputs_default, input_output], axis=0) + + # clean sheet and replace unwanted characters + char_replace_dict = {"[": "", "]": "", "+": ",", " ": "", ".": "_"} + for col in es_structure.columns: + for key, value in char_replace_dict.items(): + es_structure[f"{col}"] = es_structure[f"{col}"].str.replace(key, value, regex=True) + + # sort values + es_structure.sort_values(by=["process", "parameter"], inplace=True) + es_structure.reset_index(inplace=True, drop=True) + + # save to excel + es_structure.to_excel(rf"{output_path}", index=False) + + return None + + +if __name__ == "__main__": + parse_es_structure( + file_path="SEDOS_Prozesse&Parameter.xlsx", + output_path="SEDOS_es_structure.xlsx", + ) From f1b0a244c7330af303d098b5ba05a3f691b3bbeb Mon Sep 17 00:00:00 2001 From: chrwm Date: Wed, 26 Apr 2023 17:30:31 +0200 Subject: [PATCH 2/7] Add test template --- tests/test_data/test_structures/processes.csv | 5 +++++ tests/test_scripts.py | 7 +++++++ 2 files changed, 12 insertions(+) create mode 100644 tests/test_data/test_structures/processes.csv create mode 100644 tests/test_scripts.py diff --git a/tests/test_data/test_structures/processes.csv b/tests/test_data/test_structures/processes.csv new file mode 100644 index 0000000..052168f --- /dev/null +++ b/tests/test_data/test_structures/processes.csv @@ -0,0 +1,5 @@ +Input;Process;Output +[biogas, natgas, SNG_ren, SNG_conv, hydrogen_ren, hydrogen_conv,heating_oil];pow_combustion_gt;[elec_ren, elec_conv+CO2] +biogas;pow_combustion_gt_biogas;elec_ren +natgas;pow_combustion_gt_natgas;elec_conv+CO2 +[SNG_ren, SNG_conv, nat.gas];pow_combustion_gt_SNG;[elec_ren, elec_conv+CO2] diff --git a/tests/test_scripts.py b/tests/test_scripts.py new file mode 100644 index 0000000..2f828e5 --- /dev/null +++ b/tests/test_scripts.py @@ -0,0 +1,7 @@ +from data_adapter.scripts.sedos_structure_parser import parse_es_structure + + +def test_parse_es_structure(): + + parse_es_structure(file_path="data_adapter/tests/test_data/test_structures/processes.csv") + pass From 77c22a80ce2c848479bbd6720da399039dec364e Mon Sep 17 00:00:00 2001 From: chrwm Date: Wed, 26 Apr 2023 18:15:41 +0200 Subject: [PATCH 3/7] Update test --- .../SEDOS_Prozesse&Parameter.xlsx | Bin 0 -> 15110 bytes .../test_structures/SEDOS_es_structure.xlsx | Bin 0 -> 5569 bytes tests/test_data/test_structures/processes.csv | 5 ----- tests/test_scripts.py | 16 +++++++++++++--- 4 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 tests/test_data/test_structures/SEDOS_Prozesse&Parameter.xlsx create mode 100644 tests/test_data/test_structures/SEDOS_es_structure.xlsx delete mode 100644 tests/test_data/test_structures/processes.csv diff --git a/tests/test_data/test_structures/SEDOS_Prozesse&Parameter.xlsx b/tests/test_data/test_structures/SEDOS_Prozesse&Parameter.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..02d9d5ad5aa43aae5677e9d3d2ac93459e77a616 GIT binary patch literal 15110 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 z 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 literal 0 HcmV?d00001 diff --git a/tests/test_data/test_structures/SEDOS_es_structure.xlsx b/tests/test_data/test_structures/SEDOS_es_structure.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f5571e75fe6a938ae6661ae04151d0601b380af7 GIT binary patch literal 5569 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 literal 0 HcmV?d00001 diff --git a/tests/test_data/test_structures/processes.csv b/tests/test_data/test_structures/processes.csv deleted file mode 100644 index 052168f..0000000 --- a/tests/test_data/test_structures/processes.csv +++ /dev/null @@ -1,5 +0,0 @@ -Input;Process;Output -[biogas, natgas, SNG_ren, SNG_conv, hydrogen_ren, hydrogen_conv,heating_oil];pow_combustion_gt;[elec_ren, elec_conv+CO2] -biogas;pow_combustion_gt_biogas;elec_ren -natgas;pow_combustion_gt_natgas;elec_conv+CO2 -[SNG_ren, SNG_conv, nat.gas];pow_combustion_gt_SNG;[elec_ren, elec_conv+CO2] diff --git a/tests/test_scripts.py b/tests/test_scripts.py index 2f828e5..d4286bc 100644 --- a/tests/test_scripts.py +++ b/tests/test_scripts.py @@ -1,7 +1,17 @@ -from data_adapter.scripts.sedos_structure_parser import parse_es_structure +import pandas as pd + +from scripts.sedos_structure_parser import parse_es_structure def test_parse_es_structure(): + expected_output = pd.read_excel(r"test_data\test_structures\SEDOS_es_structure.xlsx") + + print(expected_output.parameter) + parse_es_structure( + file_path=r"test_data\test_structures\SEDOS_Prozesse&Parameter.xlsx", + output_path=r"test_data\test_structures\SEDOS_es_structure_test_output.xlsx", + ) + + func_output = pd.read_excel(r"test_data\test_structures\SEDOS_es_structure_test_output.xlsx") - parse_es_structure(file_path="data_adapter/tests/test_data/test_structures/processes.csv") - pass + assert expected_output == func_output From f52a5767402322d800a6762eebf888ccb7067bfc Mon Sep 17 00:00:00 2001 From: chrwm Date: Fri, 28 Apr 2023 14:11:05 +0200 Subject: [PATCH 4/7] Refactor es_structure to 3 functions --- scripts/sedos_structure_parser.py | 53 +++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/scripts/sedos_structure_parser.py b/scripts/sedos_structure_parser.py index 7eddcab..773765b 100644 --- a/scripts/sedos_structure_parser.py +++ b/scripts/sedos_structure_parser.py @@ -1,23 +1,18 @@ import pandas as pd -def parse_es_structure(file_path: str, output_path: str) -> None: +def read_sedos_bwshare_excel(file_path: str) -> dict: """ - Parses the es_structure in SEDOS project from two different B&W share tables. + Read SEDOS B&W-share excel file. Parameters ---------- - file_path: str - Path to B&W raw xlsx - output_path: str - Path to output file - + file_path + Path to downloaded B&W share file. Returns ------- - None + dict of dataframes """ - - # structure_file = settings.STRUCTURES_DIR / f"{default_structure}.csv" processes = pd.read_excel( io=file_path, engine="openpyxl", sheet_name="Processes", usecols=["Input", "Process", "Output"] ) @@ -26,6 +21,28 @@ def parse_es_structure(file_path: str, output_path: str) -> None: io=file_path, engine="openpyxl", sheet_name="input_output", usecols=["parameter", "process", "input", "output"] ) + return {"processes": processes, "input_output": input_output} + + +def parse_es_structure(sedos_es_dict: dict) -> pd.DataFrame: + """ + Parse the es_structure in SEDOS project from two different B&W share tables. + + Parameters + ---------- + sedos_es_dict: dict + Dict with dataframe of "processes" and "input_output" sheet + + Returns + ------- + es_structure: pd.Dataframe + Structure of energy system with default and parameter-specific inputs & outputs per process + """ + + # structure_file = settings.STRUCTURES_DIR / f"{default_structure}.csv" + processes = sedos_es_dict["processes"] + input_output = sedos_es_dict["input_output"] + inputs_outputs_default = pd.DataFrame( data={ "parameter": "default", @@ -47,14 +64,18 @@ def parse_es_structure(file_path: str, output_path: str) -> None: es_structure.sort_values(by=["process", "parameter"], inplace=True) es_structure.reset_index(inplace=True, drop=True) + return es_structure + + +def write_es_structure_file(es_structure: pd.DataFrame, output_path: str) -> None: + # save to excel es_structure.to_excel(rf"{output_path}", index=False) - return None - if __name__ == "__main__": - parse_es_structure( - file_path="SEDOS_Prozesse&Parameter.xlsx", - output_path="SEDOS_es_structure.xlsx", - ) + sedos_es_dict = read_sedos_bwshare_excel(file_path="SEDOS_Prozesse&Parameter.xlsx") + + es_structure = parse_es_structure(sedos_es_dict=sedos_es_dict) + + write_es_structure_file(es_structure=es_structure, output_path="SEDOS_es_structure.xlsx") From d9cccb398d4ed85237836a1839d827fb84d7088d Mon Sep 17 00:00:00 2001 From: chrwm Date: Fri, 28 Apr 2023 14:12:32 +0200 Subject: [PATCH 5/7] Clean script --- scripts/sedos_structure_parser.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/scripts/sedos_structure_parser.py b/scripts/sedos_structure_parser.py index 773765b..c3d8834 100644 --- a/scripts/sedos_structure_parser.py +++ b/scripts/sedos_structure_parser.py @@ -39,7 +39,6 @@ def parse_es_structure(sedos_es_dict: dict) -> pd.DataFrame: Structure of energy system with default and parameter-specific inputs & outputs per process """ - # structure_file = settings.STRUCTURES_DIR / f"{default_structure}.csv" processes = sedos_es_dict["processes"] input_output = sedos_es_dict["input_output"] @@ -71,11 +70,3 @@ def write_es_structure_file(es_structure: pd.DataFrame, output_path: str) -> Non # save to excel es_structure.to_excel(rf"{output_path}", index=False) - - -if __name__ == "__main__": - sedos_es_dict = read_sedos_bwshare_excel(file_path="SEDOS_Prozesse&Parameter.xlsx") - - es_structure = parse_es_structure(sedos_es_dict=sedos_es_dict) - - write_es_structure_file(es_structure=es_structure, output_path="SEDOS_es_structure.xlsx") From 6b66c6d81372f9a966235d9cd1dc8d0827e8bd6f Mon Sep 17 00:00:00 2001 From: chrwm Date: Fri, 28 Apr 2023 14:49:25 +0200 Subject: [PATCH 6/7] Update unit test --- .../SEDOS_Prozesse&Parameter.xlsx | Bin 15110 -> 11957 bytes .../test_structures/SEDOS_es_structure.xlsx | Bin 5569 -> 0 bytes tests/test_scripts.py | 47 ++++++++++++++---- 3 files changed, 38 insertions(+), 9 deletions(-) delete mode 100644 tests/test_data/test_structures/SEDOS_es_structure.xlsx diff --git a/tests/test_data/test_structures/SEDOS_Prozesse&Parameter.xlsx b/tests/test_data/test_structures/SEDOS_Prozesse&Parameter.xlsx index 02d9d5ad5aa43aae5677e9d3d2ac93459e77a616..267973ba6f7920e21cfaf3c16eb43d45e2e5ebb6 100644 GIT binary patch delta 4930 zcmZ8lXH*l+whf{8P^C(dE(WP4NRZwG2-2i?2!t+8AoSi7kS3r66r@Q<2vwR?14xrz z1QC%UO@XK1eed17?)fuo&Fo(@`|R0g$ND!~)>@OJNcB}asDJ9^8NO!EEcG~1!P{*wUF45&?*B(6hA)3kW#z#W^w`o?qRb{CQravhc=9;bx z6O?%-hIzrcagxg;A(E19@%k&5?C?JE1a>? zi@XD@p_Eme{C3VoGc!+Hm423IW#wd_hv`&%>*r##xbL{4tGwb{LWn;`uUwb%*^RSD z5ppk|of<<@efM*OozIA~d*{V?q_9uwijUfZf6UtUu?dFUZDK8Fo>BHS88s<-vxyRy zQZor?zGuB(!3LC5q-MTdBj?*gVol8wcjSFV_@zrWj~-hl);V)sR$lPr*KeV-rR%K* z$st>QKjaB<-!6paIMlC3g)=YG$z)QvR8O}JpJ<}iE29=75ua4lVP+_*6Hj;F(GcW4 z<9qt7BLP)F)ApMHO-ILwB2o8f*Z9K}CPn~&`d@7E^$T)$^!>|~5mWQDH5taRnyG8h zIcx(+5J~pNF-PMz@{N{c)&+u|v{Kd^ljAyDag7_$1v<6VbBohP?adZ-`i6L%oM~rC ztVc2OZ<>V{q^3}1s>+qk@hYG?; zR@MWlfygo861%F}^bEBU&!prVfn(u_&0{ZzN4lL}3!GCEO9H|v6jp~Set@YpO{H6P z(8ALtz3w{!D~{fUP*#Mgojt;mYZbfDGm(-x>?FC7ZY% zU#ccikQv-h>Evgn4~4sSu<8nLE7CmniDUK$J2y_?U@qpVpUH5;XWWA{S<3WyQ30j| z!i}Yr!PKu^EyP)gGJB~DN0;4Q8K|fi%a;k%sPgJZd+pyvMvK=uOJ}!@E-_wHn71jK zL3pfFXe8Cozh4e+$+AidThZ`aWv*Lv{x*^WWAr zo=1pl-x3);r8g)#6=FUD#JoVZ`Jh zRo8x7*aQ=P#Ju;*@_49(;0xdB0M$G2}!b?U|hl%TqMU>d2(dTZ5FUPAl0xE4KWMq?J4~UZ)(%&|^4R z`Ml=4#;d812zO57t&3gn6p=Z1uWp1;h@Wx(G|8B6Q+9drL9M+h4cUUm?DSikc1OHT zgcjc?u+L(C1*rM*BI~1Sc4lz50~N8(qI7n9@dJQ{u{<7RWL%NCo(MdD91KG}FBCmv zQ-$4v>2FF-5*o=%!uDHt6hm4po~8xFT=}|C>U8{^l2qKW;f@Fl7FCI8lqX}Q+EW~q zh?BB?qRt+L>qRIXe^Cfl;$oALqK&;~c+(gk?EdpbeDH(&Bu|k>M=Zep2gGB`nx*)x zk;zx|$^A}(-ExCNv_6J0L>L;>+KcX(NV18hOUotuf)1Up#h3g1 zpJ6LArc6=_*B!c~SKp-lMqj`<^Kjq;o#p&7otjgL=c7to9zJ5%uHz8r2M6&bg$3M& z5ZuF|mGW0E(a6D0Tsoen zgr&3vtk-8Cp}N1^A3>KiCNOvN8l9&L)8#4Rh!z=?O!qWR7f#!Ut^t3wrk)){K|nEY zXsieNBRGLHXfe8*sAQ9&)O8sUj&$$=*}JsH*+Y_rDA(br5gvu~F`qKWd4b3DOo<++ z8@sPsG`2oPbp!@gR+!Y7iWuaNd%`(!cApsLJ=Wbb`{_Jx2lMVZvR_}$%;*h6zCsat zugmT%^)GvKp_VQ$hPQO*v{8LI>Yx{U%?DXW9?$tgpY&0GMF}?a-l;4Qb_2zAe#<=O z?A_*jo+mpr=~pNf-|#lE)`=@YaopKpHPg76q}hVlwndHOaK8q-8|MQ5nc+okC)WJk zP&J=Mi9-{97QiZ%nuoaD!yCk=N^ge^JH2MJ8-8GQ7W*jqV)%9mLD@KuZoc8a>m#j-xd-olXp9rU_T&7_<$a*~irJ%ZJ zB)ohTkf6S&7BisM@H@ZtG8lK2vneti9K=zy$<~|Im)$QJ`Zs!T zFQsRDoToq^@9Be&%MN)3!(yzHG&@A=>cK2gTqyr1rJ;clt0c$*-Mfbr{O@AZsj z(=1<&{+yPWyjha=Q*X~Z)!+K?79*41;t>}8(cG5`O28OK#jPBZLTHe1eoXGg=OM6- z0R&2d(s61UQWPX?`>7#7`-UJtoGs!VqAZoo@yJk`fWZXb_1>ri{dP*uy%HC3NIFF} zWwgF=fOQY65U^RRAkS$*_(^2vsoyX~)CB}vcNwIy(5!g}W@ay#rb;DzgJF-;qtxok zISicAoL2>&)%MCYtfvoKvBP|XVHK0vE zgZZ9qKGz7?0C5i;^f}0z&vcqOPR*vDe73wPawOD0gPw+Z)k$JkfnfCLZhbhX6LIbz zuoKv4LgRJs%0o(5=Gxv$ZuFe$hY?j8HgfSKbK~N9pnr}u-)mbq`7o z=pQKMa40mmArAT_7wP7(tw3Kpigp`Z`Iz2q&nu%B$hLVU#m0?RH_MeHu{&z_?MfB= z2Kjk-P{7WmLY*tuA6^&KgBF-Ut6AbU{5XqS+u`Ic`{r594w5l~+SR0yLmP@umn#~$ z^M&O!-{bU;|8oP1@_|8h1Zd}f8J7~z>8xrJoCfHjN%unE;3FB)?~32JImdy|0^WnM zdnIf|tH3N>X4iM7U?*2&QKw-)k+0)Z)UcL*S3z8&yRS4)M9Meti6Yl zJ$6e=a3a!K>--1lJ9CGh$>&u`vQxGvI#+S0d^uzox{>{>{Z{*gw%+&B3Cam=DK=(Q~2rHQ>AD^GV1XOt9buaR8adYn$7oF z6E;H7`~yOCMQ|ag-I2%>V`v%lVt>FYWthY@nwULGv3a468+wOE+BKTQ7TW_nI|`jU zlzeQN9Pvi{scZum<>O|+fvIt6pi%K)c~akur7~++rOlF9H`NVi_n+$&9bif|=px09 z6*>5E@R+aXcLF@3RoIpUC9y|yYk?}1hB+vQXwdwQQS8;7p^Vf1F)^*(IH0zKYcxmh zwYpXjc5wzC8xp>O<&7DMj#@p``Gl>I@Z(Y@zcx|)zOH)nOd@uMcqeU~p!0RbWp4rX z+?q1~r-qA~&+(zL-+2R=)il|nyH<~n@58R(9~P~`!&f}KS0X6faF*`W%P|lB==pFq)N?MUm-&ykLra5&1+{zri~~rkwk_sr6&x zg{`iPqia*&cU%uetf9<-jSk1#;ieJXo^LT>EdZ$&f6SAsDeBy;+NU;kz@2pNQ+i_2 zbV7d)#98~{vn5GJR4K%)vgS_Y3)L_roj>!<+C3rVoD2*yM$Rx>s5tuOW*g;)d0-|U zj__ABGgl~=O&Zi??P(`;OvvOhC9`Zfi>zzX2xcB4c0>~VvW?4_7uFU}X6P@ftK^@4 zCD&P8dFKKXMY*>zj~$2JU1QZy2Ddk(vxR!)NYxUxez+k~5;mbcMHczTX3Lk!i1V-j&}pAL$uJseGk5RM07>d%oImslO*6bTfzpOjUgM*zLlWL8VPELN^3~ zeJHqoR9r^zt+$;%&Aq_fTX+r8(9E}o63)*uP^PcYHLBKcp$5tC@uABf+$z4??|9v^ zHhjXhYh|-3ZFG8oTpTcbQp54hw_x6)$2Z{Z6rGjUE2PB-+d=J4kFPVYnD+?$HdOQ@_}`fq_jl$kQV`DfFe6ZMHExRm(jzjO3MxJv%A%(p4=~8-YG1>2l@$3D zacA~&M_WN#b3=RM_*y~;-sQ{h3&aOj)0o_*z5>*;s5NdqxxFD*%Efj}PvN&r=#?nX zq3HX^c}KX@>0c0m#yA5!ld(;&W@9G{JdtC%*+V?^9OW6gFnP z>}70zSrV)2oP*nRRg#5=T=W??>e&?uc-wC$FLQ`+f6bq1PRs-2CowtSy;?Yd{gOqo+K`nQ*s9geHXTq>aF)lZ(}1WpIOhWt^1r81q^YI zH{w?Xp>IFi4w1RN3g0A26WiuLn*BJ0*fd|aE`WrH?uh*vWv{OZ0s7j6M2zS$Lh^c1 z(Jw$ES!@=j{)U(|0VOoV9ATZnKmSLZpT~JtaJZW|*xiWo&RnH;6NR zF!|ylxO)5QIFU9 z(kNWgCx9vMayo0SFl(sI8fDnh)OrjLpi6FOP4iGt;UR}@$?M5q)W5PzJ;Y#Lb=17I zC?tvPtw9-HQU7Dw--(-& zkpF+Cgl30GvHy2w@aL}ow-V6^h%E4u7A*|oM-M|l?EiNA007JXq5fG((I*g9Ae;#e zgYt9y`=|eJm>w%S3@XC$?}i2d{v;LuQCLp2xG*z%9x4JHAF)F@!WC^(Y`UAjp8Dbmt%?(kUe+-Ju{L4Uz&f z-wf(GXMMl5UjBOaeeZqkeeIgHxN9sT{3RATV5#nWisIg*&Jm@SQ!i#=r> zl3tnNMm`F1a3AWWestgEQ}Zo90?csL1{Of@%mJKe&#*egewU@&~Q;Dq^#>#V!kJ+EWIRfM)c1@OPn5#BoC3)HMoOGUI3besJoO@il6bOHV1 zsUJ=+O=9HF%6wB3S5#B_81ZAu*Tx}4l}(8h} zt|Ue_%W=j5{falvzAN(ynl5o4)OYf=36{Xwhh>@LT&&#a+VY<`j7kf~=6zm}&1G5t3A(q7mmcGDV><*3alAC13 zx=(6G2ULSaqcIH`q*Vt*d}xFre?wog8OFC=E0KRpa66{$X7ou_q9#u#~YA44< zLifU+7A$hrV0Z5!0lvOkZ6s^1&qe*zc2>lRn2Ji$VJK$~W|o*1De2eXceexWa-AZv zDyCTKTXy`Dzl^DLyyc3GDt~)p06j}>bcHDvVFzSiVmaCvRu@2*VFwXhv2_J9=?ZB- z=83ah6Aa?+BrQ94ljYdGB9qi$cqo%bs{NAw{pyEX+Yg4EvjPK$U((l;HVmFID?|EN z@bDm>(JO67kCpQBr7Ha8@=o{*SB{l(+uM?Xu&+fIbabQ^#j{Tr^i$+|WK}CCOV7E# z6yX8+X3~fGD(!7P7y@h_Ll3@F`(F4$pUd6dKk3sQZxXJCNzT?~u-Y2wedgnmV6U{R z3>qCYo|#>4ds9Y|ycUR8d>Z(zU(qTed&OU~wPs{7(rnvMdaZ{|H?$qh@6RZ&{&=~A zSj6C#1}8ZuhAS^;fAS^8y)XoU09N?B4K@zI=@U)PXiqA|xoXrZ@dr#jIP-Q3ge9hg z|G?$!5K2LyxO{1D6@WcL-eZ^kxHzZgi|_lfw}vrJ5^2VVcS+r3mTp~Pd>_Wdk*>7&X})-h>~YxI@YzG~qMhN1SY4fu!BTS@jlxAo+9ta~cVi9fuq zD79_(|CrZ}k*o|C^O{I4Ca%3Wf04+p=2>GU^&F#Mla@CFYKg|i%LI<%;Z6Q@fQj~# zHb5pl1CHUMD8nkFy?T2L(*PtSgQ(n)1A^+z15cm4xUzL3P;WUH7na+wVt(!)z^CxM zW)Y9(=8k5sP~^CEP5!N?yskZEQVOj^d7MYt*7Ao|XR?*1kfI(#rkJAIYTJq_CDBtB ztIGkMlNhz+cXk<|WGfM|GAwUSPT5`!3Q}z;r(=~;shLTdh$dg$HOn6~5zepQ8v|tc zr;C`$cvju3?J(*%Hu3y>>V?anTJ zlj+{+&m){g7`827hQ#@5VjM25&sd27gfcGQ2O|ZH@=m(&$iGfLWB6th4PmRGf z)iB2t2|VXEzTw(m=iHVRo-+(DVE6k9`__}P`}{ACoB5iIM&C=8`Gtt!1;^{t$gED- zuOogEo_mb&N(`1&MwggTr)PrYNi7g6G{|eIFfDT0nYHen@haRwkiA%nB#%XL79DYt zGUdipHn59lR4{m`_KQ8&{uWEd57s@9zxEPu_28+RV(L*b+QQxl-{AT5Wjsa8Ky}22 zqj?QxbLObol&N;9XUZ2l+_>0$z|JH2A!&r!`=?Q`kcy=rSihjqT0f7y${<;t^8uWe zOuvvDET*~%vD~M+bxn!4xnt51)DJ5h5C=uuj1O>l*7jTC5xrC2CF%U}@7U-iLXu`?2|)=J}5F3+s}}86L?Q)f>SX!W(!-8}-jN+!CK_ev-NkL}zDUdBPzsEDx^^6F-+ zqUI~*=k?s9=eU(cHu)^N5t#)SoJYHEmrHxt&{nyM7DaUN!%`f=atIiOoSNTdZ=^MHJfeJICcjyP5a~%1$jp&KCMvrk-lbX*}$Q9$JkGpX^ z7oD-J6DrcxS#|H|Ieoa28<+8@XTw-vEBq$+lxM=OOn8zFKr2q;xZ~!5v5;{=hcsrmXC%02waA zp)MvY!aFWgCF^*t&~OW{c-NkUb^^{iQ6|DNAuN*HGIsP@;oMVcO$}5Mr%)3AeZxR> zYV1_zzLspona6i2eyLN~Ob9R|?G;R}oR#3@rRs6JRQr5Do2qFLE!^ zK%dcI1Mkz#+*f)j!j~|=$=(RCR9nzkxY-X`xJx+`i6+MZb2Ke*vu4wIC9(4M*D?5n zM3meh*`I6@w0$;OGNvdBi9A|AS%|l+O>KuQdzix-SBDp3Bg1TJc`_#(VXOOlz{P6h zPY)0Hj|IIJ?k8PdXJrzEKoeqxX?L;jW8sPmprapFR3R-8S#D6%$`JRmbjl``$-OVQ z60-DEfM~8MCX?}zQqQmK-po zw(Ad`A;ek3A`@NB&Zdml+~xkp;Z>wT{ldfOo?{1#V6~i&?S8%&TmA3ueTz^1eo@;0 z!vM%l2h}Goy)%mZVGJ@7*LiG5)_l@L&99`hakUF(U>J`K_Tb8ZeaxKSk*DnN@Bv^i zhh-a5vig{0DN}6>D6|gZXbD4j`*(T_9%(%W(GYH)u2k~LPLyAWzNGFU?Gb4a zcvW6<3|p43oZ*X=GUs0_kT>VC`;6$WnuKLB>w z>`1TJNDwkA1M`Ceaa7iR88kuG63us{TRl=11~{RvQV7BF*aopJ@EZU)?(&qoH@2yH^cpWW#Oma!?=N6RG z`#`e8-8eM+w1QmT z%XG6J^N{u`S`F)2x9Z>cJW-rWfXHh&Fd*IfmW@h|FNnIKOf1I5zR3{e?TTF?uysp) z9De=ctHQRq2Kz}Q_KktSZlwPj=wcV6l4VEb;<4&n!YREom02_6OW(wefyO|wjBa!F zra-BT?xx#60o{vHQ#QYa+C?@CLBO%cvtju%$;ajSxz~J4R{an~S#79aFb1~tRPG}F z>;yLXwz)r(Kbr9!&Y39t(S} ze#%j2ZKxwD4GN&@;DEC^V1t}v%=q^cW zsbVI!$>^Ei=#fbRdmI(J#;64$mC=;EplV7U0YOY+cXb|KPM%5w7dVs)oG8G@rJB-~ z$N`#7v;&X6AXHQ#Gae21(;8ce&h*Ka*BQlnEh3jBqCzD_&aPo4qd|q0CSaWRqj+f3MYzwS-BKE>M98 zTgwb8{Bb=Pek^ir@Xdqg4-W^RFCe8DMZpJ2fqM&FfMPYA%>^z%`iMdLco3PB_qHm- z;o5>BCeZj5KCIUGV} zd0AY}4t&lIIYlZB`w21EiULR@075^ch@@pLr!zV*vomJ?H%+(B+R0jRgehe2t6#^n z#s^;e8{69U30MHh075T-;*7H8o8B3F@Rw)ku?WH6d=gBK@%>EX!;NC9akgOEV_Bb_goJ2kt=Qt$W`ZwBAf zV4~35Mn+Psni zvEQT~RI%KqyFXprYfIKGV6Y+o)wVDvUIQ8VF^K%W9}mV1D)K#f7Q4cngg?g$emtZz z;n`{wkZoFOnqM*1o0E_qy_(o;sdqqCC1!$sY|<1-t{v0)$aAkxn%EpDk`2c>fNPar z`zMZ@7A5<34}aRh?%OCH%H!D=K1kA_W->N7l;^fD>_C1u>Wj)I>HG2MU;93k2P2P@ z{~R0p@z`DauHNQ)zpX!Bg=Y&ZIm-T0rT3~Im4ea8j(!21?idJF7tCTgmYtnudqp3s z8gJ!PHyHqt+xYRsT$}f7bMja&updtW zDuRi0s;-pu7#A_?@4AX&(lKI)W<|QZ*_n zX+eA`X^IV0B1%rPE4=3c_ebwjElHIGn(_U_tj%?g#%J`VXG*Ockq#A`;|nXQjoOEh zBu?fpI^*258v8CL8691Zu&Iy%aW{+|kPDn3^^o-fW(>Q6%57#Gx~@Bu2x;N^ z(FUI?aOQOvQmIM=zR#@Ti2jS*U-t$)vXG>Vo`1jK!cZ-$tq#cvK=e z=B)Gm>ndPq`F~#km3Z>7-yxTNvH8<(HszrZRBiK7;h+d?>n4N#gpBOGbM3lmlyZas z(qo}C!$mln+EoeOMU7^;4bqOuctY<{A7vng*>%6wYkj1=*lPWf6AD>bdR8;|KwD!1 zni(OWBx-;@?h1t5bS^owS=#R^DsVDlSVHSAD%jl6swNOBDRzEN+etm4pRZj_g_1&P zdy&$rcJ*zP6h=GnTM|S{ec3o7IHCr5mF|8Ik+_oMSx6Y3$nTV&KrHPsCy=V{M_sh3 zcU;v;N%=fKiBTN!OirU_2x|lwOl*!3MKPqfpCo#MI!6wX%Qm;mwgDWK&JvEO$7$PS zr0^(=KH5ME7uSxnwh}4kKi|kULS(}$jVilQBV=r=Wnx=y6Zd;2eR%CN6RZ@;wI`=b zjgga#Yv_xq^q>1{cffTVd-5hLStz^uo2UppRdmj=`e<=c-lp@v|J2HYduk(H#9G7z zWZoAyBrJ(T%^vwN==ozfy*?dp>K&irS!2oJxa2TrTl?QtoLSGZ$^2bK`^>PI;NMkD z3MS+^xt`&3?GwqOX}}Rx#%=GcZEx+$&%dX&>a$!I2sJsXOno3+iVIW_Ji%NS^!nS^ zLv)n=TN%lCdOZOd?Fdmb#y>ue#wD+juP5kp@P97mIsfkkfSTYg5bpnUbiG6VZ&bti zF~NlYA;eZh3)4p~3=}VvcjUtGv0Tl1aGiyPrz640>{!~P_|AK0UGU&ewDfTRNbHOY zk?}(cI1_0q-&u6y_3{G0ar~k?aWVYI1X;WP2m%JpL<>feMNZebLjpCFdui{K{#hz; zWFk=;1G)BgOX>CDe^U0JT^qKj-&7_gi;VwJ zN&0<@?9MHEuC2eo(t>?bxD;F0lQzUFH(r;AtkgfZi;;hPp?=V~w$h4`U`hhQDE+!T zu3(`)DZuf!OPzDOB;TRm(dI02=EA)TY|?-C7>#}UwFNTWzC(XNkjdSUH(6Il@wo02 zsXsW#>^Hsj?G#@|21`gzKyT^g)#J=oa$tx^aBIP{f;*#h)gy>3)0BQvuzaw`pkB)| z{qu73rkxng9N<|m``W>^bEOjCLu!n9;nha+6Ll% z+rHTSvGC+c7^EjH8$T~6lqjqkI);YM$(kP|b2EgWlc@zq89bmjfE8(7fk|QB>ArL` zX|(suOZ29gDb>18UN4RpTvGvkKF#g{ux6ZURR2<+1-;N2Gs~OuSW8Rxp=80m`wB_s zL}7wU82Vo4jp3fQXFimjn2IaUUlulT9W##}Fjqx%``^Y!&u>^$ES7;8o$A9YH(6f# z{tA>vyi)!mV}~GaFJ+wF*5#gTqq`V03$8 z1e}^HN0N^RIeW~aDvVuPm#4E_7Kk-yeD3*Pb8j6%m6y}KAx)d0mz-mxdkRM$8=XOh zWk8e5=iAsfL^KY+7M*wGI1s}f*c@mu(azx5sfi3HPEM0lu!{B`W=_XMbY`_|ur}G+ zi9F(f9qw6tQ4_AzWs~So7>n6tAf@Rj+V81mUg_GYf(SXMM|-Raz2#2?Nk2B&QiZixsk4hL}b2z+xQ$JZ~ zNb@TtLYa4_=Y(4n1vi)UJ{Ss`(RI+Z8-3VdQ8SY;@IJa{A~-BxHG}3|LScfbyAz-lDX8~{?i@l%QoC%K`n2bkU zcY5_4(>ey$OW+(@-OVbB4u~l_bt|{+vqkH~cGng(S45P#&HmV%o4fUfI4*ui<`m|w znHqoUOX1coRXlNnT_%)O+nk`-@b*#5n=VXp$@w#p@bTR*^^tNSHPTX>29pCUrd&1LQ5$h!*bph3fDdJoR)a6Ur=*zN%WE^b%| zysI?X)*2n#;*@t1S*%oPUIYU!W=#*cj7yz5o|U&RDw1hy3zd2YWjoWBy*WJ8zS0eS zLmvYM=O4}{jRcYP>05bUnoaPTPWP?hLD<;K3L0-H&CWj*XU<6oXY|hGWSThw-<4NX z9TnmDD8WwfL-|tz=w=Ho#OQ)qqiRJlSm<2#F62{i+6k3PW@0SI4EDiIF4LZ=*5Wgq z>jwcayD<*lKabVWK3);Je_kTV(a>%opRWJ?i-XeeNnzX~hSCtTLj(AT>Hd95KtrSc zR}c9`1PJtp1 z?tORNzr6RKoPDygR=zp2zxB=RnNd|hK*R?C04M;?=yXkK-ENG)`(M@f3+H~B*_*05 z+B-P08#_3#x!c()#VDcoaNxYWliyheYaCK?QqJVB4SC7(@y3}+x&~i+zwVA*5?+DLeiLXz6cX{nN9#Cgo<;hs2R+HYljh=)fllpozunWtwkUB zd>m#Jo~&7JgkJ>arPC^e>gT0nhOqEIzbh`td3bDPnbxsIUIgF;v$7 zBHOjQe(Rwt%426V`<&LL@Kqjte->mQ@{748(}iYvWo;)~0pYvAjmUf@M+Jk=`@P1g zGg1agRvn6wXD`Y()CL{Tcw2l=SA!d-zgylKx1s((^S#l#LH(1N5BizZILH7%COrUv zch8KwExWU&xt;mnPtFH!_I34~7Wwgg48P~L!sIy@&U*QL4-LHo)S!9eY3 zTMx7NAiqu-UYy|+%>4wVmJDG;mYv^YQZifH{2nJi*-W-W!jg{NjTYFK=2{!sSJt$+ zXn-#`o)tq5yU+?14eE8R0KNP^LwLBoUjidh6x{KL=k(X~h}o&$0{G)3h0woRakq9P&v*YLPq7pC&-z!W0tB(jIg5KJVMliTb?g z%xy=!wtnQ!-!MEC=|GCO_Nq0zC+pODcsVIS#d~M0KUFSMOAOei-w4` zo`fm=xVdr0dR1bS^ud5LnLw)kFOZwF)YhQ_kY|>U;FwL4pH&%L@qTN@c;dCw_C`)| zB1}nQ%%P11_2@UXo^dEWSP0KikkmrLd;I)7zL1t{{NNI8S6SGCLNlf6&G`66c9bJ^ z>+-p_&$)^Wm>O2vRr?&4BuyigGsxPq0pzcj!{ovfL&*wBvsNXAFF@r?$ql)vgO&r= z@O&COPzG0{!+w?7r;BLiYRfGKUEoL)f6H|G?lfup`$?hnoc@ot$57jHAC#SfF%X|CksW36hbi=F94 zw?V|+(hw4tP|GP{&s(I+Odd4ScoH&r3zAxCsvxV@LvjdBOnOBRkXb_1B zhIgewM!LArNq6O`I^eZVIZvXf(cs=_yvx{JJQgs)fbaglW07&dPVx|b`Sks~ciMLuNs?EHS@iW(egsu<44$cDT5opNiy8HS$sWSaeTE>a9qF_40nHWTT_PkA|d< zdOCjj)9MiiW%6MRAq(LIvIe)0WIVsm-?(m27jnE#m24uG=s>V*$@(J5pPd%pj5e(n zXWx6d)9+6FO<)1B*(XiQZfkyW^7mHvtE&71;S{ogu;VIjs_Z*?jLb1;C)PtkE@O_KH;HDC_t$!bQr~JAJ*R=r~o~yZ4pw!cx)1v5jl@$Y(MK4ST z_nXq2{n@RI%u3Jau2-pU-A2bZ4ns27n?hTLr*9-Heb1NIufT~yvWl4={XjTpDR}B+ zQsk$ETpOxC6XKBZ;6{^%ULL{+niY}yr(L19A7eB#5{y-d3iwH}ybn<}n4-nSkEp^x zq9Sx$KR8IVc8h{tu>{x!sdJgl5`LBp?-l_$O3tg(o>VTwM*TtP7Sj>jTd;M?sJ5#bLk zGwEo7s9e%!3e|ZX1yE*O&n*?4FRx*E&y?vFnlS^#6rOlfBp{nc>78;L#^Re)6jfJ1 z7dbIJ{IyRoa^Lc=hDxOqgJvVk1)|aHU(AYciY?7xTApKalg1+%aDHgu&EHT)6aI30 zfLYbk7xQ&LvJ>vl1H_vhYh)b(0Qf=#0NmdX2Z)=!qm7fLxw*3w`(Iywog)1oR-H2V zas2NHu*VfS!M?7x<1|fR&~)DiK{ub7!73xDKfhcI``wLP4Q6wm#`Z-wI~I!H@XsfM zx?C%q9Y7m^z(peq6X(&K+MHpac%KbJ=|!J)$xM9GQG$H^aIN?Zsin!s8Wic?uNtaT zZO28Xp!1Pp(}rXzgKiK-n4ON=tt&Rtl2Y4*5Z3ibZ9O+ax3m5dX?Lj$hWOEqwG${B)N`41Q{79Qv{JU{0yi9^CoiD zneIsQJoj~YE`5I!`GOHkt~J%g`yvcIp2P4Cpd>VLQ+8B-HOp@N_$~`Y{P_vW1DX5C z`dUI{1D?H^%j%GhY^}vvHAfe2t*ylAbVuDlL{Y2)d1-9qBe?cEz$Oba6^qdZ^2w(a zd30VU(;xC~P2$N*Gs4!^ylpVHK6M1AGV52mQa zOvCOm$bJ5d;FfrMmqe~n6(@zzSE}%tj{^Vj$KzC$Rd2s!(3w7ppG+{KA^s8#g5j#k zEhkkAbHLM=V(h#*mTF$Yn(HKM$iMRYOXes_DSSF*Z;B_MyOi91DY@NKC1Xut=YT6(z|8VL*AD22(K6-P#|>6vK@ZR^2zl<3pR*Z%L? z**%x~gXWKy%>kw?$XF_k_1-Ls7QU3Dh{m%4{X3!bbTYt6>0yFh-z+q=83BDcJLhqgw*JMXu)T02w?!Y<+6X)#2O zCDTkOk%1sk(hi8PVR#cqkG3TOng*V{Lepb*tw^ibH0cT@6m)J#5XL9%{;E&83(O4xAf;z9&gas;^2U3V5gFlNYTEmqRJL)pvl02^wHab&A-(_UlufB-w1vl0jdl8?f4kz* z#)l!MWiCc*=AO4jLBhy4Q#P*B#2NfyAzC{$<`q-Z`7vH9ButyhHfK z06-`x33e1v8iYGA-2P7k|hVPO@#)B*7+b!YIS}H@6wf2Eru2%!8up4DX1e*RfL? zzpcSSUD5oxIw?oqXP>nT`=*#c2(TAAm)75oDz_DYG~4|7GKa_*_@nkfjmmqf2uf&3 zf_2sMTkw~TZ)R`Hl@7%ElmZAzMiBU3X>J=`Z^1_ah=YkU%&F`6k*sQNqlS z;{0)FeBzDc%Dbq2Zel$uw%g!krJFoSbSKLRM$y{%aw|IJ3=zwMB4wLdPTCj-kHL-h zq1CiD+V~e#7zx1Vp{Kzsw++W21P&0dUm9l3aIL9ikuWIF>@z4?Cai?Y@pA$ZV2aRj zuqX~M_ytaf!wiaMwrS1~%8;ojLNYDt*Erm1J$&_Cw6<{H_)v!N;e>mKdIp_vdk};W z;*E_cX_B_SN_n1$4l5rt+g`nIzr_4g(Ty^@5ncC6etNI!dr<=n9nEc>*x4SQSqTbY zcuov)2(G!IVrd^dXZd`UWEgr=_*VXhzIfBV)AQ*0E=o(F!d-SYD+HVSqbsS?QlTxB zqfdW9lcxeuW5Z~a{Vq?NiAO=4HJ3YX;%pv=<@*WkAZsspu2IqHTJ97rez(P`&fEA|vf#o#5Krzxa2_l-k z+);2+XlhdDzPf#PGEssra@m>1Q5Zf2lR~AlueyBHE}y%=ed4%pl^O3hiv4%!KAh<$ z_VzXp!5bYn`Oqv&`4xVCG64>hQ`|L3^Or-xk@OnZb*oS5OI`<8LFnZe6~6`355VSz z+6^+pu!Zs@&yAx`oY*v&r$$e{Xt8SVLrM?`-(ptJ;_9w!&2VdXM|@fdO!U^pug&bX zeBs#9KUNlSPLXmzfnQ0g~RET!u;LTAywiRYXA-nw#G5Vq3ZKT?=Z z05?zRB}Wntc|SxQw3)jb{BsiJP##^FTzZg(u= zgp^>mDbZoet#nK#F|o6%*ps-}_i>-l=%Z=li(q_-OKTl`-`OnLe}+5XnA*1eI7a_d zMWEgFmWq2)f8P^K{5QFO3+X>8{!3K#@gi97IWU4DxSIf?l9^oiBDQh@!mz+gV8F}j zvYvgCZh$OV3y02lO6M;#3wG`ZFQHd3A>0#7y3ghVd*pxuAyNXVxv%(i(P#PJD1FeC zcV5(^Sdp%FQ#`8~j8S~Wigib|ShT|})Go5hxOYWaVQTe` zPrms!d*d*b^j5np=N2k8D}H6JIl&qwX}jHf+PTg+K)q0t;QNlY8Q{%!3HTmDFj zq1kb;8~Re;K_WZ6HjL_&`K$Vcr+-pZh%GZ-yX=5fUM>8NCEV~Zu|*4piyi*<$MYBk z`6$!^D6)ShtIT9S0rydy@%73m*eI@9c4Nj44Y*K`=(m++yHgf9C=oZPFR&40w!c6h zwDJz~N|RsZg1W%<5V5~%gyO_4hyF&7*aJKF=D=$XQkV!;!3_H<0uj5fu;JkG0snp6 zc2DSEm;XJ(|9ANI82xzo^*0s(@Q17VPxL>du*dMn6QY0NpYLD)|ICXX8+hCy{9~XY z03GGO_Y04$JT52xvEmO$gYlP@e~XL9(8qcEU+6j3A6fh{@Npje7r1(#7XP=?`6nwr y20xDTf5F1{BglL3e~J3Xb{>b)zjml_|KGq;RY1BQ=m7wz_aD)R0_-6G0sjLq8p{s= diff --git a/tests/test_scripts.py b/tests/test_scripts.py index d4286bc..e8d9fb2 100644 --- a/tests/test_scripts.py +++ b/tests/test_scripts.py @@ -1,17 +1,46 @@ import pandas as pd +from pandas.testing import assert_frame_equal -from scripts.sedos_structure_parser import parse_es_structure +from scripts.sedos_structure_parser import parse_es_structure, read_sedos_bwshare_excel def test_parse_es_structure(): - expected_output = pd.read_excel(r"test_data\test_structures\SEDOS_es_structure.xlsx") + data = { + "parameter": ["ACT_BND", "ACT_COST", "FLO_EFF", "default", "default", "default", "default"], + "process": [ + "ind_cement_rk_ccs_1", + "ind_cement_rk_ccs_1", + "ind_cement_rk_ccs_1", + "pow_combustion_gt", + "pow_combustion_gt_SNG", + "pow_combustion_gt_biogas", + "pow_combustion_gt_natgas", + ], + "input": [ + "coal,coke,coke_oven_gas,heavy_fuel_oil,natgas,hydrogen,SNG,,biomass,waste,sludge,elec," + "cement_rawmeal_mats", + "coal,coke,coke_oven_gas,heavy_fuel_oil,natgas,hydrogen,SNG,,biomass," + "waste,sludge,elec,cement_rawmeal_mats", + "coal,coke,coke_oven_gas,heavy_fuel_oil,natgas,hydrogen,SNG,,biomass,waste,sludge,elec,cement_rawmeal_mats", + "biogas,natgas,SNG_ren,SNG_conv,hydrogen_ren,hydrogen_conv,heating_oil", + "SNG_ren,SNG_conv", + "biogas", + "natgas", + ], + "output": [ + "cement_clinker_mats,CO2p,CO2f,CH4f,N2Of", + "cement_clinker_mats,CO2p,CO2f,CH4f,N2Of", + "cement_clinker_mats,CO2p,CO2f,CH4f,N2Of", + "elec_ren,elec_conv,CO2", + "elec_ren,elec_conv,CO2", + "elec_ren", + "elec_conv,CO2", + ], + } + expected_output = pd.DataFrame(data) - print(expected_output.parameter) - parse_es_structure( - file_path=r"test_data\test_structures\SEDOS_Prozesse&Parameter.xlsx", - output_path=r"test_data\test_structures\SEDOS_es_structure_test_output.xlsx", + function_df = parse_es_structure( + sedos_es_dict=read_sedos_bwshare_excel("test_data/test_structures/SEDOS_Prozesse&Parameter.xlsx") ) - func_output = pd.read_excel(r"test_data\test_structures\SEDOS_es_structure_test_output.xlsx") - - assert expected_output == func_output + assert_frame_equal(expected_output, function_df) From b85ffe6633ba83d6e0bda0b41800152ebe5413d3 Mon Sep 17 00:00:00 2001 From: chrwm Date: Fri, 19 May 2023 14:17:59 +0200 Subject: [PATCH 7/7] Add functions to map commodities --- scripts/sedos_structure_parser.py | 54 +++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/scripts/sedos_structure_parser.py b/scripts/sedos_structure_parser.py index c3d8834..1ba4ab9 100644 --- a/scripts/sedos_structure_parser.py +++ b/scripts/sedos_structure_parser.py @@ -1,4 +1,58 @@ import pandas as pd +import re + +total_list = [] + +df_com = pd.read_excel( + io=r"C:\Users\christoph.muschner\CWM\Python\SEDOS\SEDOS_Modellstruktur.xlsx", + engine="openpyxl", + sheet_name="Nomenclature_Commodities", + usecols=["old name", "new name suggestion"], +) + +process_set = pd.read_excel( + io=r"C:\Users\christoph.muschner\CWM\Python\SEDOS\SEDOS_Modellstruktur.xlsx", engine="openpyxl", + sheet_name="Process_Set", usecols=["input", "process", "output"] +) + + +def replace_string(row): + + if not isinstance(row, str): + print("Row is type:", type(row), row) + row = "" + return row + + commodity_mapping = dict(zip(df_com["old name"], df_com["new name suggestion"])) + + row_list = re.split(",|\+", row) + + new_list = [commodity_mapping.get(value, value) for value in row_list] + + common_list = list(set(row_list).intersection(new_list)) + + if common_list: + total_list.extend(common_list) + + replaced_row = ", ".join([str(elem) for elem in new_list]) + + return replaced_row + +def map_old_to_new_commodity_names(): + + char_replace_dict = {"[": "", "]": "", "+": ",", " ": "", ".": "_", " ": ""} + for col in process_set.columns: + for key, value in char_replace_dict.items(): + process_set[f"{col}"] = process_set[f"{col}"].str.replace(key, value, regex=True) + + cols = ["input", "output"] + + for col in cols: + process_set[f"{col}"] = process_set[f"{col}"].apply(replace_string) + + process_set.to_csv(r"C:\Users\christoph.muschner\CWM\Python\SEDOS_DB\process_set_new_com.csv", sep=";") + + return process_set def read_sedos_bwshare_excel(file_path: str) -> dict: