Программа "Депозиты"

Данная программа хранит информацию по открытым депозитам в разных банках в списке. Каждый элемент этого списка (вложенный список) - это информация по одному вкладу. Элемент включает название банка (по ключу из словаря, содержащего названия), дату открытия и закрытия вклада, сумму вклада и процентную ставку. Таким образом, список вкладов организован по типу таблицы базы данных.

Даты хранятся в специальном формате (класс datetime.date модуля datetime). С объектами этого класса можно выполнять "арифметические" операции. Это используется при нахождении количества дней вклада.

Программа осуществляет табличный вывод данных в двух "формах": сначала отсортировав по банкам, а затем по дате закрытия (по возрастанию). По первому выводу можно сделать вывод, в каком банке сколько вкладов, общая сумма вкладов в каждом банке и др. По второму выводу сразу видно, время каких вкладов истекает в ближайшее время, доход по каждому вкладу и др.

Перед вторым выводом список вкладов сортируется с помощью функции sort(). Эта функция может принимать необязательный параметр по ключевому слову key. В нем можно указать функцию, которой передается очередной элемент списка. В данном случае указанная функция возвращает третий элемент вложенного списка. Т. е. ей передается вложенный список, а она возвращает только его третий элемент. Таким образом, реализуется возможность сортировки не только по первому элементу вложенного списка, а по любому. В программе вместо обычной функции используется lambda-функция. При использовании обычной код был бы таким:

def forsort(n):
    return n[2]
d.sort(key=forsort)

Выражение str(j[2]-j[1]).split()[0] означает, что

  1. сначала находится количество дней между двумя датами: j[2]-j[1];
  2. поскольку разность дат имеет специальный формат, включающий дни и время, то сначала осуществляется перевод в строку;
  3. затем с помощью метода split() строка превращается в список, разделение происходит по пробелу;
  4. после этого берется первый элемент списка, который и является числом дней.

Выражение int(str(i[2]-i[1]).split()[0]) отличается только тем, что полученное число дней переводится в тип данных int, т. к. в полученном списке все элементы - строки.

Во втором выводе доходность вычисляется по формуле простых процентов. В этой формуле в числителе находится произведение суммы, процентов депозита и количества его дней, а в знаменателе произведение количества дней в текущем году на 100. В данной программе количество дней берется равным 365.

В первом выводе вычисление доходности исключительно ориентировочное. Берется средний процент и из расчета, что все депозиты положены на год, вычисляется доход.

# программа хранит и выводит данные по депозитам в банках
 
import datetime
 
b = {1: 'XXX', 2: 'У100', 3: 'ZOO'} # индексы и названия банков
 
#    [ индекс_банка, открытие_вклада, закрытие, сумма, процент ]
d = [[1,datetime.date(2015,3,6),datetime.date(2016,3,5),45000,10.7], 
     [1,datetime.date(2015,6,25),datetime.date(2016,6,24),15000,9.5],
     [2,datetime.date(2015,7,30),datetime.date(2016,8,16),50000,10.35],
     [2,datetime.date(2015,4,21),datetime.date(2015,10,18),100000,11.95],
     [2,datetime.date(2015,3,13),datetime.date(2015,9,9),20000,13.25],
     [3,datetime.date(2015,4,11),datetime.date(2015,10,7),100000,14],
     [3,datetime.date(2015,1,24),datetime.date(2016,1,19),45000,17],
     [3,datetime.date(2015,3,28),datetime.date(2016,3,22),30000,15]]
 
# Вывод по банкам
print("%12s%15s%12s%8s (%s)" % ('открытие','закрытие','сумма','процент','дни'))
t = 0 # общая сумма по всем вкладам
p = 0 # общая сумма процентов
for i in b:
    print(b[i])
    s = 0 # сумма по вкладам одного банка
    for j in d:
        if i == j[0]: # ищем все вклады одного банка
            # инфо по вкладу: открытие, закрытие, сумма, процент, количество дней
            print("%12s%15s%12d%8.2f (%s)" % (j[1],j[2],j[3],j[4],str(j[2]-j[1]).split()[0]))
            s += j[3]
            p += j[4]
    print('%33s%d' % ('sum: ',s))
    t += s
# вывод: общая сумма, средний процент, ориентировочный доход если бы все вклады были годовые
print('total:',t,' av.%:', p/len(d), ' ap.income:', t*(p/len(d)/100), end='\n\n')    
 
# Сортировка по дате закрытия
print('ПО ДАТЕ ЗАКРЫТИЯ:')
print("%22s%5s%12s%8s%9s" % ('закрытие','дни','сумма','процент','доход'))
d.sort(key=lambda n: n[2]) # сортируем список вкладов по третьему полю (дате закрытия)
t = 0 # суммарный доход
for i in d:
    days = int(str(i[2]-i[1]).split()[0]) # количество дней вклада
    inc = (i[3] * i[4] * days) / (365 * 100) # доход по вкладу по формуле простых процентов
    # вывод: банк, дата закрытия, кол-во дней, суммк, процент, доход
    print("%7s%15s%5d%12d%8.2f%9.0f" % (b[i[0]],i[2],days,i[3],i[4],inc))
    t += inc
print("real income: %.0f" % t)

Вывод программы:

    открытие       закрытие       сумма процент (дни)
XXX
  2015-03-06     2016-03-05       45000   10.70 (365)
  2015-06-25     2016-06-24       15000    9.50 (365)
                            sum: 60000
У100
  2015-07-30     2016-08-16       50000   10.35 (383)
  2015-04-21     2015-10-18      100000   11.95 (180)
  2015-03-13     2015-09-09       20000   13.25 (180)
                            sum: 170000
ZOO
  2015-04-11     2015-10-07      100000   14.00 (179)
  2015-01-24     2016-01-19       45000   17.00 (360)
  2015-03-28     2016-03-22       30000   15.00 (360)
                            sum: 175000
total: 405000  av.%: 12.71875  ap.income: 51510.9375
 
ПО ДАТЕ ЗАКРЫТИЯ:
              закрытие  дни       сумма процент    доход
   У100     2015-09-09  180       20000   13.25     1307
    ZOO     2015-10-07  179      100000   14.00     6866
   У100     2015-10-18  180      100000   11.95     5893
    ZOO     2016-01-19  360       45000   17.00     7545
    XXX     2016-03-05  365       45000   10.70     4815
    ZOO     2016-03-22  360       30000   15.00     4438
    XXX     2016-06-24  365       15000    9.50     1425
   У100     2016-08-16  383       50000   10.35     5430
real income: 37720