Если попробовать скриптом получить все посты с сайта и забыть поставить выход из цикла, то хостер заблокирует ip. Век живи- век учись )))
Метка: python
Функция расчета 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() # переход к следующему письму
Перевод категориальных признаков датафрейма в бинарные
1 |
test_df |
номер | город | колич. признак | |
---|---|---|---|
0 | 2 | москва | 1 |
1 | 3 | питер | 2 |
2 | 4 | саратов | 3 |
3 | 5 | москва | 4 |
4 | 6 | питер | 3 |
5 | 7 | москва | 4 |
6 | 8 | сыктывкар | 5 |
7 | 9 | саратов | 6 |
1 2 |
df_nonbinary = pd.get_dummies(test_df['город'], ) df_nonbinary |
москва | питер | саратов | сыктывкар | |
---|---|---|---|---|
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 |
1 2 |
new_df = pd.concat([test_df, df_nonbinary], axis=1 ) new_df |
номер | город | колич. признак | москва | питер | саратов | сыктывкар | |
---|---|---|---|---|---|---|---|
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)
Функция превращает количество секунд в удобночитаемые человеком значения времени.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
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)
Первый вариант: на основе словаря, более быстрый вариант:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
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 |
Второй вариант, как пример того, как делать не надо ))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
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 |
Отличный справочник по Пайтону, САС, SQL
На английском языке.
Пример функции сортировки «пузырьком» (Python)
Сортировка «пузырьком» — простой способ сортировки списка.
Суть способа: последовательное сравнение каждого элемента с последующими и взаимная смена позиций в случае, если первый элемент больше сравниваемого.
Название отражает «всплытие» бОльших элементов в конец списка.
О формате сохранения данных HDF
Долгое время лелеял себя надеждой, что смогу построить эффективную базу данных в формате HDF. А что? Очень быстрая, прекрасно интегрируется с pandas — что еще нужно, если основные операции завязаны на pandas?
Проблема в одном — при попытке вносить изменения в таблицы база начинает неконтролируемо расти. Даже при повторном сохранении одногиговой базы, в которую не было добавлено ни одной строчки, файл, ничтоже сумняшеся, прибавляет в весе 150-200 мегабайт. Облазил документацию и стаковерфлоу в поисках правильного рецепта приготовления HDF, но не преуспел.
И только недавно наткнулся на дельный совет — не старайтесь использовать hdf как базу данных. Этот формат отлично приспособлен для быстрого сохранения большого датафрейма и быстрого же его чтения, но апдейт — не про него.
Плюнул я на все эти свои эксперименты и вернулся к старому доброму SQL.