Programming
3.blockc_view
import polars as pl
import pandas as pd
import numpy as np
import pyarrow as pa
import pyarrow.parquet as pq
import io
import getpass,oracledb,os,json,datetime
import os
import datetime
from . import forms
from . import queries
from functions import common_functions
from django.shortcuts import render, redirect
from django.contrib import messages
from django.http import HttpResponse
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
balans_svod_folder = BASE_DIR / "datasets" / "balans" / "svod"
def risk_home(request):
if request.method == 'POST':
form = forms.DateInputForm(request.POST)
if form.is_valid():
selected_date = form.cleaned_data['selected_date']
date_str = str(selected_date)
request.session[f"balans_date_str_{request.user.id}"] = date_str
balans_filepath_svod = f"{balans_svod_folder}/svod_{date_str}.parquet"
if os.path.exists(balans_filepath_svod):
request.session[f"balans_filepath_svod_{request.user.id}"] = balans_filepath_svod
print("balans exist")
messages.success(request, "Data is already processed, you can see results!")
return redirect('risk-result')
else:
return redirect('risk-get')
else:
form = forms.DateInputForm()
return render(request, 'risk/home.html', {'form':form})
def risk_get_data(request):
os.makedirs(balans_svod_folder, exist_ok = True)
conn = None
pq_writer = None
file_written = False
balans_date_str = request.session.get(f"balans_date_str_{request.user.id}")
if balans_date_str:
try:
selected_date = datetime.datetime.strptime(balans_date_str, '%Y-%m-%d').date()
except ValueError:
messages.warning(request, "The date selected did not meet requirements")
return redirect('risk-home')
else:
messages.warning(request, "No date found in this session")
return redirect('risk-home')
try:
print('Connecting')
conn = common_functions.get_oracle_connection()
print('executing query')
batch_generator = conn.fetch_df_batches(queries.balans_script,
parameters = {'pdate':selected_date}, size = 1000)
for odf in batch_generator:
arrow_table = pa.table(odf)
if pq_writer is None and arrow_table.num_rows == 0:
break
if pq_writer is None:
pq_writer = pq.ParquetWriter(balans_filepath_svod, arrow_table.schema)
pq_writer.write_table(arrow_table)
file_written = True
print(f"Wrote batch of {arrow_table.num_rows} rows directly to disk")
except Exception as e:
import traceback
traceback.print_exc()
print('Error happened on Balans query:', e)
messages.error(request, f"Database or extraction error occured: {e}")
return redirect('risk-home')
finally:
if pq_writer:
pq_writer.close()
if conn:
conn.close()
if not file_written:
messages.warning(request, 'The data could not be fetched since it is not available yet')
return redirect('risk-home')
return redirect('risk-result')
def risk_result(request):
selected_date = request.session.get(f"balans_date_str_{request.user.id}")
balans_filepath_svod = request.session.get(f"balans_filepath_svod_{request.user.id}")
print("This is1",balans_filepath_svod)
print("This isdate",selected_date)
if selected_date is None and balans_filepath_svod is None:
selected_date = common_functions.find_recent_date()
balans_date_str = str(selected_date)
request.session[f"balans_date_str_{request.user.id}"] = balans_date_str
balans_filepath_svod = f"{balans_svod_folder}/svod_{balans_date_str}.parquet"
print(balans_filepath_svod)
request.session[f"balans_filepath_svod_{request.user.id}"] = balans_filepath_svod
elif balans_filepath_svod is None:
balans_date_str = str(selected_date)
request.session[f"balans_date_str_{request.user.id}"] = balans_date_str
balans_filepath_svod = f"{balans_svod_folder}/svod_{balans_date_str}.parquet"
print(balans_filepath_svod)
request.session[f"balans_filepath_svod_{request.user.id}"] = balans_filepath_svod
balans_date_str = str(selected_date)
if os.path.exists(balans_filepath_svod):
try:
df = pd.read_parquet(balans_filepath_svod)
if df.empty:
messages.warning(request, f"Df is empty")
return redirect('risk-home')
except Exception as e:
messages.warning(request, f"Can't read the df {e}")
return redirect('risk-home')
context = {'balans_date_str':balans_date_str}
return render(request, 'risk/result.html', context = context)
def risk_blockc_home(request):
selected_date = request.session.get(f"balans_date_str_{request.user.id}")
balans_filepath_svod = request.session.get(f"balans_filepath_svod_{request.user.id}")
if os.path.exists(balans_filepath_svod):
try:
df = pd.read_parquet(balans_filepath_svod)
if df.empty:
messages.warning(request, f"Df is empty")
return redirect('risk-home')
except Exception as e:
messages.warning(request, f"Can't read the df {e}")
return redirect('risk-home')
df.columns = ['arcdate', 'account', 'amount']
print(df.head())
table_data = [
# --- SECTION I: I ДАРАЖАЛИ КАПИТАЛ ---
{"no": "", "name": "I ДАРАЖАЛИ КАПИТАЛ", "value": "", "is_header": True, "level": 0, "formula": ""},
{"no": "1", "name": "I ДАРАЖАЛИ АСОСИЙ КАПИТАЛ", "value": "", "is_header": True, "level": 1},
{"no": "1.1.", "name": "Оддий акциялар, нетто", "value": df[df['account']=='30312']['amount'].sum()+df[df['account']=='30318']['amount'].sum(), "is_header": False, "level": 3, "formula": "1.1 = a - б"},
{"no": "a", "name": "Тўлиқ тўланган оддий акциялар", "value": 502385173, "is_header": False, "level": 4},
{"no": "б", "name": "Минус: Қайта сотиб олинган оддий акциялар", "value": "", "is_header": False, "level": 4},
{"no": "1.2.", "name": "Қўшимча капитал (оддий)", "value": 349727222, "is_header": False, "level": 3},
{"no": "1.3.", "name": "Тақсимланмаган фойда (зарар), шу жумладан капитал захиралар", "value": 6163146509, "is_header": False, "level": 3},
{"no": "a", "name": "Капитал ва бошқа захиралар", "value": 4199167083, "is_header": False, "level": 4},
{"no": "б", "name": "Тақсимланмаган фойда", "value": 1963979426, "is_header": False, "level": 4},
{"no": "в", "name": "Ўтган даврлар (йиллар) учун зарарлар", "value": "", "is_header": False, "level": 4},
{"no": "г", "name": "Жорий йил учун зарар", "value": "", "is_header": False, "level": 4},
{"no": "1.4.", "name": "Банкнинг консолидациялашган I даражали асосий капитал элементлари", "value": "", "is_header": False, "level": 3},
{"no": "1.5.", "name": "Чегирмалар ҳисоблангунга қадар жами I даражали асосий капитал", "value": 7015258904, "is_header": False, "level": 3},
{"no": "1.6.", "name": "I даражали асосий капиталдан чегирмалар", "value": 23061469, "is_header": False, "level": 3},
{"no": "a", "name": "Гудвилл ҳамда банкнинг бошқа номоддий активлари", "value": "", "is_header": False, "level": 4},
{"no": "б", "name": "Муддати узайтирилган солиқ талаблари", "value": 23061469, "is_header": False, "level": 4},
{"no": "в", "name": "Пул оқимларини хеджирлаш натижасида ҳосил бўлган фойда ёки зарар", "value": "", "is_header": False, "level": 4},
{"no": "г", "name": "Активларни секьюритизация қилиш натижасида олинадиган фойда", "value": "", "is_header": False, "level": 4},
{"no": "д", "name": "Банкнинг ўз оддий акцияларига тўғридан-тўғри ёки билвосита инвестициялари", "value": "", "is_header": False, "level": 4},
{"no": "е", "name": "Банк ва бошқа банк ўзаро акцияларига инвестициялари", "value": "", "is_header": False, "level": 4},
{"no": "ж", "name": "Консолидациялашмаган молиявий бўлмаган битта ташкилотга инвестициялар банк 1ДАК 15% ошган қисми", "value": "", "is_header": False, "level": 4},
{"no": "з", "name": "Консолидациялашмаган молиявий бўлмаган ташкилотларга жами инвестицияларнинг банк 1ДАК 50% ошган қисми", "value": "", "is_header": False, "level": 4},
{"no": "и", "name": "Консолидациялашмаган ва банкнинг улуши сезиларли бўлмаган (≤10%) молиявий ташкилотларга жами инвестицияларнинг банк 1ДАК 10 % ошган қисми", "value": "", "is_header": False, "level": 4},
{"no": "к", "name": "Консолидациялашмаган ва банкнинг улуши сезиларли бўлган (>10%) молиявий ташкилотларга жами инвестицияларнинг банк 1ДАК 10 % ошган қисми", "value": "", "is_header": False, "level": 4},
{"no": "л", "name": "Банк томонидан муаммоли активлар бўйича қўшимча шакллантирилиши лозим бўлган захиралар", "value": "", "is_header": False, "level": 4},
{"no": "I", "name": "I ДАРАЖАЛИ АСОСИЙ КАПИТАЛ", "value": 6992197435, "is_header": True, "level": 2},
# --- I ДАРАЖАЛИ ҚЎШИМЧА КАПИТАЛ ---
{"no": "2", "name": "I ДАРАЖАЛИ ҚЎШИМЧА КАПИТАЛ", "value": "", "is_header": True, "level": 2},
{"no": "2.1.", "name": "Имтиёзли акциялар", "value": 0, "is_header": False, "level": 3},
{"no": "a", "name": "Тўлиқ тўланган имтиёзли акциялар", "value": 0, "is_header": False, "level": 4},
{"no": "б", "name": "Минус: Қайта сотиб олинган имтиёзли акциялар", "value": 0, "is_header": False, "level": 4},
{"no": "2.2.", "name": "Қўшимча капитал (имтиёзли)", "value": 0, "is_header": False, "level": 3},
{"no": "2.3.", "name": "I даражали қўшимча капиталга киритилган капитал воситалари", "value": "", "is_header": False, "level": 3},
{"no": "2.4.", "name": "Банкнинг консолидациялашган I даражали қўшимча капитал элементлари", "value": "", "is_header": False, "level": 3},
{"no": "2.5.", "name": "Чегирмалар ҳисоблангунга қадар жами I даражали қўшимча капитал", "value": 0, "is_header": True, "level": 3},
{"no": "2.6.", "name": "I даражали қўшимча капиталдан чегирмалар", "value": "", "is_header": True, "level": 3},
{"no": "a", "name": "Банк ўзининг I даражали қўшимча капитал элементларига киритган инвестициялари", "value": "", "is_header": False, "level": 4},
{"no": "б", "name": "Банкнинг бошқа банкнинг I даражали қўшимча капиталига киритилган капитал элементларига инвестициялари", "value": "", "is_header": False, "level": 4},
{"no": "II", "name": "ЖАМИ I ДАРАЖАЛИ ҚЎШИМЧА КАПИТАЛ", "value": 0, "is_header": True, "level": 2},
{"no": "III", "name": "ЖАМИ ТЎҒРИЛАНГАН I ДАРАЖАЛИ КАПИТАЛ", "value": 6992197435, "is_header": True, "level": 2},
{"no": "3.1.", "name": "I даражали капиталга алоқадор қарз олувчилар бўйича меъёрларни ҳисобга олган ҳолдаги тузатиш", "value": 6992197435, "is_header": False, "level": 3},
{"no": "ЖАМИ I ДАРАЖАЛИ КАПИТАЛ", "name": "ЖАМИ I ДАРАЖАЛИ КАПИТАЛ", "value": 6992197435, "is_header": True, "level": 1},
# --- SECTION II: II ДАРАЖАЛИ КАПИТАЛ ---
{"no": "", "name": "II ДАРАЖАЛИ КАПИТАЛ", "value": "", "is_header": True, "level": 0, "formula": ""},
{"no": "4.1.", "name": "II даражали капиталга киритилган капитал воситалари", "value": "", "is_header": False, "level": 3},
{"no": "4.2.", "name": "Қўшимча капитал (II даражали капитал воситалари бўйича)", "value": "", "is_header": False, "level": 3},
{"no": "4.3.", "name": "Жорий йил соф фойдаси", "value": 0, "is_header": False, "level": 3},
{"no": "4.4.", "name": "Стандарт активларга яратилган захиралар", "value": 75250275, "is_header": False, "level": 3},
{"no": "4.5.", "name": "Банкнинг консолидациялашган II даражали капитал элементлари", "value": "", "is_header": False, "level": 3},
{"no": "4.6.", "name": "Субординар қарз", "value": 1187593020, "is_header": False, "level": 3},
{"no": "4.7.", "name": "Чегирмалар ҳисоблангунга қадар жами II даражали капитал", "value": 1262843295, "is_header": False, "level": 3},
{"no": "4.8.", "name": "II даражали капиталдан чегирмалар", "value": 0, "is_header": False, "level": 3},
{"no": "a", "name": "Банк ўзининг II даражали капитал элементларига киритган инвестициялари", "value": "", "is_header": False, "level": 4},
{"no": "б", "name": "Банкнинг бошқа банкнинг II даражали капиталига киритилган капитал элементларига инвестициялари", "value": "", "is_header": False, "level": 4},
{"no": "в", "name": "II даражали капиталнинг I даражали капиталдан ортиқча қисми (чегирмаси)", "value": 0, "is_header": False, "level": 4},
{"no": "IV", "name": "ЧЕГИРМАЛАРНИ ҲИСОБГА ОЛГАН ҲОЛДAГИ II ДАРАЖАЛИ КАПИТАЛ", "value": 1262843295, "is_header": True, "level": 2},
{"no": "V", "name": "ЖАМИ РЕГУЛЯТИВ КАПИТАЛ", "value": 8255040730, "is_header": True, "level": 1},
# --- SECTION VI: RISK-WEIGHTED ASSETS & RATIOS ---
{"no": "VI", "name": "ТАВАККАЛЧИЛИККА ТОРТИЛГАН АКТИВЛАР УМУМИЙ СУММАСИ", "value": 6020021997, "is_header": True, "level": 1},
{"no": "a", "name": "Баланс ва балансдан ташқари активларнинг таваккалчиликни ҳисобга олган ҳолдаги активларнинг умумий суммаси", "value": 0, "is_header": False, "level": 4},
{"no": "б", "name": "Операцион таваккалчилик", "value": 5564880468, "is_header": False, "level": 4},
{"no": "в", "name": "Бозор таваккалчилиги", "value": 455141529, "is_header": False, "level": 4},
# --- CAPITAL ADEQUACY RATIOS ---
{"no": "VII", "name": "I ДАРАЖАЛИ АСОСИЙ КАПИТАЛНИНГ МОНАДЛИК КОЭФФИЦИЕНТИ (Л/I)", "value": "116,15%", "is_header": True, "level": 2, "tags": ["ratio"]},
{"no": "VIII", "name": "I ДАРАЖАЛИ КАПИТАЛНИНГ МОНАДЛИК КОЭФФИЦИЕНТИ (Ш/I)", "value": "116,15%", "is_header": True, "level": 2, "tags": ["ratio"]},
{"no": "IX", "name": "РЕГУЛЯТИВ КАПИТАЛНИНГ МОНАДЛИК КОЭФФИЦИЕНТИ (У/I)", "value": "137,13%", "is_header": True, "level": 2, "tags": ["ratio"]},
# --- CAPITAL BUFFERS ---
{"no": "X", "name": "МИНИМАЛ КАПИТАЛ ТАЛАБЛАРИ (БУФЕРЛАРДАН ТАШҚАРИ)", "value": "", "is_header": True, "level": 2},
{"no": "a", "name": "I даражали асосий капиталнинг монадлик коэффициенти", "value": "4,50%", "is_header": False, "level": 4},
{"no": "б", "name": "I даражали капиталнинг монадлик коэффициенти", "value": "6,00%", "is_header": False, "level": 4},
{"no": "в", "name": "Регулятив капиталнинг монадлик коэффициенти", "value": "8,00%", "is_header": False, "level": 4},
{"no": "XI", "name": "ЖАМИ КАПИТАЛ БУФЕРЛАРИ", "value": "5,00%", "is_header": True, "level": 2},
{"no": "a", "name": "Консервацион капитал буфери коэффициенти", "value": "2,50%", "is_header": False, "level": 4},
{"no": "б", "name": "Тизимли аҳамиятга эга банклар учун капитал буфери коэффициенти", "value": "1,00%", "is_header": False, "level": 4},
{"no": "в", "name": "Контрциклик капитал буфери коэффициенти", "value": "1,50%", "is_header": False, "level": 4},
{"no": "XII", "name": "ЖАМИ КАПИТАЛ БУФЕРЛАРИГА ҚАДАР I ДАРАЖАЛИ АСОСИЙ КАПИТАЛ КОЭФФИЦИЕНТИ*", "value": "111,15%", "is_header": True, "level": 2, "tags": ["ratio"]},
{"no": "XIII", "name": "ЖАМИ КАПИТАЛ БУФЕРЛАРИ БЎЙИЧА ОРТИҚЧА (+) / ЕТИШМАГАН (-) СУММА", "value": "106,15%", "is_header": True, "level": 2},
# --- LEVERAGE ---
{"no": "XIV", "name": "Левераж ҳисоб-китоби учун активлар", "value": 0, "is_header": True, "level": 2},
{"no": "a", "name": "Жами активлар", "value": 0, "is_header": False, "level": 4},
{"no": "б", "name": "Балансдан ташқари активлар", "value": 0, "is_header": False, "level": 4},
{"no": "в", "name": "Ҳосилавий (дериватив) воситалар", "value": 0, "is_header": False, "level": 4},
{"no": "г", "name": "Минус: Жами захиралар ва капиталдан чегирмалар", "value": 23061469, "is_header": False, "level": 4},
{"no": "XV", "name": "Левераж коэффициенти", "value": "0,00%", "is_header": True, "level": 1, "tags": ["ratio"]}]
for row in table_data:
if isinstance(row["value"], (int, float)):
# Format integer with thousands separating spaces: 502385173 -> 502 385 173
row["value"] = f"{row['value']:,}".replace(",", " ")
# --- Advanced Filtering Logic Example ---
# If your client requests a filter via GET parameter (e.g., ?type=ratios)
#filter_type = request.GET.get('type')
#if filter_type in ['tier1', 'tier2', 'ratios']:
# table_data = [row for row in table_data if filter_type in row.get('tags', [])]
# 3. Context preparation
context = {
'bank_name': 'АТБ "БАНК НОМИ"',
'report_date': '28 август 2026 йил',
'table_data': table_data
}
context = {
'bank_name': 'АТБ Капиталбанк',
'report_date': '28 август 2026 йил',
'table_data': table_data
}
return render(request, 'risk/blockc_home.html', context)
def risk_appetite_home(request):
return render(request, 'risk/appetite_home.html')
def risk_limit_home(request):
return render(request, 'risk/limit_home.html')
def risk_combined_home(request):
return render(request, 'risk/combined_home.html')
def risk_plan_home(request):
return render(request, 'risk/plan_home.html')
def bank_capital_view(request):
return render(request, 'risk/blockc_home.html', context)
PO
powerty
Muallif
· Staff
Sen. 15, 2026
Sen. 15, 2026
2
Ko'rishlar
0
Yoqishlar
9m
O'qildi