def add_to_pdf(startdate, enddate): """ :param startdate: string :param enddate: string :return: string, pdf path / string, filename """ images_directory = get_config('images_path') pdf_directory = get_config('pdf_path') # pdf file structure pdf.add_page() pdf.set_font('Arial', 'B', 16) pdf.cell(40, 10, 'Weekly ECG report {} - {}'.format(startdate, enddate)) pdf.set_font('Arial', '', 12) filelist = os.listdir(images_directory) for filename in sorted(filelist): filename = str(filename) length = len(filename) pdf.ln(10) pdf.cell(40, 10, filename[1:length - 4]) pdf.ln(10) pdf.image(images_directory + '/' + filename, None, None, 200, 100) filename = 'Weekly_ECG_Report_{}_{}.pdf'.format(startdate, enddate) full_path = pdf_directory + '/' + filename pdf.output(full_path, 'F') return full_path, filename add_to_log('PDF file was created')
def visualise_part(filename, df, begin, end): """ :param filename: str, filename to save the plot :param df: dataframe, input dataframe from pandas sql read :param begin: int, filter begin :param end: int, filter end :return: None """ full_path = path + '/' + filename ax = plt.gca() # filter dataframe df = df[(df['rn'] >= begin) & (df['rn'] <= end)] # set elements df.plot(kind='line', x='rn', y='signal', ax=ax) figure = plt.gcf() # set to 1500 x 800 and save it figure.set_size_inches(15, 8) plt.savefig(full_path) # clears figure to separate plots plt.clf() add_to_log('Partial plot saved at {}'.format(full_path))
def clear_images_directory(): images_directory = get_config('images_path') for filename in os.listdir(images_directory): os.remove(images_directory + '/' + filename) add_to_log('Images directory been cleared')
def process(): try: today = date.today() # Get Ecg data for last 7 days for day in range(number_of_days): act_day = today - timedelta(days=day) sql = """ select rn, measurement, signal from ( select row_number() over(partition by get_body_heartget_id order by heartgetsignal_id asc) as rn, dense_rank() over(partition by get_body_heartget_id order by 1) as filtr, get_body_heartget_id as measurement, signal from withings.heartgetsignal where date(created_at) = '{}' order by heartgetsignal_id ) sub where filtr = 1; """.format(act_day) df = execute_sql(sql.strip()) # get signals from dataframe signals = df.loc[:, "signal"] # change dataframe data to numpy_array for biosppy lib numpy_array = signals.to_numpy() str_act_day = str(act_day) str_day = str(day) # Visualize Ecg data if df.empty: pass else: visualise_part(str_day + 'heart_signal_first_half_' + str_act_day, df, 0, 4500) visualise_part(str_day + 'heart_signal_second_half_' + str_act_day, df, 4500, 10000) visualise_all(str_day + 'heart_signal_summary_' + str_act_day + ".png", numpy_array) # Add to pdf and get back the path pdf_path, filename = add_to_pdf(str(today - timedelta(number_of_days)), str(today)) # Finally send report send_mail( from_address, to_address, subject, filename, pdf_path, password ) except Exception as e: pass add_to_log('Error occurred: ' + str(e)) finally: clear_images_directory()
def visualise_all(filename, nparray): """ :param filename: str, filename to save the plot :param nparray: nparray, input numpy array what biosppy lib use :return: None """ # load raw ECG signal signal = nparray # process it and save the plot (changed function in source lib) full_path = path + '/' + filename ecg.ecg(signal=signal, sampling_rate=300., show=False, path=full_path) add_to_log('Complex plot saved at {}'.format(full_path))
def main(): add_to_log('Process started') print('started') process() print('finished') add_to_log('Process ended') add_to_log('====================================================================')
def send_mail(fromaddr, toaddr, subject, filename, file_path, password): """ :param fromaddr: string :param toaddr: string :param subject: string :param filename: string :param file_path: string :param password: string :return: None """ # instance of MIMEMultipart msg = MIMEMultipart() # storing the senders email address msg['From'] = fromaddr # storing the receivers email address msg['To'] = toaddr # storing the subject msg['Subject'] = subject # string to store the body of the mail body = "Szia! Küldöm az aktuális heti kimutatást." # attach the body with the msg instance msg.attach(MIMEText(body, 'plain')) # open the file to be sent filename = filename attachment = open(file_path, "rb") # instance of MIMEBase and named as p p = MIMEBase('application', 'octet-stream') # To change the payload into encoded form p.set_payload((attachment).read()) # encode into base64 encoders.encode_base64(p) p.add_header('Content-Disposition', "attachment; filename= %s" % filename) # attach the instance 'p' to instance 'msg' msg.attach(p) # creates SMTP session s = smtplib.SMTP('smtp.gmail.com', 587) # start TLS for security s.starttls() # Authentication s.login(fromaddr, password) # Converts the Multipart msg into a string text = msg.as_string() # sending the mail s.sendmail(fromaddr, toaddr, text) # terminating the session s.quit() add_to_log('Email sent successfully')