aboutsummaryrefslogtreecommitdiffstats
path: root/python/parse_baml_swaption.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/parse_baml_swaption.py')
-rw-r--r--python/parse_baml_swaption.py83
1 files changed, 44 insertions, 39 deletions
diff --git a/python/parse_baml_swaption.py b/python/parse_baml_swaption.py
index f72d407b..d6bac38d 100644
--- a/python/parse_baml_swaption.py
+++ b/python/parse_baml_swaption.py
@@ -1,12 +1,13 @@
from serenitas.utils.exchange import ExchangeMessage
import pandas as pd
-from serenitas.utils.db import dawn_engine
-from sqlalchemy.exc import IntegrityError
+from serenitas.utils.db2 import dbconn
+from psycopg.errors import UniqueViolation
import datetime
import logging
import argparse
import re
from serenitas.ops.trade_dataclasses import CreditSwaptionDeal, desc_str
+from serenitas.ops.dataclass_mapping import Fund
parser = argparse.ArgumentParser()
parser.add_argument(
@@ -41,7 +42,7 @@ columns = [
# Counterparty Ticket to Database
-_baml_funds = {
+_baml_funds: dict[str, Fund] = {
"LMIL-Boston Patriot Bowdoin St LLC": "BOWDST",
"Iso Selene Inc.": "ISOSEL",
"Serenitas Credit Gamma Master Fund LP": "SERCGMAST",
@@ -70,9 +71,7 @@ def from_baml_email(d: dict, conn):
return CreditSwaptionDeal(
buysell=buysell,
- fund=_baml_funds[d["Index Buyer"]]
- if buysell
- else _baml_funds[d["Index Seller"]],
+ fund=_baml_funds[d[f"Index {'Buyer' if buysell else 'Seller'}"]],
cp_code="BAMSNY",
portfolio="OPTIONS",
folder=index + ("PAYER" if d["Option Type"] == "Payer" else "REC"),
@@ -99,37 +98,43 @@ def from_baml_email(d: dict, conn):
)
-em = ExchangeMessage()
-start = datetime.datetime.combine(args.workdate, datetime.time.min).replace(
- tzinfo=em._account.default_timezone
-)
-for msg in em.get_msgs(
- path=["AutoBook", "BAML Swaption"], datetime_received__gte=start
-):
- dfs = pd.read_html(msg.body)
- tickets = []
- for ticket in dfs:
- if len(ticket[0]) > 5:
- ticket = ticket.set_index(0).to_dict()[1]
- if "Block" in ticket or "Unwind Price" in ticket:
- continue
- tickets.append(ticket)
- trade = from_baml_email(ticket, dawn_engine.raw_connection())
- trade.stage()
+if __name__ == "__main__":
+ dawndb = dbconn("dawndb")
+ em = ExchangeMessage()
+ start = datetime.datetime.combine(args.workdate, datetime.time.min).replace(
+ tzinfo=em._account.default_timezone
+ )
+ for msg in em.get_msgs(
+ path=["AutoBook", "BAML Swaption"], datetime_received__gte=start
+ ):
+ dfs = pd.read_html(msg.body)
+ tickets = []
+ for ticket in dfs:
+ if len(ticket[0]) > 5:
+ ticket = ticket.set_index(0).to_dict()[1]
+ if "Block" in ticket or "Unwind Price" in ticket:
+ continue
+ tickets.append(ticket)
+ trade = from_baml_email(ticket, dawndb)
+ trade.stage()
- df = pd.DataFrame.from_dict(tickets)
- df.columns = df.columns.str.lower().str.replace(" ", "_")
- if "collateral" in df.columns:
- additional_columns = ["collateral"]
- else:
- additional_columns = []
- df = df[columns + additional_columns]
- try:
- df.to_sql(
- "baml_swaption_ticket", index=False, con=dawn_engine, if_exists="append"
- )
- except IntegrityError as e:
- logger.warning(e)
- CreditSwaptionDeal._insert_queue.clear()
- else:
- CreditSwaptionDeal.commit()
+ df = pd.DataFrame.from_dict(tickets)
+ df.columns = df.columns.str.lower().str.replace(" ", "_")
+ if "collateral" in df.columns:
+ additional_columns = ["collateral"]
+ else:
+ additional_columns = []
+ df = df[columns + additional_columns]
+ place_holders = ",".join(["%s"] * len(df.columns))
+ try:
+ with dawndb.cursor() as c:
+ c.executemany(
+ f"INSERT INTO baml_swaption_ticket({','.join(df.columns)})"
+ f"VALUES ({place_holders})",
+ df.itertuples(index=False),
+ )
+ except UniqueViolation as e:
+ logger.warning(str(e))
+ CreditSwaptionDeal._insert_queue.clear()
+ else:
+ CreditSwaptionDeal.commit()