Функция расчета 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() # переход к следующему письму

Перевод категориальных признаков датафрейма в бинарные

номер город колич. признак
0 2 москва 1
1 3 питер 2
2 4 саратов 3
3 5 москва 4
4 6 питер 3
5 7 москва 4
6 8 сыктывкар 5
7 9 саратов 6

москва питер саратов сыктывкар
0 1.0 0.0 0.0 0.0
1 0.0 1.0 0.0 0.0
2 0.0 0.0 1.0 0.0
3 1.0 0.0 0.0 0.0
4 0.0 1.0 0.0 0.0
5 1.0 0.0 0.0 0.0
6 0.0 0.0 0.0 1.0
7 0.0 0.0 1.0 0.0

номер город колич. признак москва питер саратов сыктывкар
0 2 москва 1 1.0 0.0 0.0 0.0
1 3 питер 2 0.0 1.0 0.0 0.0
2 4 саратов 3 0.0 0.0 1.0 0.0
3 5 москва 4 1.0 0.0 0.0 0.0
4 6 питер 3 0.0 1.0 0.0 0.0
5 7 москва 4 1.0 0.0 0.0 0.0
6 8 сыктывкар 5 0.0 0.0 0.0 1.0
7 9 саратов 6 0.0 0.0 1.0 0.0

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

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

 

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

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

 

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

 

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

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

def bubble_sort(lst):
    for i in range(0, len(lst)-1):
        for i in range(0, len(lst)-1):
            if lst[i] < lst[i+1]:
                pass
            else:
                lst[i], lst[i+1] =  lst[i+1],lst[i]
    return lst

lst = [2,8,4,6,-88,9,0,1,5,8,0,9,8,-190]
bubble_sort(lst)

>>> [-190, -88, 0, 0, 1, 2, 4, 5, 6, 8, 8, 8, 9, 9]
Сортировка пузырьком

О формате сохранения данных HDF

pandas hdfstore

Долгое время лелеял себя надеждой, что смогу построить  эффективную базу данных в формате  HDF. А что?  Очень быстрая, прекрасно интегрируется с pandas — что еще нужно, если основные операции завязаны на pandas?

Проблема в одном — при попытке вносить изменения  в таблицы база начинает неконтролируемо расти. Даже при повторном сохранении одногиговой базы,  в которую не было добавлено ни одной строчки, файл, ничтоже сумняшеся, прибавляет в весе 150-200 мегабайт.  Облазил документацию и стаковерфлоу в поисках правильного рецепта приготовления HDF, но не преуспел.

И только недавно наткнулся на дельный совет — не старайтесь использовать hdf как базу данных. Этот формат отлично приспособлен для быстрого сохранения большого датафрейма и быстрого же его чтения, но  апдейт — не про него.

Плюнул я на все эти свои эксперименты и вернулся к старому доброму SQL.