From 3acaabef40b88d461d64e1c382fc06c4db4c2911 Mon Sep 17 00:00:00 2001 From: Conrad S Date: Wed, 26 Apr 2017 14:31:27 -0400 Subject: [PATCH 1/6] Add python-pptx to requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 2669509..2aaef4a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ numpy==1.11.2 pandas==0.18.0 +python-pptx==0.6.5 scikit-learn==0.17.1 scipy==0.16.0 xlrd==1.0.0 -- GitLab From 105934032e00602d2829718f429e06a78f41ea5d Mon Sep 17 00:00:00 2001 From: Conrad S Date: Wed, 26 Apr 2017 14:31:44 -0400 Subject: [PATCH 2/6] Add report generator to the __init__ file --- bpeng/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bpeng/__init__.py b/bpeng/__init__.py index 76ce1c0..e9a954a 100644 --- a/bpeng/__init__.py +++ b/bpeng/__init__.py @@ -1,2 +1,3 @@ from .heatloss.heatloss import HeatLoss from .dimensions.parse_dimensions import ParseDimensions +from .reports.cbra_diag import CbraDiagnostic -- GitLab From 6bd24bbcb34c9ec29351f4620e383f89e824a284 Mon Sep 17 00:00:00 2001 From: Conrad S Date: Wed, 26 Apr 2017 14:32:30 -0400 Subject: [PATCH 3/6] Move argument parsing to seperate functions and update args for generate_report functions --- bpeng/reports/cbra_diag.py | 137 +++++++++++++++++++++++++++++-------- 1 file changed, 107 insertions(+), 30 deletions(-) diff --git a/bpeng/reports/cbra_diag.py b/bpeng/reports/cbra_diag.py index 6d4c341..6520dbd 100644 --- a/bpeng/reports/cbra_diag.py +++ b/bpeng/reports/cbra_diag.py @@ -25,22 +25,50 @@ class CbraDiagnostic: """ @staticmethod - def _generate_report(template_file, sheet_input): + def _generate_report( + template_file, + project_summary_data, + util_break_data, + heat_loss_data, + ecm_data, + ): """ Generate powerpoint file Args: input_file (str): The path of the report content + project_summmary_data + util_break_data + heat_loss_data + ecm_data Returns: Presentation: the presenation generated """ - - input_list = sheet_input[0] - input_values = sheet_input[1] + # Put all of the arguments into variables + client_name = project_summary_data['client_name'] + project_address = project_summary_data['project_address'] + annual_energy_percent = project_summary_data['annual_energy_percent'] + annual_dollar_save = project_summary_data['annual_dollar_save'] + co2_tonnage = project_summary_data['co2_tonnage'] + jobs_created = project_summary_data['jobs_created'] + blocmaps_est = project_summary_data['blocmaps_est'] + + util_break_sh = util_break_data['util_break_sh'] + util_break_dhw = util_break_data['util_break_dhw'] + util_break_light = util_break_data['util_break_light'] + util_break_plug = util_break_data['util_break_plug'] + util_break_h20 = util_break_data['util_break_h20'] + + heat_loss_cat = heat_loss_data['heat_loss_cat'] + heat_loss_val = heat_loss_data['heat_loss_val'] + + ecm_list = ecm_data['ecm_list'] + ecm_heat_save = ecm_data['ecm_heat_save'] + ecm_elec_save = ecm_data['ecm_elec_save'] # Define presentation to edit as the finished template diag_rep = Presentation(template_file) @@ -51,8 +79,6 @@ class CbraDiagnostic: cover_title = cover_slide.shapes.title cover_subtitle = cover_slide.placeholders[1] - client_name = sheet_input.loc[1, 1] - project_address = sheet_input.loc[2, 1] cover_title.text = "{} - {}".format(client_name, project_address) cover_subtitle.text = "Energy Efficiency Diagnostic Report" @@ -87,11 +113,6 @@ class CbraDiagnostic: crnyc_intro_run.font.size = Pt(14) exec_results_box.text_frame.add_paragraph() - annual_energy_percent = int(sheet_input.loc[3, 1]) - annual_dollar_save = int(sheet_input.loc[4, 1]) - co2_tonnage = int(sheet_input.loc[5, 1]) - jobs_created = int(sheet_input.loc[6, 1]) - exec_energy_savings_line = exec_results_box.text_frame.add_paragraph() exec_energy_savings_run = exec_energy_savings_line.add_run() @@ -139,7 +160,6 @@ class CbraDiagnostic: energy_analyze_box = heat_load_slide.shapes[3] # BlocMaps Efficiency Comparison - blocmaps_est = sheet_input.loc[7, 1] eab_run = energy_analyze_box.text_frame.paragraphs[0].add_run() eab_run.text = 'Your building is {}\N{PERCENT SIGN} less efficient than buildings of ' \ 'similar age, size, and type.'.format(blocmaps_est) @@ -147,9 +167,6 @@ class CbraDiagnostic: eab_run.font.size = Pt(14) eab_run.font.color.rgb = RGBColor(0xff, 0xff, 0xff) - # For using w/ input file - heat_loss_cat = input_list[9:15] - heat_loss_val = input_values[9:15] total_heat_loss = sum(heat_loss_val) heat_loss_break = [hl_frac/total_heat_loss for hl_frac in heat_loss_val] @@ -181,11 +198,6 @@ class CbraDiagnostic: # Define stacked bar chart data util_cat = ["Existing", "Projected"] - util_break_sh = sheet_input.loc[16:17, 1] - util_break_dhw = sheet_input.loc[16:17, 2] - util_break_light = sheet_input.loc[16:17, 3] - util_break_plug = sheet_input.loc[16:17, 4] - util_break_h2o = sheet_input.loc[16:17, 5] util_break_data = ChartData() util_break_data.categories = util_cat @@ -248,15 +260,6 @@ class CbraDiagnostic: ecm_table.table.cell(0, j).text_frame.paragraphs[0].font.size = Pt(12) ecm_table.table.cell(0, j).text = ecm_table_head[j] - ecm_list = [] - ecm_heat_save = [] - ecm_elec_save = [] - - for j in range(len(input_values)): - if input_values[j] == 'Y': - ecm_list.append(input_list[j]) - ecm_heat_save.append(input_values[j+1]) - ecm_elec_save.append(input_values[j+2]) for k, j in zip(ecm_list, range(len(ecm_list))): ecm_table.table.cell(j+1, 0).text_frame.paragraphs[0].font.size = Pt(10) @@ -285,9 +288,83 @@ class CbraDiagnostic: file_name = input('Enter File Name (with .xlsx extension): ') file_input = pd.ExcelFile(file_name) sheet_input = file_input.parse("Inputs", header=None) - project_address, diag_rep = CbraDiagnostic._generate_report(template_file, sheet_input) + ( + project_summary_data, + util_break_data, + heat_loss_data, + ecm_data + ) = CbraDiagnostic.parse_arguments(sheet_input) + project_address, diag_rep = CbraDiagnostic._generate_report( + template_file, + project_summary_data, + util_break_data, + heat_loss_data, + ecm_data, + ) diag_rep.save('EEDR {}.pptx'.format(project_address)) + @staticmethod + def parse_arguments(sheet_input): + """ + Parse an excel file to generate arguments for the _generate_report function + + Args: + sheet_input (dataframe): The sheet where the data is located + + Returns: + project_summary_data (dict): + A dictionary containing all of the project summary data + util_break_data (dict): + A dictionary containing all of the utility breakdown data + heat_loss_data (dict): + A dictionary containing all of the heat loss data + ecm_data (dict): + A dictionary containing all of the ECM data + """ + + project_summary_data = { + 'client_name': sheet_input.loc[1, 1], + 'project_address': sheet_input.loc[2, 1], + 'annual_energy_percent': int(sheet_input.loc[3, 1]), + 'annual_dollar_save': int(sheet_input.loc[4, 1]), + 'co2_tonnage': int(sheet_input.loc[5, 1]), + 'jobs_created': int(sheet_input.loc[6, 1]), + 'blocmaps_est': sheet_input.loc[7, 1], + } + + util_break_data = { + 'util_break_sh': sheet_input.loc[16:17, 1], + 'util_break_dhw': sheet_input.loc[16:17, 2], + 'util_break_light': sheet_input.loc[16:17, 3], + 'util_break_plug': sheet_input.loc[16:17, 4], + 'util_break_h2o': sheet_input.loc[16:17, 5], + } + + + input_list = sheet_input[0] + input_values = sheet_input[1] + + heat_loss_data = { + 'heat_loss_cat': input_list[9:15], + 'heat_loss_val': input_values[9:15], + } + + ecm_list = [] + ecm_heat_save = [] + ecm_elec_save = [] + for j in range(len(input_values)): + if input_values[j] == 'Y': + ecm_list.append(input_list[j]) + ecm_heat_save.append(input_values[j+1]) + ecm_elec_save.append(input_values[j+2]) + ecm_data = { + 'ecm_list': ecm_list, + 'ecm_heat_save': ecm_heat_save, + 'ecm_elec_save': ecm_elec_save, + } + + return project_summary_data, util_break_data, heat_loss_data, ecm_data + @staticmethod def cbra_multi_rep(): """ -- GitLab From 81031af48081c4de190e809696250752edd7ef10 Mon Sep 17 00:00:00 2001 From: Conrad S Date: Wed, 26 Apr 2017 15:10:42 -0400 Subject: [PATCH 4/6] Fix spelling of h2o --- bpeng/reports/cbra_diag.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bpeng/reports/cbra_diag.py b/bpeng/reports/cbra_diag.py index 6520dbd..9bdb67c 100644 --- a/bpeng/reports/cbra_diag.py +++ b/bpeng/reports/cbra_diag.py @@ -61,7 +61,7 @@ class CbraDiagnostic: util_break_dhw = util_break_data['util_break_dhw'] util_break_light = util_break_data['util_break_light'] util_break_plug = util_break_data['util_break_plug'] - util_break_h20 = util_break_data['util_break_h20'] + util_break_h2o = util_break_data['util_break_h2o'] heat_loss_cat = heat_loss_data['heat_loss_cat'] heat_loss_val = heat_loss_data['heat_loss_val'] -- GitLab From b9c4acdc0da64f891ac1587cebebbb40e4e55138 Mon Sep 17 00:00:00 2001 From: Conrad S Date: Wed, 26 Apr 2017 16:00:24 -0400 Subject: [PATCH 5/6] Add tests for reports and fix delete slide logic --- bpeng/reports/cbra_diag.py | 24 +++++++++---- bpeng/tests/data/test_reports.xlsx | Bin 0 -> 14704 bytes bpeng/tests/test_reports.py | 53 +++++++++++++++++++++++++++++ requirements.txt | 3 +- 4 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 bpeng/tests/data/test_reports.xlsx create mode 100644 bpeng/tests/test_reports.py diff --git a/bpeng/reports/cbra_diag.py b/bpeng/reports/cbra_diag.py index 9bdb67c..6072e71 100644 --- a/bpeng/reports/cbra_diag.py +++ b/bpeng/reports/cbra_diag.py @@ -67,6 +67,7 @@ class CbraDiagnostic: heat_loss_val = heat_loss_data['heat_loss_val'] ecm_list = ecm_data['ecm_list'] + ecm_delete_list = ecm_data['ecm_delete_list'] ecm_heat_save = ecm_data['ecm_heat_save'] ecm_elec_save = ecm_data['ecm_elec_save'] @@ -243,7 +244,7 @@ class CbraDiagnostic: util_break_chart.value_axis.tick_label_position = XL_TICK_LABEL_POSITION.NONE # Create ECM summary table - ecm_count = input_values.str.contains('Y').sum() + ecm_count = len(ecm_list) ecm_table = utility_projection_slide.shapes.add_table( ecm_count + 2, 3, @@ -270,12 +271,14 @@ class CbraDiagnostic: ecm_table.table.cell(j+1, 2).text = str(ecm_elec_save[j]) # Slides 5-end: removing slides based on recommendations - counter = 0 - for j in range(len(input_values)): - if input_values[j] == 'N': - slide_idx = int(((j-6)/3) - counter) - diag_rep.slides.delete_slide(diag_rep, slide_idx) - counter = counter + 1 + deleted_slide_counter = 0 + NUM_NON_ECM_SLIDES = 4 + for ecm_index in ecm_delete_list: + diag_rep.slides.delete_slide( + diag_rep, + ecm_index + NUM_NON_ECM_SLIDES - deleted_slide_counter, + ) + deleted_slide_counter += 1 return project_address, diag_rep @@ -350,6 +353,7 @@ class CbraDiagnostic: } ecm_list = [] + ecm_delete_list = [] ecm_heat_save = [] ecm_elec_save = [] for j in range(len(input_values)): @@ -357,8 +361,14 @@ class CbraDiagnostic: ecm_list.append(input_list[j]) ecm_heat_save.append(input_values[j+1]) ecm_elec_save.append(input_values[j+2]) + + if input_values[j] == 'N': + ecm_index = int((j-20)/3) + ecm_delete_list.append(ecm_index) + ecm_data = { 'ecm_list': ecm_list, + 'ecm_delete_list': ecm_delete_list, 'ecm_heat_save': ecm_heat_save, 'ecm_elec_save': ecm_elec_save, } diff --git a/bpeng/tests/data/test_reports.xlsx b/bpeng/tests/data/test_reports.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e425486b87c7241958ae5f72c2e050d04a6b218f GIT binary patch literal 14704 zcmeHu1$!JzuJ)K>W@ct)W{80eXRfrlDW}zy%ZlfDV8G{~&H}=K{2I zF;w?-06Ob4dDz;J6hVU16ac_M^#6DKFV;Y1%A{gH3&PO3bcc8IvHUCsXX^ALa@#g$Rd26;cgJBnr%nCWU{QCic56=?91#ZSs@ zg80ji!)t3M3qVy|IBhih4IHj^p43xl>L3{%8Bd2zn9xR>7k%PLHcCYCapH?%%1w5H zikUz#aPK0{hQ%*&>f{&V1HauOu6u6=W0Y)Aozn-k8QekUjwQ7~d{cXMZ$nz?w7zgH z6}7xy1&eeiqzhVZHYr2kh&Zh@}pa}>F2U?T&o4P_3S$uD0PDj@9hl& zp!{#%+o-`pegkTe2RSD^$a@W)fHuy|On?0TpV$5`cGZ6wdS#M=63A=A&ZU2akKE6% zC!mPQxr<7-ldAg#$gCkZ#(tu}U+<Gx}NbzLC#=LqTD4o77)8U{ak zlY3QI`jew8G#!;wnv`SZ_5iBe{O$Z*=6hLB8n@1Px{8)Bg>v6E$)#p5C2CP7nY8d= z(LWP}VF_ji>JBOBY?wS$gUySnomPd_G;p8#;+g~wq@hvEt_{#=pBKuD#NrFx}fdsV(LjVAH02nY28|HubiMzd%wTZpG^&gYm zKYa!aG}D1-|92miNn=(6EC`bKp|8QyU5;$N%3+Qlr&Tj-v;6`bQh4M|pg;KTo?EN( zed|fEt7Db!yC;flU-fsddY~Z2GsiTOfeWg11DaYxoez$UlSlMe$l2slLP0<+9V}|K zYgr}!C^gCwiuhs@4Bo$H{~2LLIh@o{aG9qp=RCpm$a?vckcom*atZRxBqxdREJnC$ zpm0hvNmOC{#G7?{xfO>X|I2jZ9y}J?#ncd#L|_+{=EVo|!%*)r5*;CX2}^ zYTLCk+O?WE0QH^FoE(j!7^0X?9L`=)$15=ClRRNAn*4KMk{5njMXAE;eHhDu)ImOr}uLC9k-HCM94E}p# z0{5iSWJ2td!g|8QwpR%=@8}+Bl;bo?_ezEfn6#%6zf~3m-*pGD(n|}02nQbD$ekgQ z86H7s&M+PC{xWMLRU?>2GyWMEcj%*=d+=A2$@%aIS~seQ7**SZJOPhvEEKzBYixctuhn9DUre!|#f0eFJ?)U85BlOn?Z zfc)MuMFdKv%EA2&*lzCR&3E2M?_jMgY#VTK6n5C;~&QBY+>vKG*feNva~aI{v-aSXnwHAdynDwb?(if zL19iasy+_0RRK~W!0~i+DPmAGaX$R=46Nikke?l%O7+!yvPLf{cYVQA)Z~u;{#;L& zIIlPW6K|~1>b<=|zEl9+Jg(NYn~QL(z@s4eamHxI6x{0cJKLMW>mSIB)`SU_b*C2F zdapupwrwKcPONi36*05hQaIl%emBj=H_Ox~;iKKDpPjwdW~(NXb}b}W_H`!`EqoA$ zx*JR1+>p#o+sjQm_Ax8!(LCX+S`to)_w7~TZ2_`9aIihu%M-fPe=lg%_!j9V-;@6| zEtcQml%avT$j0pz>fp#33Oh=G=o~6~XuTJMrSX7C8;DP+>xF~lo&4Ng{?O?!LrTe> z{qw+}H&jU&0VC@%ta3C5*RC-rJpHTD$A*x+siTBFuBmm6@`A%BcXO7ZN@>DWOrjjk zab<;2`K2fZT@R1xV#kB;U=M5nq$lyZOe@;Nr5!}*GGey+5T#2-6z(2I6i6+YW1No4 za#|oUuju|fhC(JxxkF)N*$$KB_>Ytd`L7V0)$=j%?^CIUE4- zvzFcN}QSW`;_q6Yn=Px>|vCzbEwR`Z{-XkT6rP-HY!%A?y7_iM9BpefS zyN6=KjAzB(*d(fd_>%d}3Qf$H8PWy5v@DS|n3Ru0-89WO;it7mQ7Oh7_;{pi*ny`4 z)m<3=nDS3tYe5KA-H4T_lkwX|tgTv6~#I+&ef zgz3Mo3)8%f;i(<8TB=Sm;P$g@sOA=ss8Zg^j7#=!TUWr+RVXMl5l%$&N7Eb)r0g7AlK*YgA z3|i_k4knv@@e-?sKq%`NkFz>))-!#>#hBTz=~rFXooo&Yq|BShmK8H8`aG_8-)KsU zGd15Maw3N^v)|T-CK{4(JZ0awdX`nP*3HyM7V4}Qo3dn2H|;do)0D(4ZOgDom1!~H zIC-zQr%w2s3#ldgV6%Kh`PtCR&sh?{Xw@wnG6GN%&Ijt(C>1VclXJ{~SkdFoYtEB)DjdP!P>-*L_SUnjth3RuSvSsxo2B3WD{oEJA2O9;-0LqYgIIM*In^Z$aSjA#ktc z+vZ~7lpD#Ef_oAZAD=~g`-4s{?-)jKpeA<#&(dKD3yz0iXJwv=4M;ghmCF64}nuIZi@yDY^0O@u=%c~^&b zSG`rDxz%L`ui1ppesvx3ck9kH?urGmuUIlbRiYN0sVDEHpFiO|3_ran#n$KFXA1p{ z$0j?org}(jZd>4{*8A1|3<{wCnHTh8qjV`k0{}xLf4n~VGcRzl0NMhX|NQ+^7biO7 z(fHgL-PljU2+r=mIDf=bZfs53B(GDL<)#ocHl3(wva=<1;G=_6^4_Y_6n{<^vlmR6 z5rIJLyoraUXgDICrXF7+uiB%?wvp9!LyUg^+F4q9pXcXw?Q%KOnc?+51HLaQ&9F=P zN-!s8DT87*&EJ}bhQmimIwb}b2y6EU&+tobHQ&z()%F|A@DjwMgiT=@u?+7j9o8UB zSYk`hN1nh6ZLJw8X2uWA2jPqFeiFUka?rG4_{45?RUk4@7Eys@>)8~JEYJ6|33TFsEa1nYW#HiY=1H+*~iqTAgxQwnCm5tLfew8VFuYL{S) zsQffv*sgW1F^07%s@UlT@*(6%KB|5cP$NUuLU_hYH~@nQjn;fMZ3 zxl;q><{N8e2^puBFs9H(EBDqFOtZejIP?vKVA0Mb+DVlJ#EKJDHF<3^?mgX@Gd3YW z0JtiJ%+9w#1f?mMx|V1f-mQUE%2^mR`!F;rqZV~qL|Ki8uR?*ZCFD^}ENsQ8`bLr3 z_^NjvCIjE(n|{$3%yW}4=LvehUL0MAcMJO896t6N*0na$$=N|us;QmL#~Z%AykKt_ zcE4WyyyQNbqrU7L=>GLMmfrn#$#+|`vxdps<$HB?l#IRUdwZZ1Pq?y5K$vks8d-Z$ zy={6<6>S`d^n3{>oIAiGHjpHOdg%7$Y-|MF-~-9eKG&MlzEuM4A*c?4ZtLYX;>%Ww zxXiCowNPuOF>W~Sd|TyNV;2_=dGhPY*R7H5kyDA*XH2q{fcpdX0<9g@<=7hFK4KJF zWC>62j9PcCcno1hyLiOjq9EIjd`;xd8Oqn-h*?T;CnHK#rUr47h_OB(Nyy68_=fG* z{x8<^f<9*C#-M(%_(hcM4UJhashp_tO0aSgc14@*vN`$pzNe~YrjYQ8qP>1HWeAbm z=L^5Z6YYjW_<{6Hq(8uwBi5bH2ZWeOZo-$@1J7}HOA~Q-QJdv%WADPg&%`pN4CY4(+&^o2V&;#!;Q*3L@ z?Hz+WuxKJtH;W(fB-Um1dG>PDy>jD_6t+0Q_lS3+XK5Fq4q1}gyJe1JVRX#Xy|B)F z^d0E^?CXb(3^xQ%yC89WtZ+&0n(xL@RIGypjKg5y5U|&SA~0X|ByuZsZO&4%m$JE# zAuyygJJFMOV+SWA>!^RZj}p0qIlqI7|8V)7!k0}0Jdg;ihrK6eu=cXZTkCO1s&roP z)NnSKe|UQ?|2S(P^c6T^oq4T0bbEIzYL(gH6F5qBes!3q)KR;~PMUHy1~u3&=I#sG zF&zWV@?}+}jk?teY=Z0|i!*~^Erp!%ha;6RHQP%36oRfeaJ?rdO8!>egPp3tv^dRIvHBR+Ok(Y&>?EvpP3D(TUKRxegOUAE*4m92G+(F$@Fq5QF7R?P(Y7Y2}~kg}PFXdvGkan3x`WcUzL3d*PxhqG2BiQVvWp zOB*sfVyfXLGNrtd*~>D)luek~N#b49mfIXXtz0e3J0*)5$zxpVV_9Zcg0Qz4_{Y

W!O57N}eKd;I>+|!)y8ACSfJTGC^M_acq1i1m6KSYO%I9Gd*-% zWI%MV)6a3%!0Z~##JxxN9ivf;#g3>M-jq0UzG!8)q71XVKF-MM@6$^3#5hXJS-pkF zOad9@5O)gciqt5Rv_svTN>3+_+Bp-$I?;=)QiO<#1eYSg1WOS;wW@<%3oA;FM z*q-x^hUjHs%>T}&pwpq)A5~wkvf9AT0E3`3$MsE+5^O{5KO*7#{T%RZXv<<%&JrCp$0BMqcO13Ww15agEFD`O=## zw>ZpDWvIIzhsCE3Go+}L@kmEiPqO85GPQz<{SVDeWG-JYOpO829M|JzDD`LN|;@OS^WXdO(pU%v(lP`a zN36Aedli}k2&)QT8eyIw@1kte>d26r8~&Z1RdZp2c9=;Fw8Ej%1wtLcZHuE81K*$+6*L))2O z1qQ#F(d7q?Z~1=@35a4pd=IIh9rfh~D5~-~1Px(+fg7D5(G%Rp)o(kw*8W|u^ou%) zG;3?h3I|+rka{-c7WSd_tOf9my^V<7{|x%VDuT8%{qBw3!1)6I9K!?z)9AQ`NlW`w7}f6NqwtMF!69`kjy+JkuuVWi zXd%Ew?&e^~SYx~*R=>7>HONSKeQJno!}e0wPFKZxOslf2d{Kx;@krEyr^0X3=!-t= z7=1N^lsQ@xZX{+q;EoI>TZ0o|Y&>rzai;kxVnl5oJTmlx6F*P#;WhSy+_m|VI+6U9 z^o#JS%Tzd)zBz&ED9_`&R@u9|I=r&FhKT#~9oY`iGuq~H9lh6=;1`!w^@_gf1U*|} z4Wg#&+31Wa>M!FDX-%t4o*TV$_m+7vtjKe@0Ro4FX(a4c`mg~~pJxTpoURGdnuoR9 zHRyV}CAMhc#Apaql{q1yk7wa$v(pTy?!?FCZB>}r^19-A7F=x2mJ}kht#+FUI9nH@ z+Zb_Ovj))}&o^SXA|PT%j>FF?M%AiFIf7HMe5$|7=}OgTz-jBls8$L=@h3y~@ID$YjG(W64`)6R+azRg(5QC^DqeBZ)>Q8Jx~ zw14&G_gU<0MO>2_CUV28qPoM=xA&O6(EYSMt}xZ8?|q}RmvjTARs2&7yS#JuClG^4 z)w9|L>9s58dVEx*Uuzt^r`qJa&Gvc4`9x}}Ay=v*mM>PZ{fHBM($RjUYP$;C1M_5q zof&95<`^Zn9QxxHQig@na=W5Wd|t-^4FQ?P7&EVCboHwDzn7GxTRLm(Krf1*lmGyn z|5)h#y~L~3)3;ycL-RE>dJ8VRUwL|k+0o-robBxCTrz3*KCic;k5pM59hFVqF?oAN z`j*IuNSSm|jO>a=952P5<2+J3a%{M9*S;KI&TDtvKLfwt#a)4P>{Tx)z|{Hn>-kmu zY&_1^b19|$Ntv-Te}4LTZ~xrC-LES9e7LmS%G_w%LC;Ic_SvUVn_y9CzDr=@_~0kt zTwrdz%Vv9V-_g;>uH1=SxM7n~Y*PvQ*~$ANCA4B_Q0nEPMqkVQ_6cZ6s0%DEa|6P^ z66ZHf4o|GC4t?7wp*7q#;P>}p+9-2ZybIF4w(r*GzOD7MI5_s|R<1sB*I|h2^*vi; z;%;NkK4+dJ?zv!JTWdbGTYXJwJ|4e2t}rAtscv^VzxG zGC$2gXtItW>J!6d8~2+=_v@z>A)&@CHGz0iF*0SX?0olmM?_QTUs>;WvW~r=u>;=B zpR2xr!8kmY*h%2V*L&jZ_TALJ(25}?+>X^&-Fw^u#%Ul(@d6gLfFxJmXShPR+tk~b z!nhc_Gi8@E4(T)Q9;XPq*Br4g90K0^vFzg#zg)0Tk?Q!#&m=8daBGSEuqLxY zwu_tg)~qcme54tY{BWJbfJm~K`iOyZMPFV0sF1hh?N09- z)?}e1WWPKQXJt~cG*44yZJc*W#kZQC*g5B(TY(vFR{|(lVMGbLYx`C=N)EQYcOu%_ zUSbS)7aY0M~nFCKKQ(<4BP^6MmB6>NcT#$v-u<@H6OF)|69SX@_LT#txCFkyhz2+Khm)v{bR()HR8 z*{Q2fAk9&vF)S1RJO{em`JSWPMHNPFOV7q3foM z*srUAAO9$KB%+B9#k5)x5^;vNmM{8=&arScYAtr2mKh?~oV-`k_hf z1H`wHZ(@cRWymu!i^*4PP8OLnWeBas>}S>kKsz~ftUAeCQqQRKid?UIs4Z~Ez?Lond8lTH=Etjnh#A-sxM79VddnZOiG=wXF z+)MpSBC*vGE(Avo=`ke#aJ?YIEf~dgK^_v($-|%pNql56Y@iSy)C>b^=5YbF-BIq< zcXF_rE&WOPQ5zDZwmtY@4r62Ofr5`x*DW}|vLA#5_GY^|j8&8ew6DfW-_-4qLtUbx zahzMpMrgZzK1&m>h)2|hBq+U=iF?DaVi`WjCeTqH-lLnWoQlU#=8jI0 z`|M2K+$qbq`$n*qqKh)kXI^rOWz~G11x6-ZMuK$t`MN=Zg(GRtE&L4j`&gUr3}hz$ zv>mYt!;w1NPKsielo@#iRGXe?%xAKPf&5q$VSQh+p&j`A2X@I{5U0gzpuT`ChWB&w zSJccuhOm#a|Horxn2-F&&2OQ@O-^Ag*V;{d9AFSZDmt(Z;V>rsFrY0qLjAf{$Q|-0 z9kzGQ$d7eaAlyJk1-hu>(JnKRQ}_mo2?Oaay8qb}mDr!gbl{auQ&=T5fG{ib!50Rv z*m(!`DCaBcOh^@x8MFEs+{zw6M9@Tq`>F~CUJFEl^ z@4+WmnTsK1HSoI%f=?HK1|MtURD{d@0S@KCE0|{bo@J*A>_^dO_Ic`!Z@wx*hAiNg z{aM6vU*CC z7;!DVQ4PYfU$YjbuJsye1@Me+IZQg;#6~v4PzP3&gGTRedyO{>cJ_-XB|?e|rcUyT zumOxaAe$abl*@fX6nA(3k`$AA#m@zD8Li@`pRxA5fUHGpElIoass==x0>*9l0j*-! zw2#o0ER8Seu+^v1k2!nzbem^Y1NjPup5$37*9j_IzSnN_Nr%9OvP<((v)MsH<9-#L zpi{HgQDSGRVp&|jd7b&9Bemwa(aJE-+_gURQ|+#$mE3u&-Ac(?(@tWg{;hVk|4ybw z{k|3affr}D-R=+F`47*lwVkbDi_3EL`dW;XqSc=A78^6;Dc9f z_ONTJ9{krcf!;he(F8=?UPjAZdd%g`u9Wd{WAlkt+>6i670lf)tk0brJ-vD?U~dP7 zPvFhu{;$`^Z5Rixk5`3k4#-4|$2s~rNHy(`{~e8hQ)wS!4MMXZpaB5*|H#qJoQ&Q7 zsO2)d+1g0_%kS2=2&b{ATs0$7sQAlq$NAUIp`Zt_57kFf5srA0UG$2jL?*!<4eKLYy4pM} zP%J9s$Nl-w%&W3YCq5u4rAEDunvf|Xqxk40&c+X!q+wB6&zcnHP&hHUJySeZVAw5B zbP~xruBb`@IPq$WwY-bFO-yGITUi>dB*WFEt!3|lCU07>3Jnlz? zjV%k>v+3helS8YgDJlvriMdvG%6!a-Ec=BMa$he$AzADjdZC;;0waL9FI)Yi6uURG zhwfmS&AE*)45dk$soYX1&!Gl^i`tWCk|xKVu-UcYEuu0Z$ZkR$%m`hlh)-FDi63>g zH{8M%ygFjTK+ZWd0lU_OQ{`*0BNw{F@K?^eHWsUW&-I|Wj}-?=dXBzp`2e*WS10HN z{|xb0GL2ZIE7>a@tQ%^zOUyliuQ~JUn_v@y>*-`MKuuc&UR$&NW;-w2IeT)gd(ZVG zn@LFT^sOn*5KkY%i<~UjioDUWB%kDHN2U0~Y>flVfaHkUs^?>GK{KMoGmWzF{};qo3k z@T)Drh^BLbx0`qZVRLu3GvSNgfnKiPJ#cM<_Q&gUjP;_CU6#-VpGBIpLfb~Nb9^A3 zMXnV1HfnjldBKWs;nPQDP8;xi2TS$$1sQ}n9=_}*SUB@p zSOW~w;4KE?5Co#%@7BT^ki6mtDmCN)UyhqnE3NV8+sixFy2CJE@N~IxWO4M17aB8} z!V5OLSY6MeDQtmvBA!jPZ~o~PJ*>rgQ}qt>7RUR0P+6!@-UC6XsFRFSZ5QZM58NOR z{LjkZB4H|IBch)x?#gZkNiqZj51A3AZc#%Lnk{^8 zFVt9ID%Ji3O0y@k=`0Vt`!o?B48_;6E2+Ljk~w9=&&~xIXj+0V_7;SvJ>l`~Y9>Zi zLZ!R8oCD2s!a3uprs9L?pP;_(>Z!{&LwS$HDYmIQZIoAW5-ku^;{QNR@xlG#&C)-^ zH3Xb1FV#R!Ghv!~*>2R2-f0%aaiE*dK9MIG!n09hUl1Y%zR>Se+knBOn)P!KjJ3KO zw8wk#;zbCpduV>BNATgMTd>f ztHar8EaSA&;gSQ9VZXa|&u&n5Lt^W=LPQ5nt+?yiq`lLl8}ea9v>sI3flNZ1n;in^A}Xz_xaTa`A1EAI zPjk&eo3ZpMjG*J3R0dnJq-7*SHB~mhPF;TQgRUTpHm0@2R8CbVm9pL?k&&9AJ00Lq zbFK6#cro&_bofM@T=gnLcp)li*=}jDaJrXU@<1cfBgyo!EMQ@5l?~g6r+f}>^^zmH zWg9B6JN{Spn57hQjV2ZLK~QKPKCwtU8uv)Wo2LG5WRG(redoq7| zE&nJ*GJ!N#Vw;gazp{9Lh-SG_9FBQkja09IzNINlLeWQ}nvh2 za&HuczGy=Ow_=N6DPDHxS#U*eCP;fv>`1C|huc^?WA9*A&n4vbnkX}=A^_n6ga2qu&iVJzDs9DpM| z1Y#mrC0{x&!gfpbJbo>Ru!>GlRE0rkhwctIUiMaWYq@o%dC2W^-#cHKeC4vqC-9Ce z*#vpRe;OP6atfFvDBOPl864`rhI><|X4>gu>6#d_2lBEDq7NDr3lf&xgph`YjHN;{NxF3N`Q8Gg0X z#FfPR#=&2S>u=8ABSSD*3potwjL_Vpj4a_I1}8*v8(zj2u!TdHP>?f7LH00w+#~&L zE?ydwQ|I#j)SYjTupR_y?)9zNGqTB|vZB&Q$j{$e9Pd|aw$d)Y(F6zx%>dCPnc=;Ur#sggHfhB_pZ!2r+p zNlncB@&o_9mOp+K^T_Otf8;DnCbpTVxicRj`ecB>AoeEd+q-|-9vC$F z!uM}*>))Aw2e|&tybGEcK+OLEcl}+$@9?(2CD4FozrSw(XYu2I0K5Gz@ONO?-vWhE z{}lK;Ozd|7zn8ZE7SIJM%lt8>|6l0-o%Qz;&fl!4M86N_?}E Date: Thu, 27 Apr 2017 11:48:55 -0400 Subject: [PATCH 6/6] Remove python-pptx from requirements --- requirements.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 666493b..2669509 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,5 +3,3 @@ pandas==0.18.0 scikit-learn==0.17.1 scipy==0.16.0 xlrd==1.0.0 - -git+ssh://git@github.com/Blocp/python-pptx.git -- GitLab