Ф-я получения данных о состоянии системы

import psutil
import datetime
import platform


def get_system_info():

    result = {}

    # ОС
    os_platform = platform.system()
    # Процессор
    processor = platform.processor()
    result.update({'platform': os_platform, 'processor': processor})
    # диски
    disks = psutil.disk_partitions()
    for i in disks:
        try:
            disk_usage = psutil.disk_usage(i.device)
            total = int(disk_usage .total) / 1048576
            used = int(disk_usage .used) / 1048576
            free = int(disk_usage .free) / 1048576
            percent = float(disk_usage .percent)
            disk_dict = {'total_space': total, 'used_space': used, 'free_space': free, 'free_percent': percent}
            result.update({'disk_space': disk_dict})

        except:
            pass

    # загрузка процессора
    cpu_percent = psutil.cpu_percent()
    result.update({'cpu_percent': cpu_percent})

    # аптайм
    boot_time = psutil.boot_time()
    uptime = datetime.datetime.now().timestamp() - boot_time
    result.update({'uptime': uptime})

    # оперативка:
    mem_status = psutil.virtual_memory()
    m_total = int(mem_status.total) / 1048576
    m_available = int(mem_status.available) / 1048576
    m_used = int(mem_status.used) / 1048576
    m_free = int(mem_status.free) / 1048576
    m_percent = float(mem_status.percent)
    memory_dict = {'total_mem': m_total, 'available_mem': m_available, 'used_mem': m_used,
                   'free_mem': m_free, 'free_percent_mem': m_percent}
    result.update({'memory_space': memory_dict})

    # температура процессора:
    try:
        # ToDo скорее всего надо прописать итератор для перечня  датчиков
        proc_temp = float(psutil.sensors_temperatures().current)
    except:
        proc_temp = None

    result.update({'proc_temp': proc_temp})

    return result


if __name__ == "__main__":
    res = get_system_info()
    for i in res.keys():
        print(i, res[i])

Источники:

Читать далее

Функция расчета TWR (time weighted return)

def twr_eavaluate(df):
    
    """Ф-я рассчитывает time weighted return  по данным датафрейма ['AUM_DATE', 'POSITION_VALUE','NET_INPUT']

     AUM_DATE - колонка с датами
     POSITION_VALUE - оценочная  стоимость портфеля на дату
     NET_INPUT - вводы-выводы средств на дату (ввод - вывод)"""

    df.sort_values(by='AUM_DATE', inplace=True)

    # порфтель на  день-1
    prev_portf = [0] + df['POSITION_VALUE'].tolist()[:-1]
    df['prev_portf'] = prev_portf

    df['delta_for_twr'] = (df['POSITION_VALUE'] - df['NET_INPUT']) / df['prev_portf']

    # замена пропусков
    df = df.replace([np.inf, -np.inf], np.nan)
    df.dropna(axis=0, subset=['delta_for_twr'], inplace=True)
    twr = df['delta_for_twr'].prod() - 1
    return twr

Простая функция расчета TWR (time-weighted return) для определения эффективности вложений с учетом вводов и выводов средств

Функция поиска ISIN в строке

Википедия:

Международный идентификационный код ценной бумаги (англ. International Securities Identification Number, общепринятое сокращение — ISIN) — 12-разрядный буквенно-цифровой код, однозначно идентифицирующий ценную бумагу.

import re


def look_for_isins(string):

    ''' Возвращает список ISIN из переданной строки'''

    isins = []
    isin_pattern = '[A-Z]{2}\w{9}\d{1}'
    f = re.findall(isin_pattern, string)
    for i in f:
        isins.append(i)
    return isins

Парсинг писем из Outlook в Python

Python-cкрипт разбора писем из папки "Входящие" Outlook. Сохранение письма как html-страницы с сохранением отображения вложенных картинок

import win32com.client
import os
import datetime
import re

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6).Items  # 6- папка Входящие Outlook
msg = inbox.GetLast() # последнее письмо в ящике

path  = r'C:\Users\user\Documents' # папка для сохранения вложений письма

while msg :
    subject = str(msg.Subject) # тема письма
    msg_date = datetime.datetime.strptime(str(msg.SentOn)[0:19], '%Y-%m-%d %H:%M:%S')
    to_list = str(msg.To).split(';') # список получателей
    sender = msg.SenderName # отправитель
    text = str(msg.Body) # текст письма
    html_text = str(msg.HTMLBody) # html код письма
    
    # сохранение вложений
    att_list=[]
    for att in msg.Attachments:
        att_name = att.FileName
        att.SaveAsFile(path + '\\' + att_name) # сохранение файла вложения
        att_list.append(att_name)  
    
    # корректировка html-кода для отражения вложенных картинок (замена адреса картинок на локальный вариант)
    if att_list:
        for fname in att_list:
            # паттерн ссылки на вставленное изображение
            pattern = '\"cid:' + fname  + '@[\w]{,20}.[\w]{,20}\"'
            html_text = re.sub(pattern, '\"' + fname + '\"', html_text, count=5)
    
    # создание  html-страницы с телом письма
    with open(path + '\\' + 'index_.html', 'w', encoding='utf8') as file:
        file.write(html_text)
    
    msg = inbox.GetPrevious() # переход к следующему письму

Функция конвертации секунд в более крупные периоды времени (Python)

Заметка

Функция  превращает количество секунд в удобночитаемые человеком  значения времени.

def seconds_to_str(uptime):
    """
       Функция принимает числовое значение секунд и возвращает строку в формате:
       '3 нед., 1 дн., 18 час., 23 мин., 3 сек.'
       Доли секунды округляются до секунд.
    """

    seconds = ''
    minutes = ''
    hours = ''
    days = ''
    weeks = ''
    uptime = round(uptime, 0)

    if uptime >= 60:
        minutes = uptime // 60
        if minutes >= 60:
            hours = minutes // 60
            if hours >= 24:
                days = hours // 24
                if days >= 7:
                    weeks = days // 7
                    seconds, minutes, hours, days, weeks = str(int(uptime % 60)), str(int(minutes % 60)), str(
                        int(hours % 24)), str(int(days % 7)), str(int(weeks))
                else:
                    seconds, minutes, hours, days = str(int(uptime % 60)), str(int(minutes % 60)), str(
                        int(hours % 24)), str(int(days))
            else:
                seconds, minutes, hours = str(int(uptime % 60)), str(int(minutes % 60)), str(int(hours))
        else:
            seconds, minutes = str(int(uptime % 60)), str(int(minutes))
    else:
        seconds = str(int(uptime // 1))

    if weeks:
        weeks = weeks + ' нед.,'
    if days:
        days = days + ' дн.,'
    if hours:
        hours = hours + ' час.,'
    if minutes:
        minutes = minutes + ' мин.,'
    if seconds:
        seconds = seconds + ' сек.'
    res = weeks + ' ' + days + ' ' + hours + ' ' + minutes + ' ' + seconds
    print(res.strip())
    return res.strip()

 

Функция определения времени суток (Python)

Заметка

Первый вариант: на основе словаря, более быстрый вариант:

import datetime
import time

def time_of_day_dict(dt=None, ts=None, tod_dict=None):
    '''
    Принимает объект datetime (dt) или timestamp (ts), и словарь tod_dict {час : наименование времени}
    Возвращает строку c временем суток. 
    При отсутствии аргументов - возвращает строку с текущим временем суток.

        Словарь по умолчанию: 
        {0: 'ночь', 1: 'ночь', 2: 'ночь',
         3: 'раннее утро', 4: 'раннее утро', 5: 'раннее утро',
         6: 'утро', 7: 'утро', 8: 'утро',
         9: 'первая половина дня', 10: 'первая половина дня', 11: 'первая половина дня',
         12: 'обед', 13: 'обед', 14: 'обед',
         15: 'после обеда', 16: 'после обеда', 17: 'после обеда',
         18: 'вечер', 19: 'вечер', 20: 'вечер',
         21: 'поздний вечер', 22: 'поздний вечер', 23: 'поздний вечер' }

    Eсли час не отражен в словаре, возвращает None
    Требует import datetime
    N.B. ф-я в 2-3 раза быстрее, чем ф-я time_of_day()
    '''

    # определение словаря
    if tod_dict:
        pass
    else:
        tod_dict = {0: 'ночь', 1: 'ночь', 2: 'ночь',
                    3: 'раннее утро', 4: 'раннее утро', 5: 'раннее утро',
                    6: 'утро', 7: 'утро', 8: 'утро',
                    9: 'первая половина дня', 10: 'первая половина дня', 11: 'первая половина дня',
                    12: 'обед', 13: 'обед', 14: 'обед',
                    15: 'после обеда', 16: 'после обеда', 17: 'после обеда',
                    18: 'вечер', 19: 'вечер', 20: 'вечер',
                    21: 'поздний вечер', 22: 'поздний вечер', 23: 'поздний вечер'}

    # определение оцениваемого времени
    if dt:
        if isinstance(dt, datetime.datetime):
            dt = dt
        else:
            print('некорректный формат dt: %s \n требуется объект datetime.datetime' % (type(dt)))
            return None
    elif ts:
        if isinstance(ts, (int, float)):
            if ts > 0:
                dt = datetime.datetime.fromtimestamp(ts)
                print(dt.ctime())
            else:
                print('отрицательное значение ts недопустимо')
                return None
        else:
            print('некорректный формат ts: %s \n требуется значение int или float' % (type(ts)))
            return None
    else:
        dt = datetime.datetime.now()
    h = dt.hour

    # подбор
    if h in tod_dict:
        tod = tod_dict[h]
        return tod
    else:
        print('Значение времени отсутствует в словаре')
        return None

 

Второй вариант, как пример того, как делать не надо ))

def time_of_day(dt=None, ts=None, tod_dict=None):
    '''
    Принимает объект datetime (dt) или timestamp (ts), и словарь tod_dict 
    {наименование времени : час окончания(включительно)}

    Возвращает строку c временем суток 
    При отсутствии аргументов - возвращает строку с текущим временем суток.

        Словарь по умолчанию: 
        {'ночь' : 3, 'раннее утро' : 6, 'утро' : 9, 'первая половина дня' : 12,
         'обед' : 15, 'после обеда' : 18, 'вечер' : 21, 'поздний вечер' : 24, }

    Если час не отражен в словаре, возвращает None
    Требует import datetime
    '''

    # определение словаря
    if tod_dict:
        pass
    else:
        tod_dict = {'ночь': 3, 'раннее утро': 6, 'утро': 9, 'первая половина дня': 12,
                    'обед': 15, 'после обеда': 18, 'вечер': 21, 'поздний вечер': 24, }
    sorted_tod = sorted(tod_dict.items(), key=lambda x: x[1], reverse=False)
    # print(sorted_tod)

    # определение оцениваемого времени
    if dt:
        if isinstance(dt, datetime.datetime):
            dt = dt
        else:
            print('некорректный формат dt: %s \n требуется объект datetime.datetime' % (type(dt)))
            return None
    elif ts:
        if isinstance(ts, (int, float)):
            if ts > 0:
                dt = datetime.datetime.fromtimestamp(ts)
                print(dt.ctime())
            else:
                print('отрицательное значение ts недопустимо')
                return None

        else:
            print('некорректный формат ts: %s \n требуется значение int или float' % (type(ts)))
            return None
    else:
        dt = datetime.datetime.now()
    h = dt.hour

    # подбор
    for time in sorted_tod:
        if h <= time[1]:
            tod = time[0]
            return tod
    print('Значение времени отсутствует в словаре')
    return None

 

Пример функции сортировки “пузырьком” (Python)

Сортировка "пузырьком" - простой способ сортировки списка.
Суть способа: последовательное сравнение каждого элемента с последующими и взаимная смена позиций в случае, если первый элемент больше сравниваемого.
Название отражает "всплытие" бОльших элементов в конец списка.

[pastacode lang="markup" manual="def%20bubble_sort(lst)%3A%0A%20%20%20%20for%20i%20in%20range(0%2C%20len(lst)-1)%3A%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(0%2C%20len(lst)-1)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20lst%5Bi%5D%20%3C%20lst%5Bi%2B1%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pass%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lst%5Bi%5D%2C%20lst%5Bi%2B1%5D%20%3D%20%20lst%5Bi%2B1%5D%2Clst%5Bi%5D%0A%20%20%20%20return%20lst%0A%0Alst%20%3D%20%5B2%2C8%2C4%2C6%2C-88%2C9%2C0%2C1%2C5%2C8%2C0%2C9%2C8%2C-190%5D%0Abubble_sort(lst)%0A%0A%3E%3E%3E%20%5B-190%2C%20-88%2C%200%2C%200%2C%201%2C%202%2C%204%2C%205%2C%206%2C%208%2C%208%2C%208%2C%209%2C%209%5D" message="Сортировка пузырьком" highlight="" provider="manual"/]