diff --git a/Briefs_Generation_Large_Scale/portfolio_briefs_generation.ipynb b/Briefs_Generation_Large_Scale/portfolio_briefs_generation.ipynb index 4c5308a..95c0afb 100644 --- a/Briefs_Generation_Large_Scale/portfolio_briefs_generation.ipynb +++ b/Briefs_Generation_Large_Scale/portfolio_briefs_generation.ipynb @@ -36,7 +36,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 1, "id": "71205f3d", "metadata": {}, "outputs": [ @@ -44,7 +44,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "107\n" + "5\n" ] } ], @@ -92,19 +92,91 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 2, "id": "9515f759", "metadata": {}, "outputs": [], "source": [ "# Build request payload (adjust dates/topics as needed)\n", "TOPICS = [\n", - " \"{entity} earnings quarterly results revenue profit margins financial performance\",\n", - " \"{entity} guidance outlook forecast full year operational revision\",\n", - " \"{entity} strategic initiatives restructuring pivot M&A transformation\",\n", - " \"{entity} contract wins losses renewals RFP customer deals\",\n", - " \"{entity} new product launch pipeline R&D developments announcements\",\n", - "]\n" + "\n", + " 'What material acquisition, or merger, takeover transactions involve {entity}, whether as buyer, seller, or target, and what are the key announced terms (valuation, consideration, ownership changes)?',\n", + "\n", + " 'Have any investors or shareholders recently sold a controlling or significant minority stake in {entity} to a new financial or strategic buyer, and what are the implications for ownership and governance?',\n", + "\n", + " 'Has {entity} been the subject of any sale, auction, or strategic alternatives process, including indications of interest, LOIs, or signed sale agreements?',\n", + "\n", + " 'What notable bolt-on, tuck-in, or add-on acquisitions has {entity} announced or completed recently, and how do these transactions affect its scale and strategy?',\n", + "\n", + " 'What divestiture, carve-out, spin-off, or asset sale transactions has {entity} announced or executed, and what businesses or assets are included in the perimeter?',\n", + "\n", + " 'Is {entity} disposing of non-core business units, product lines, or regional operations, and what are the rationale, buyers, and expected closing timelines?',\n", + "\n", + " 'Has {entity} agreed to transfer a portfolio company, business segment, or joint venture interest to another sponsor, fund, or strategic acquirer?',\n", + "\n", + " 'Have there been any secondary sales of {entity} shares or fund interests, including GP- or LP‑led transactions, recapitalizations, or continuation vehicles affecting {entity}’s ownership?',\n", + "\n", + " 'What new liquidity events have occurred for early investors, founders, or employees of {entity}, such as partial exits, structured secondaries, or tender offers?',\n", + "\n", + " 'Has {entity} raised capital in a round that included significant secondary share sales, and how did this alter the cap table and control dynamics?',\n", + "\n", + " 'Has {entity} filed for, announced, or completed an IPO, direct listing, SPAC merger, or other public-listing transaction, and what is the implied valuation and free float?',\n", + "\n", + " 'Have there been any take‑private, de‑listing, or public‑to‑private transactions involving {entity}, and what are the key financing and ownership details?',\n", + "\n", + " 'What recapitalization, dividend recap, or leveraged refinancing transactions has {entity} executed that provided liquidity to existing shareholders?',\n", + "\n", + " 'Has {entity} issued new equity or hybrid securities in transactions that allowed existing investors to monetize or partially exit positions?',\n", + "\n", + " 'What changes in the ownership of funds or vehicles that hold {entity} (e.g., GP stakes, fund secondaries, continuation funds) could impact the ultimate sponsor or decision‑makers for {entity}?',\n", + "\n", + " 'Have any new sponsors, co‑investors, or strategic partners acquired stakes in the fund or holding vehicles that own {entity}, potentially signaling shifts in oversight or exit plans?',\n", + "\n", + " 'What significant upcoming corporate events, market rumors, or regulatory developments could lead to M&A, divestiture, or liquidity events for {entity} in the near term?',\n", + "\n", + " 'What material merger or acquisition transactions involve {entity}, whether as buyer, seller, or target, and what are the key announced terms (valuation, consideration, and change in control)?',\n", + "\n", + " 'Has {entity} initiated or been the subject of a formal sale process, strategic alternatives review, or auction that could lead to a merger or acquisition?',\n", + "\n", + " 'What signs of financial stress or uncertainty are emerging at {entity}, including going‑concern warnings, covenant breaches, payment delays, or auditor/emphasis‑of‑matter commentary?',\n", + "\n", + " 'What actions is {entity} taking to address liquidity pressure or refinancing risk, such as cost‑cutting, asset sales, debt renegotiations, or standstill agreements?',\n", + "\n", + " 'Has {entity} filed for, or publicly considered, bankruptcy, insolvency, administration, receivership, or formal restructuring proceedings, and what are the implications for creditors and shareholders?',\n", + "\n", + " 'What out‑of‑court restructuring, distressed exchange, or turnaround plans has {entity} announced, and how do these affect its capital structure and ownership?',\n", + "\n", + " 'What significant equity or debt fundraising transactions has {entity} completed or announced recently, including size, type of instrument, key investors, and implied valuation?',\n", + "\n", + " 'Has {entity} executed any major recapitalization, dividend recap, or refinancing that provides liquidity to existing shareholders or materially alters leverage?',\n", + "\n", + " 'Has {entity} filed for, announced, or completed an IPO, direct listing, SPAC merger, or other public listing, and what are the key details around valuation, free float, and use of proceeds?',\n", + "\n", + " 'Have there been any take‑private, de‑listing, or public‑to‑private transactions involving {entity}, and what changes in ownership or control result from these deals?',\n", + "\n", + " 'What divestiture, carve‑out, spin‑off, or business/asset sale transactions has {entity} announced, including which units are sold, who the buyers are, and the strategic rationale?',\n", + "\n", + " 'Is {entity} disposing of non‑core or underperforming operations to raise liquidity or sharpen strategic focus, and what is the expected impact on its financial profile?',\n", + "\n", + " 'What significant joint venture, strategic alliance, or co‑investment agreements involve {entity}, and how do these affect its capital commitments, risk‑sharing, or market access?',\n", + "\n", + " 'Has {entity} contributed assets, IP, or business lines into a joint vehicle or partnership that creates partial monetization or shared ownership of those assets?',\n", + "\n", + " \"What key results, guidance, and themes did {entity}'s latest earnings report and call highlight?\",\n", + " \n", + " 'What transfer restrictions or repurchase rights apply to securities issued in connection with a merger or acquisition involving {entity}?',\n", + " \n", + " 'What changes to the certificate of incorporation, bylaws, or governance documents of {entity} are triggered by a pending or completed merger?',\n", + "\n", + " 'What dual-class or multi-class share structure has {entity} implemented in connection with its IPO, and what are the voting rights and conversion mechanics for each class?',\n", + " \n", + " 'What equity exchange right agreements or put right arrangements have {entity} and its co-founders entered into in connection with a public listing, and how do these affect founder control?',\n", + " \n", + " 'What lock-up, market stand-off, or transfer restriction agreements have key shareholders and founders of {entity} entered into in connection with its IPO or public listing?',\n", + " \n", + " 'What analyst coverage initiations, price targets, and ratings has {entity} received following its IPO or public listing?',\n", + " ]\n", + "\n" ] }, { @@ -132,7 +204,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "4ea21e37", "metadata": {}, "outputs": [ @@ -140,7 +212,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Using 107 companies\n" + "Using 5 companies\n" ] } ], @@ -166,10 +238,13 @@ "token = os.environ.get(\"API_TOKEN\") or os.environ.get(\"TOKEN\") or os.environ.get(\"API_KEY\")\n", "params = {\"token\": token} if token else {}\n", "\n", + "# v4+ / current API: \"entities\". Older images (pre-v4) required \"companies\" only.\n", + "ENTITY_BODY_FIELD = \"entities\"\n", + "\n", "payload = {\n", - " \"entities\": companies,\n", - " \"report_start_date\": \"2025-10-27\",\n", - " \"report_end_date\": \"2025-11-03\",\n", + " ENTITY_BODY_FIELD: companies,\n", + " \"report_start_date\": \"2026-02-01\",\n", + " \"report_end_date\": \"2026-02-28\",\n", " \"novelty\": True,\n", " \"sources\": None,\n", " \"topics\": TOPICS,\n", @@ -179,6 +254,9 @@ "\n", "}\n", "\n", + "# Snapshot for exploratory grid / timeline if another cell reuses the name `payload`\n", + "BRIEF_CREATE_PAYLOAD = dict(payload)\n", + "\n", "# API call settings\n", "# Update this to the actual create endpoint\n", "API_URL = \"http://localhost:8000/briefs/create\"\n", @@ -202,7 +280,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 4, "id": "69fc2321", "metadata": {}, "outputs": [], @@ -222,30 +300,14 @@ "id": "a52d1b2c", "metadata": {}, "source": [ - "## Step 5: Process Companies in Batches and Generate Briefs\n", - "\n", - "This is the main processing step that generates briefing reports for all companies. It works by sending requests to the API in batches and waiting for each batch to complete before moving to the next.\n", + "## Step 5: Batch brief generation\n", "\n", - "**What it does:**\n", - "1. **Splits companies into batches** to avoid overwhelming the API\n", - "2. **Submits each batch** to the briefing service\n", - "3. **Monitors progress** by checking the status of each request\n", - "4. **Waits for completion** (up to 10 minutes per batch)\n", - "5. **Collects results** from all batches into a single combined report\n", - "6. **Saves the results** under `output/` (see Step 4) as JSON files\n", - "\n", - "**Key Features:**\n", - "- **Error Handling:** If a batch fails, it records the error and continues with the next batch\n", - "- **Status Polling:** Checks every 10 seconds to see if a batch is complete\n", - "- **Automatic Merging:** Combines all batch results into one unified report\n", - "- **Progress Tracking:** Shows which batch is being processed and when it completes\n", - "\n", - "**Output:** Two JSON files in `output/`: combined report and request summaries.\n" + "Sends `payload` to `/briefs/create` in chunks of `BATCH_SIZE`, polls status, merges `entity_reports` and `source_metadata`, then writes the two JSON files from Step 4. If some companies have no bullets after the first pass, a second pass retries them with extra topic `{entity} is`, `sentiment_threshold=0`, and `rerank_threshold=0.01` to boost recall.\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "3531b2a0", "metadata": {}, "outputs": [ @@ -253,15 +315,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "Batch Starting date and time: 2026-03-26 16:39:33.203159\n", - "Submitting batch 1-50 (50 entities)...\n", - "Batch 1-50 completed: 88 entities added.\n", - "Submitting batch 51-100 (50 entities)...\n", - "Batch 51-100 completed: 94 entities added.\n", - "Submitting batch 101-107 (7 entities)...\n", - "Batch 101-107 completed: 92 entities added.\n", - "Accumulated 274 entity_reports and 446 source_metadata entries across 3 requests.\n", - "Batch Completion date and time: 2026-03-26 16:49:55.339777\n" + "Batch Starting date and time: 2026-03-31 13:03:28.291446\n", + "Submitting batch 1-5 (5 entities)...\n", + "Batch 1-5 completed: 1 entities added.\n", + "Retry pass: 4 entities without brief; adding topic '{entity} is', sentiment_threshold=0, rerank_threshold=0.01.\n", + "Submitting batch 1-4 (4 entities) (retry)...\n", + "Batch 1-4 completed: 1 entities added. (retry)\n", + "Accumulated 2 entity_reports and 7 source_metadata entries across 2 requests.\n", + "Batch Completion date and time: 2026-03-31 13:04:58.503790\n" ] } ], @@ -271,152 +332,240 @@ "import json\n", "import traceback\n", "import requests\n", - "from datetime import datetime \n", + "from datetime import datetime\n", "\n", - "# Get the current date and time\n", "current_datetime = datetime.now()\n", - "\n", - "# Print the full date and time\n", "print(f\"Batch Starting date and time: {current_datetime}\")\n", "\n", + "\n", "def _status_url_for(request_id: str) -> str:\n", " # Update this to the actual status endpoint\n", - " status_url = f\"http://localhost:8000/briefs/status/{request_id}\"\n", - " return status_url\n", - "\n", - "combined_entity_reports = []\n", - "combined_source_metadata = {}\n", - "request_summaries = {}\n", - "\n", - "for start in range(0, len(companies), BATCH_SIZE):\n", - " batch = companies[start:start + BATCH_SIZE]\n", - " payload_batch = copy.deepcopy(payload)\n", - " payload_batch[\"companies\"] = batch\n", - "\n", - " try:\n", - " print(f\"Submitting batch {start + 1}-{start + len(batch)} ({len(batch)} entities)...\")\n", - " resp = requests.post(API_URL, params=params, json=payload_batch, timeout=180)\n", - " resp.raise_for_status()\n", - " create_resp = resp.json()\n", - " except Exception as e:\n", - " print(\"Create request failed for batch starting at\", start, \":\", e)\n", - " traceback.print_exc()\n", - " # store failure summary with no request id\n", - " request_summaries[f\"batch_{start}\"] = {\n", - " \"start_date\": payload_batch.get(\"report_start_date\"),\n", - " \"end_date\": payload_batch.get(\"report_end_date\"),\n", - " \"logs\": getattr(e, \"args\", str(e)),\n", - " \"report_title\": None,\n", - " \"watchlist_id\": None,\n", - " \"status\": \"create_failed\",\n", - " \"rp_entity_ids\": list(batch),\n", - " }\n", - " continue\n", - "\n", - " request_id = create_resp.get(\"request_id\")\n", - " # capture immediate create-level logs/title if present\n", - " immediate_report = create_resp.get(\"report\", {}) or {}\n", - " request_summaries[request_id or f\"batch_{start}\"] = {\n", - " \"start_date\": payload_batch.get(\"report_start_date\"),\n", - " \"end_date\": payload_batch.get(\"report_end_date\"),\n", - " \"logs\": create_resp.get(\"logs\") or immediate_report.get(\"logs\"),\n", - " \"report_title\": immediate_report.get(\"report_title\") or create_resp.get(\"report_title\"),\n", - " \"watchlist_id\": immediate_report.get(\"watchlist_id\") or create_resp.get(\"watchlist_id\"),\n", - " \"status\": \"submitted\",\n", - " \"rp_entity_ids\": list(batch),\n", - " }\n", - "\n", - " # If no request_id, maybe synchronous response contained the report already\n", - " if not request_id and immediate_report:\n", - " ers = immediate_report.get(\"entity_reports\", []) or []\n", - " sm = immediate_report.get(\"source_metadata\", {}) or {}\n", - " combined_entity_reports.extend(ers)\n", - " combined_source_metadata.update(sm)\n", - " request_summaries[request_id or f\"batch_{start}\"][\"status\"] = \"completed_sync\"\n", - " print(f\"Batch {start}-{start+len(batch)} returned sync report with {len(ers)} entities.\")\n", - " continue\n", + " return f\"http://localhost:8000/briefs/status/{request_id}\"\n", "\n", - " # Poll status until complete/failed or timeout\n", - " status_url = _status_url_for(request_id)\n", - " timeout_seconds = 600 # total wait per batch\n", - " poll_interval = 10\n", - " waited = 0\n", - " final_status_resp = None\n", - " while waited < timeout_seconds:\n", - " try:\n", - " status_resp = requests.get(status_url, params=params, timeout=60)\n", - " status_resp.raise_for_status()\n", - " sjson = status_resp.json()\n", - " status = sjson.get(\"status\") or sjson.get(\"state\") or \"\"\n", - " if status and status.lower() in (\"completed\", \"done\", \"success\"):\n", - " final_status_resp = sjson\n", - " request_summaries[request_id][\"status\"] = \"completed\"\n", - " break\n", - " if status and status.lower() in (\"failed\", \"error\"):\n", - " final_status_resp = sjson\n", - " request_summaries[request_id][\"status\"] = \"failed\"\n", - " break\n", - " # otherwise still processing\n", - " except Exception as e:\n", - " print(\"Status check error:\", e)\n", - " time.sleep(poll_interval)\n", - " waited += poll_interval\n", "\n", - " if not final_status_resp:\n", - " print(f\"Timeout waiting for request {request_id}; proceeding to next batch.\")\n", - " request_summaries[request_id][\"status\"] = \"timeout\"\n", - " continue\n", + "def _normalize_entity_id(x: object) -> str:\n", + " return str(x).strip()\n", "\n", - " # extract report data if present\n", - " report = final_status_resp.get(\"report\", {}) or final_status_resp\n", - " entity_reports_chunk = report.get(\"entity_reports\", []) or []\n", - " source_meta_chunk = report.get(\"source_metadata\", {}) or {}\n", "\n", - " # merge\n", - " combined_entity_reports.extend(entity_reports_chunk)\n", - " # prefer existing keys (do not overwrite) to preserve first-seen metadata\n", - " for k, v in source_meta_chunk.items():\n", - " if k not in combined_source_metadata:\n", - " combined_source_metadata[k] = v\n", + "def _rp_id_from_entity_report(er: dict) -> str | None:\n", + " ei = er.get(\"entity_info\") or {}\n", + " rid = er.get(\"rp_entity_id\") or er.get(\"entity_id\") or ei.get(\"id\")\n", + " if rid is None or not str(rid).strip():\n", + " return None\n", + " return str(rid).strip()\n", + "\n", + "\n", + "def _entity_report_has_brief_content(er: dict) -> bool:\n", + " # At least one non-empty bullet_point in content[]\n", + " content = er.get(\"content\") or []\n", + " for item in content:\n", + " if isinstance(item, dict) and str(item.get(\"bullet_point\") or \"\").strip():\n", + " return True\n", + " return False\n", + "\n", + "\n", + "def _entity_ids_without_brief(all_company_ids: list, entity_reports: list) -> list:\n", + " has_brief: set[str] = set()\n", + " for er in entity_reports:\n", + " rid = _rp_id_from_entity_report(er)\n", + " if rid and _entity_report_has_brief_content(er):\n", + " has_brief.add(rid)\n", + " return [c for c in all_company_ids if _normalize_entity_id(c) not in has_brief]\n", + "\n", + "\n", + "def _run_brief_batches(\n", + " entities: list,\n", + " batch_payload: dict,\n", + " *,\n", + " pass_label: str,\n", + ") -> tuple[list, dict, dict]:\n", + " tag = \" (retry)\" if pass_label == \"retry\" else \"\"\n", + " entity_reports_out: list = []\n", + " source_metadata_out: dict = {}\n", + " summaries_out: dict = {}\n", + "\n", + " for start in range(0, len(entities), BATCH_SIZE):\n", + " batch = entities[start : start + BATCH_SIZE]\n", + " payload_batch = copy.deepcopy(batch_payload)\n", + " payload_batch[ENTITY_BODY_FIELD] = batch\n", "\n", - " # update summary fields with final report metadata\n", - " request_summaries[request_id].update({\n", - " \"logs\": final_status_resp.get(\"logs\") or request_summaries[request_id].get(\"logs\"),\n", - " \"report_title\": report.get(\"report_title\") or request_summaries[request_id].get(\"report_title\"),\n", - " \"watchlist_id\": report.get(\"watchlist_id\") or request_summaries[request_id].get(\"watchlist_id\"),\n", - " \"entity_count\": len(entity_reports_chunk),\n", - " \"completed_at\": final_status_resp.get(\"completed_at\") or final_status_resp.get(\"ts\")\n", - " })\n", + " try:\n", + " print(\n", + " f\"Submitting batch {start + 1}-{start + len(batch)} ({len(batch)} entities){tag}...\"\n", + " )\n", + " resp = requests.post(API_URL, params=params, json=payload_batch, timeout=180)\n", + " resp.raise_for_status()\n", + " create_resp = resp.json()\n", + " except Exception as e:\n", + " print(\"Create request failed for batch starting at\", start, \":\", e)\n", + " traceback.print_exc()\n", + " summaries_out[f\"{pass_label}_batch_{start}\"] = {\n", + " \"pass\": pass_label,\n", + " \"start_date\": payload_batch.get(\"report_start_date\"),\n", + " \"end_date\": payload_batch.get(\"report_end_date\"),\n", + " \"logs\": getattr(e, \"args\", str(e)),\n", + " \"report_title\": None,\n", + " \"watchlist_id\": None,\n", + " \"status\": \"create_failed\",\n", + " \"rp_entity_ids\": list(batch),\n", + " }\n", + " continue\n", + "\n", + " request_id = create_resp.get(\"request_id\")\n", + " immediate_report = create_resp.get(\"report\", {}) or {}\n", + " summary_key = request_id or f\"{pass_label}_batch_{start}\"\n", + " summaries_out[summary_key] = {\n", + " \"pass\": pass_label,\n", + " \"start_date\": payload_batch.get(\"report_start_date\"),\n", + " \"end_date\": payload_batch.get(\"report_end_date\"),\n", + " \"logs\": create_resp.get(\"logs\") or immediate_report.get(\"logs\"),\n", + " \"report_title\": immediate_report.get(\"report_title\") or create_resp.get(\"report_title\"),\n", + " \"watchlist_id\": immediate_report.get(\"watchlist_id\") or create_resp.get(\"watchlist_id\"),\n", + " \"status\": \"submitted\",\n", + " \"rp_entity_ids\": list(batch),\n", + " }\n", "\n", - " print(f\"Batch {start + 1}-{start + len(batch)} completed: {len(entity_reports_chunk)} entities added.\")\n", + " if not request_id and immediate_report:\n", + " ers = immediate_report.get(\"entity_reports\", []) or []\n", + " sm = immediate_report.get(\"source_metadata\", {}) or {}\n", + " entity_reports_out.extend(ers)\n", + " source_metadata_out.update(sm)\n", + " summaries_out[summary_key][\"status\"] = \"completed_sync\"\n", + " print(f\"Batch {start}-{start + len(batch)} returned sync report with {len(ers)} entities.{tag}\")\n", + " continue\n", + "\n", + " status_url = _status_url_for(request_id)\n", + " timeout_seconds = 600\n", + " poll_interval = 10\n", + " waited = 0\n", + " final_status_resp = None\n", + " while waited < timeout_seconds:\n", + " try:\n", + " status_resp = requests.get(status_url, params=params, timeout=60)\n", + " status_resp.raise_for_status()\n", + " sjson = status_resp.json()\n", + " status = sjson.get(\"status\") or sjson.get(\"state\") or \"\"\n", + " if status and status.lower() in (\"completed\", \"done\", \"success\"):\n", + " final_status_resp = sjson\n", + " summaries_out[request_id][\"status\"] = \"completed\"\n", + " break\n", + " if status and status.lower() in (\"failed\", \"error\"):\n", + " final_status_resp = sjson\n", + " summaries_out[request_id][\"status\"] = \"failed\"\n", + " break\n", + " except Exception as e:\n", + " print(\"Status check error:\", e)\n", + " time.sleep(poll_interval)\n", + " waited += poll_interval\n", + "\n", + " if not final_status_resp:\n", + " print(f\"Timeout waiting for request {request_id}; proceeding to next batch.\")\n", + " summaries_out[request_id][\"status\"] = \"timeout\"\n", + " continue\n", + "\n", + " report = final_status_resp.get(\"report\", {}) or final_status_resp\n", + " entity_reports_chunk = report.get(\"entity_reports\", []) or []\n", + " source_meta_chunk = report.get(\"source_metadata\", {}) or {}\n", + "\n", + " entity_reports_out.extend(entity_reports_chunk)\n", + " for k, v in source_meta_chunk.items():\n", + " if k not in source_metadata_out:\n", + " source_metadata_out[k] = v\n", + "\n", + " api_status = final_status_resp.get(\"status\", \"\")\n", + " summaries_out[request_id].update(\n", + " {\n", + " \"api_status\": str(api_status),\n", + " \"logs\": final_status_resp.get(\"logs\") or summaries_out[request_id].get(\"logs\"),\n", + " \"report_title\": report.get(\"report_title\") or summaries_out[request_id].get(\"report_title\"),\n", + " \"watchlist_id\": report.get(\"watchlist_id\") or summaries_out[request_id].get(\"watchlist_id\"),\n", + " \"entity_count\": len(entity_reports_chunk),\n", + " \"completed_at\": final_status_resp.get(\"completed_at\") or final_status_resp.get(\"ts\"),\n", + " }\n", + " )\n", + "\n", + " print(f\"Batch {start + 1}-{start + len(batch)} completed: {len(entity_reports_chunk)} entities added.{tag}\")\n", + "\n", + " if len(entity_reports_chunk) == 0:\n", + " if isinstance(report, dict) and report:\n", + " intro = report.get(\"introduction\") or \"\"\n", + " if intro:\n", + " print(\"Report introduction (snippet):\", str(intro)[:800])\n", + " st = str(api_status).lower()\n", + " if st in (\"failed\", \"error\"):\n", + " print(\"Job FAILED — see logs in summary JSON.\")\n", + " elif st in (\"completed\", \"done\", \"success\"):\n", + " print(\n", + " \"No entity_reports in response: try wider dates, novelty=False, or broader TOPICS.\"\n", + " )\n", + "\n", + " return entity_reports_out, source_metadata_out, summaries_out\n", + "\n", + "\n", + "combined_entity_reports, combined_source_metadata, request_summaries = _run_brief_batches(\n", + " companies, payload, pass_label=\"primary\"\n", + ")\n", "\n", - "# Ensure every entity report includes rp_entity_id (API may only send entity_id / entity_info.id)\n", "for er in combined_entity_reports:\n", " ei = er.get(\"entity_info\") or {}\n", " rid = er.get(\"rp_entity_id\") or er.get(\"entity_id\") or ei.get(\"id\")\n", " if rid is not None and str(rid).strip():\n", " er[\"rp_entity_id\"] = str(rid).strip()\n", "\n", - "# final combined report\n", + "missing_no_brief = _entity_ids_without_brief(companies, combined_entity_reports)\n", + "if missing_no_brief:\n", + " print(\n", + " f\"Retry pass: {len(missing_no_brief)} entities without brief; \"\n", + " \"adding topic '{entity} is', sentiment_threshold=0, rerank_threshold=0.01.\"\n", + " )\n", + " payload_retry = copy.deepcopy(payload)\n", + " retry_topics = list(payload_retry.get(\"topics\") or TOPICS)\n", + " extra_topic = \"{entity} is\"\n", + " if extra_topic not in retry_topics:\n", + " retry_topics.append(extra_topic)\n", + " payload_retry[\"topics\"] = retry_topics\n", + " payload_retry[\"sentiment_threshold\"] = 0\n", + " payload_retry[\"rerank_threshold\"] = 0.01\n", + "\n", + " retry_reports, retry_sm, retry_summaries = _run_brief_batches(\n", + " missing_no_brief, payload_retry, pass_label=\"retry\"\n", + " )\n", + " missing_set = {_normalize_entity_id(m) for m in missing_no_brief}\n", + " combined_entity_reports = [\n", + " er for er in combined_entity_reports if _rp_id_from_entity_report(er) not in missing_set\n", + " ]\n", + " combined_entity_reports.extend(retry_reports)\n", + " for k, v in retry_sm.items():\n", + " if k not in combined_source_metadata:\n", + " combined_source_metadata[k] = v\n", + " request_summaries.update(retry_summaries)\n", + "\n", + " for er in combined_entity_reports:\n", + " ei = er.get(\"entity_info\") or {}\n", + " rid = er.get(\"rp_entity_id\") or er.get(\"entity_id\") or ei.get(\"id\")\n", + " if rid is not None and str(rid).strip():\n", + " er[\"rp_entity_id\"] = str(rid).strip()\n", + "else:\n", + " print(\"Retry pass skipped: all companies have at least one bullet from the primary run.\")\n", + "\n", "combined_report = {\n", " \"entity_reports\": combined_entity_reports,\n", - " \"source_metadata\": combined_source_metadata\n", + " \"source_metadata\": combined_source_metadata,\n", "}\n", "\n", - "# persist results\n", "with open(BRIEF_REPORT_FILE, \"w\", encoding=\"utf-8\") as f:\n", " json.dump(combined_report, f, ensure_ascii=False, indent=2)\n", "\n", "with open(BRIEF_SUMMARY_FILE, \"w\", encoding=\"utf-8\") as f:\n", " json.dump(request_summaries, f, ensure_ascii=False, indent=2)\n", "\n", - "print(f\"Accumulated {len(combined_entity_reports)} entity_reports and {len(combined_source_metadata)} source_metadata entries across {len(request_summaries)} requests.\")\n", + "print(\n", + " f\"Accumulated {len(combined_entity_reports)} entity_reports and \"\n", + " f\"{len(combined_source_metadata)} source_metadata entries across {len(request_summaries)} requests.\"\n", + ")\n", "\n", - "# Get the current date and time\n", "current_datetime = datetime.now()\n", - "\n", - "# Print the full date and time\n", - "print(f\"Batch Completion date and time: {current_datetime}\")" + "print(f\"Batch Completion date and time: {current_datetime}\")\n" ] }, { @@ -449,7 +598,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "id": "7b6bb4ec", "metadata": {}, "outputs": [], @@ -604,7 +753,8 @@ " for b in bullets\n", " ])\n", " display(Markdown(\"**Raw table (for copy/export):**\"))\n", - " display(df.head(limit))\n" + " display(df.head(limit))\n", + "\n" ] }, { @@ -628,7 +778,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 7, "id": "d87b5372", "metadata": {}, "outputs": [ @@ -636,9 +786,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Loaded combined report: 274 entities, 446 source_metadata entries.\n", + "Loaded combined report: 2 entities, 7 source_metadata entries.\n", "First entity keys: ['entity_id', 'entity_info', 'content', 'rp_entity_id']\n", - "Sample source id: D8D2C17CA5DEC0EC8D34B1C3C03F1735-1\n" + "Sample source id: AD7C5F3B607D25601691E0F8C671D66F-54\n" ] } ], @@ -691,28 +841,16 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 8, "id": "8e682350", "metadata": {}, "outputs": [ { "data": { "text/markdown": [ - "## Polaris Inc.\n", - "**RP_ENTITY_ID:** `A8B137` • **Sector:** Consumer Goods • **Industry:** Recreational Products • **Country:** US\n", - "[Website](http://www.polaris.com)\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Bullet points:** 5 • **Top sources (ids):** 651232224AA1D28BAC665D740B474EAC-4, 651232224AA1D28BAC665D740B474EAC-36, 8A7F14966BBAB8505B2BCE1174B77637-26, 651232224AA1D28BAC665D740B474EAC-10\n" + "## Ethos Technologies Inc.\n", + "**RP_ENTITY_ID:** `R49HQR` • **Sector:** Financials • **Industry:** Life Insurance • **Country:** US\n", + "[Website](http://www.ethos.com)\n" ], "text/plain": [ "" @@ -724,9 +862,7 @@ { "data": { "text/markdown": [ - "1. **Polaris Inc.** (PII) reports strong Q3 results with $1.8 billion in sales, driven by a 7% increase in shipments, particularly in the Off Road segment, leading to a 3-point market share gain in ORV.\n", - "\n", - "**Sources:** **Factset Transcripts**\n" + "**Bullet points:** 2 • **Top sources (ids):** AD7C5F3B607D25601691E0F8C671D66F-54, AD7C5F3B607D25601691E0F8C671D66F-12, AD7C5F3B607D25601691E0F8C671D66F-21\n" ], "text/plain": [ "" @@ -738,7 +874,7 @@ { "data": { "text/markdown": [ - "2. Polaris anticipates that the expected sale of a majority stake in Indian Motorcycle will free up resources for higher-margin opportunities, projecting an increase of approximately $50 million in annual adjusted EBITDA and about $1 in adjusted EPS.\n", + "1. **Ethos Technologies Inc.** launches a new Indexed Universal Life product in partnership with a carrier, utilizing a unique distribution model that combines both teams to accelerate agent onboarding and market penetration.\n", "\n", "**Sources:** **Factset Transcripts**\n" ], @@ -752,37 +888,9 @@ { "data": { "text/markdown": [ - "3. The company achieved a 21% year-over-year reduction in dealer inventory, significantly lowering flooring expenses for dealers by over 50%, which contributed to improved operational efficiencies.\n", + "2. The company outlines three growth strategies for 2026: expanding its consumer base and agent recruitment, enhancing agent productivity, and broadening its product portfolio to capture a larger market share.\n", "\n", - "**Sources:** **Factset Transcripts**\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "4. Operational efficiencies from lean manufacturing initiatives and improved forecasting have resulted in over $40 million in structural savings, although margins were pressured by tariffs and incentive compensation.\n", - "\n", - "**Sources:** **Quartr Transcripts**\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "5. Polaris gained market share in both Off Road and On Road segments during the quarter, with notable performance in the utility side-by-side category, despite competitive product launches.\n", - "\n", - "**Sources:** **Factset Transcripts**\n" + "**Sources:** **Factset Transcripts**, **Factset Transcripts**\n" ], "text/plain": [ "" @@ -832,33 +940,15 @@ " \n", " \n", " 0\n", - " A8B137\n", - " **Polaris Inc.** (PII) reports strong Q3 resul...\n", - " [651232224AA1D28BAC665D740B474EAC-4]\n", + " R49HQR\n", + " **Ethos Technologies Inc.** launches a new Ind...\n", + " [AD7C5F3B607D25601691E0F8C671D66F-54]\n", " \n", " \n", " 1\n", - " A8B137\n", - " Polaris anticipates that the expected sale of ...\n", - " [651232224AA1D28BAC665D740B474EAC-36]\n", - " \n", - " \n", - " 2\n", - " A8B137\n", - " The company achieved a 21% year-over-year redu...\n", - " [651232224AA1D28BAC665D740B474EAC-4]\n", - " \n", - " \n", - " 3\n", - " A8B137\n", - " Operational efficiencies from lean manufacturi...\n", - " [8A7F14966BBAB8505B2BCE1174B77637-26]\n", - " \n", - " \n", - " 4\n", - " A8B137\n", - " Polaris gained market share in both Off Road a...\n", - " [651232224AA1D28BAC665D740B474EAC-10]\n", + " R49HQR\n", + " The company outlines three growth strategies f...\n", + " [AD7C5F3B607D25601691E0F8C671D66F-12, AD7C5F3B...\n", " \n", " \n", "\n", @@ -866,32 +956,12 @@ ], "text/plain": [ " rp_entity_id bullet \\\n", - "0 A8B137 **Polaris Inc.** (PII) reports strong Q3 resul... \n", - "1 A8B137 Polaris anticipates that the expected sale of ... \n", - "2 A8B137 The company achieved a 21% year-over-year redu... \n", - "3 A8B137 Operational efficiencies from lean manufacturi... \n", - "4 A8B137 Polaris gained market share in both Off Road a... \n", + "0 R49HQR **Ethos Technologies Inc.** launches a new Ind... \n", + "1 R49HQR The company outlines three growth strategies f... \n", "\n", - " sources \n", - "0 [651232224AA1D28BAC665D740B474EAC-4] \n", - "1 [651232224AA1D28BAC665D740B474EAC-36] \n", - "2 [651232224AA1D28BAC665D740B474EAC-4] \n", - "3 [8A7F14966BBAB8505B2BCE1174B77637-26] \n", - "4 [651232224AA1D28BAC665D740B474EAC-10] " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "## Cognizant Technology Solutions Corp.\n", - "**RP_ENTITY_ID:** `07EC43` • **Sector:** Technology • **Industry:** Computer Services • **Country:** US\n", - "[Website](http://www.cognizant.com)\n" - ], - "text/plain": [ - "" + " sources \n", + "0 [AD7C5F3B607D25601691E0F8C671D66F-54] \n", + "1 [AD7C5F3B607D25601691E0F8C671D66F-12, AD7C5F3B... " ] }, "metadata": {}, @@ -900,7 +970,8 @@ { "data": { "text/markdown": [ - "**Bullet points:** 4 • **Top sources (ids):** BBE5F431FF15019595D005C54ACF2D01-71, A7BC042276933AFCD394AA5E5B0AF80E-26, 92D6D6B73F8D403725D40FEAEAFCCFB0-26, A7BC042276933AFCD394AA5E5B0AF80E-37\n" + "## Kodiak Building Partners Inc.\n", + "**RP_ENTITY_ID:** `8C8XX4` • **Sector:** Industrials • **Industry:** Industrial Suppliers • **Country:** US\n" ], "text/plain": [ "" @@ -912,9 +983,7 @@ { "data": { "text/markdown": [ - "1. Cognizant's third-quarter revenue grew 6.5% year-over-year, marking the fifth consecutive quarter of organic revenue growth, supported by six large deals signed in the quarter, totaling 16 year-to-date with a 40% increase in large deal TCV compared to last year.\n", - "\n", - "**Sources:** [Edgar SEC Filings](https://www.sec.gov/Archives/edgar/data/1058290/000105829025000338/ctsh-20251029.htm)\n" + "**Bullet points:** 3 • **Top sources (ids):** 076F71B842452D71EA6B0575B498B360-168, 076F71B842452D71EA6B0575B498B360-9, 076F71B842452D71EA6B0575B498B360-38, 076F71B842452D71EA6B0575B498B360-539\n" ], "text/plain": [ "" @@ -926,9 +995,9 @@ { "data": { "text/markdown": [ - "2. The company's three-vector AI builder strategy is gaining traction, with expectations that early investments in AI-led platforms will drive future growth, enhancing productivity as 30% of code is now written by machines.\n", + "1. **Kodiak Building Partners Inc.** enters into a merger agreement with **QXO, Inc.** on February 10, 2026, involving **Juno Merger Sub, Inc.** as a wholly owned subsidiary, with the merger expected to finalize soon, impacting ownership and governance structures significantly.\n", "\n", - "**Sources:** **Factset Transcripts**\n" + "**Sources:** [Edgar SEC Filings](https://www.sec.gov/Archives/edgar/data/1236275/000110465926012932/tm265913d1_8k.htm), [Edgar SEC Filings](https://www.sec.gov/Archives/edgar/data/1236275/000110465926012932/tm265913d1_8k.htm), [Edgar SEC Filings](https://www.sec.gov/Archives/edgar/data/1236275/000110465926012932/tm265913d1_8k.htm)\n" ], "text/plain": [ "" @@ -940,9 +1009,9 @@ { "data": { "text/markdown": [ - "3. **Cognizant Technology Solutions Corp.** (CTSH) increases adjusted operating margin guidance to approximately 15.7% for Q4, reflecting a 40 basis point expansion driven by cost discipline and SG&A leverage, despite the merit cycle impact.\n", + "2. The merger will result in the governance documents of **Kodiak Building Partners Inc.** being amended to align with those of **Juno Merger Sub, Inc.**, indicating a shift in operational control and potential strategic direction post-merger.\n", "\n", - "**Sources:** **Quartr Transcripts**\n" + "**Sources:** [Edgar SEC Filings](https://www.sec.gov/Archives/edgar/data/1236275/000110465926012932/tm265913d1_8k.htm)\n" ], "text/plain": [ "" @@ -954,9 +1023,9 @@ { "data": { "text/markdown": [ - "4. The company anticipates Q4 revenue growth of 2.5% to 3.5% year-over-year in constant currency, leading to a full-year revenue growth forecast of 6% to 6.3%, surpassing previous guidance of 4% to 6%.\n", + "3. Post-merger, the name of the surviving entity will remain **Kodiak Building Partners Inc.**, but its certificate of incorporation and bylaws will reflect those of **Juno Merger Sub, Inc.**, suggesting a significant change in governance and operational oversight.\n", "\n", - "**Sources:** **Factset Transcripts**\n" + "**Sources:** [Edgar SEC Filings](https://www.sec.gov/Archives/edgar/data/1236275/000110465926012932/tm265913d1_8k.htm)\n" ], "text/plain": [ "" @@ -1006,27 +1075,21 @@ " \n", " \n", " 0\n", - " 07EC43\n", - " Cognizant's third-quarter revenue grew 6.5% ye...\n", - " [BBE5F431FF15019595D005C54ACF2D01-71]\n", + " 8C8XX4\n", + " **Kodiak Building Partners Inc.** enters into ...\n", + " [076F71B842452D71EA6B0575B498B360-9, 076F71B84...\n", " \n", " \n", " 1\n", - " 07EC43\n", - " The company's three-vector AI builder strategy...\n", - " [A7BC042276933AFCD394AA5E5B0AF80E-26]\n", + " 8C8XX4\n", + " The merger will result in the governance docum...\n", + " [076F71B842452D71EA6B0575B498B360-168]\n", " \n", " \n", " 2\n", - " 07EC43\n", - " **Cognizant Technology Solutions Corp.** (CTSH...\n", - " [92D6D6B73F8D403725D40FEAEAFCCFB0-26]\n", - " \n", - " \n", - " 3\n", - " 07EC43\n", - " The company anticipates Q4 revenue growth of 2...\n", - " [A7BC042276933AFCD394AA5E5B0AF80E-37]\n", + " 8C8XX4\n", + " Post-merger, the name of the surviving entity ...\n", + " [076F71B842452D71EA6B0575B498B360-168]\n", " \n", " \n", "\n", @@ -1034,182 +1097,14 @@ ], "text/plain": [ " rp_entity_id bullet \\\n", - "0 07EC43 Cognizant's third-quarter revenue grew 6.5% ye... \n", - "1 07EC43 The company's three-vector AI builder strategy... \n", - "2 07EC43 **Cognizant Technology Solutions Corp.** (CTSH... \n", - "3 07EC43 The company anticipates Q4 revenue growth of 2... \n", + "0 8C8XX4 **Kodiak Building Partners Inc.** enters into ... \n", + "1 8C8XX4 The merger will result in the governance docum... \n", + "2 8C8XX4 Post-merger, the name of the surviving entity ... \n", "\n", - " sources \n", - "0 [BBE5F431FF15019595D005C54ACF2D01-71] \n", - "1 [A7BC042276933AFCD394AA5E5B0AF80E-26] \n", - "2 [92D6D6B73F8D403725D40FEAEAFCCFB0-26] \n", - "3 [A7BC042276933AFCD394AA5E5B0AF80E-37] " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "## United Therapeutics Corp.\n", - "**RP_ENTITY_ID:** `594402` • **Sector:** Health Care • **Industry:** Biotechnology • **Country:** US\n", - "[Website](http://www.unither.com)\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Bullet points:** 4 • **Top sources (ids):** D7877D51406995085B962B6CA4E3E6BE-10, 1079B75F68C08817252813D9417D46F8-149, E26556240FF943FE93B3CCBC18AAB344-2, F38A0B3EEE00EE2521399B8CF7BE7688-5\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "1. The company announces the upcoming launch of Tyvaso DPI 80 microgram cartridges, enhancing patient convenience and expected to capture greater market share in the pulmonary hypertension space.\n", - "\n", - "**Sources:** **Factset Transcripts**\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "2. Results from the TETON-2 study indicate that nebulized Tyvaso significantly improved lung function in patients with idiopathic pulmonary fibrosis, meeting its primary efficacy endpoint and potentially broadening the company's market reach.\n", - "\n", - "**Sources:** [Quartr Reports](https://files.quartr.com/reports/c4c81-2025-10-29-10-15-33.pdf?ref=UmF2ZW5QYWNr)\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "3. **United Therapeutics Corp.** (UTHR) reports record revenue of $799.5 million for Q3 2025, a 7% increase year-over-year, driven by a 22% surge in sales of Tyvaso DPI, despite slightly missing analyst forecasts.\n", - "\n", - "**Sources:** [Yahoo! Finance](https://finance.yahoo.com/news/why-united-therapeutics-uthr-stock-171114364.html)\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "4. Management is exploring partnership opportunities to extend therapies into international markets, leveraging recent clinical data and product innovations to expand the addressable market, particularly in respiratory diseases.\n", - "\n", - "**Sources:** [Yahoo! Finance](https://finance.yahoo.com/news/uthr-q3-deep-dive-clinical-053837133.html)\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Raw table (for copy/export):**" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rp_entity_idbulletsources
0594402The company announces the upcoming launch of T...[D7877D51406995085B962B6CA4E3E6BE-10]
1594402Results from the TETON-2 study indicate that n...[1079B75F68C08817252813D9417D46F8-149]
2594402**United Therapeutics Corp.** (UTHR) reports r...[E26556240FF943FE93B3CCBC18AAB344-2]
3594402Management is exploring partnership opportunit...[F38A0B3EEE00EE2521399B8CF7BE7688-5]
\n", - "
" - ], - "text/plain": [ - " rp_entity_id bullet \\\n", - "0 594402 The company announces the upcoming launch of T... \n", - "1 594402 Results from the TETON-2 study indicate that n... \n", - "2 594402 **United Therapeutics Corp.** (UTHR) reports r... \n", - "3 594402 Management is exploring partnership opportunit... \n", - "\n", - " sources \n", - "0 [D7877D51406995085B962B6CA4E3E6BE-10] \n", - "1 [1079B75F68C08817252813D9417D46F8-149] \n", - "2 [E26556240FF943FE93B3CCBC18AAB344-2] \n", - "3 [F38A0B3EEE00EE2521399B8CF7BE7688-5] " + " sources \n", + "0 [076F71B842452D71EA6B0575B498B360-9, 076F71B84... \n", + "1 [076F71B842452D71EA6B0575B498B360-168] \n", + "2 [076F71B842452D71EA6B0575B498B360-168] " ] }, "metadata": {}, @@ -1244,7 +1139,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "2675c0e1", "metadata": {}, "outputs": [ @@ -1252,7 +1147,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Written 682 rows to output/entities_bullets_1000.xlsx\n" + "Written 5 rows to output/entities_bullets_1000.xlsx\n" ] }, { @@ -1289,14 +1184,14 @@ " \n", " \n", " 0\n", - " A8B137\n", - " Polaris Inc.\n", - " Consumer Goods\n", - " Recreational Products\n", + " R49HQR\n", + " Ethos Technologies Inc.\n", + " Financials\n", + " Life Insurance\n", " US\n", - " http://www.polaris.com\n", - " **Polaris Inc.** (PII) reports strong Q3 resul...\n", - " Polaris Inc.: Q3 2025 Earnings Call\n", + " http://www.ethos.com\n", + " **Ethos Technologies Inc.** launches a new Ind...\n", + " Ethos Technologies, Inc.: Q4 2025 Earnings Call\n", " \n", " \n", " 1\n", @@ -1306,19 +1201,19 @@ " \n", " \n", " \n", - " Polaris anticipates that the expected sale of ...\n", - " Polaris Inc.: Q3 2025 Earnings Call\n", + " The company outlines three growth strategies f...\n", + " Ethos Technologies, Inc.: Q4 2025 Earnings Cal...\n", " \n", " \n", " 2\n", + " 8C8XX4\n", + " Kodiak Building Partners Inc.\n", + " Industrials\n", + " Industrial Suppliers\n", + " US\n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " The company achieved a 21% year-over-year redu...\n", - " Polaris Inc.: Q3 2025 Earnings Call\n", + " **Kodiak Building Partners Inc.** enters into ...\n", + " QXO, Inc. files FORM 8-K on Feb 11, 2026; QXO,...\n", " \n", " \n", " 3\n", @@ -1328,8 +1223,8 @@ " \n", " \n", " \n", - " Operational efficiencies from lean manufacturi...\n", - " Polaris Inc: Q3 2025 Earnings Call on Oct 28, ...\n", + " The merger will result in the governance docum...\n", + " QXO, Inc. files FORM 8-K on Feb 11, 2026\n", " \n", " \n", " 4\n", @@ -1339,266 +1234,41 @@ " \n", " \n", " \n", - " Polaris gained market share in both Off Road a...\n", - " Polaris Inc.: Q3 2025 Earnings Call\n", - " \n", - " \n", - " 5\n", - " 07EC43\n", - " Cognizant Technology Solutions Corp.\n", - " Technology\n", - " Computer Services\n", - " US\n", - " http://www.cognizant.com\n", - " Cognizant's third-quarter revenue grew 6.5% ye...\n", - " COGNIZANT TECHNOLOGY SOLUTIONS CORP files FORM...\n", - " \n", - " \n", - " 6\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " The company's three-vector AI builder strategy...\n", - " Cognizant Technology Solutions Corp.: Q3 2025 ...\n", - " \n", - " \n", - " 7\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " **Cognizant Technology Solutions Corp.** (CTSH...\n", - " Cognizant Technology Solutions Corporation: Q3...\n", - " \n", - " \n", - " 8\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " The company anticipates Q4 revenue growth of 2...\n", - " Cognizant Technology Solutions Corp.: Q3 2025 ...\n", - " \n", - " \n", - " 9\n", - " 594402\n", - " United Therapeutics Corp.\n", - " Health Care\n", - " Biotechnology\n", - " US\n", - " http://www.unither.com\n", - " The company announces the upcoming launch of T...\n", - " United Therapeutics Corp.: Q3 2025 Earnings Call\n", - " \n", - " \n", - " 10\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " Results from the TETON-2 study indicate that n...\n", - " United Therapeutics Corporation: Q3 2025 Earni...\n", - " \n", - " \n", - " 11\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " **United Therapeutics Corp.** (UTHR) reports r...\n", - " Why Is United Therapeutics (UTHR) Stock Soarin...\n", - " \n", - " \n", - " 12\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " Management is exploring partnership opportunit...\n", - " UTHR Q3 Deep Dive: Clinical Pipeline Advances ...\n", - " \n", - " \n", - " 13\n", - " DI7L1U\n", - " CoreWeave Inc.\n", - " Technology\n", - " Computer Services\n", - " US\n", - " http://www.coreweave.com\n", - " **CoreWeave Inc.** (CRWV) announces the launch...\n", - " CoreWeave to Enter the U.S. Federal Market\n", - " \n", - " \n", - " 14\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " The company has entered into a definitive agre...\n", - " CoreWeave announces agreement to acquire Marimo\n", - " \n", - " \n", - " 15\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " Following the termination of its merger agreem...\n", - " CoreWeave 'respects views' of Core Scientific ...\n", - " \n", - " \n", - " 16\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " The acquisition of Marimo will integrate its t...\n", - " CoreWeave announces agreement to acquire Marimo\n", - " \n", - " \n", - " 17\n", - " D69946\n", - " Coinbase Global Inc.\n", - " Financials\n", - " Financial Services\n", - " US\n", - " http://www.coinbase.com\n", - " **Coinbase Global Inc.** (COIN) reports Q3 ear...\n", - " Coinbase Reports Strong Q3 Growth Driven by De...\n", - " \n", - " \n", - " 18\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " Coinbase's acquisition of Deribit, completed o...\n", - " Coinbase Q3 FY2025 Earnings Call Transcript\n", - " \n", - " \n", - " 19\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " The company achieved a net income of $432.6 mi...\n", - " Coinbase Reports Strong Q3 Growth Driven by De...\n", + " Post-merger, the name of the surviving entity ...\n", + " QXO, Inc. files FORM 8-K on Feb 11, 2026\n", " \n", " \n", "\n", "" ], "text/plain": [ - " rp_entity_id entity name sectors \\\n", - "0 A8B137 Polaris Inc. Consumer Goods \n", - "1 \n", - "2 \n", - "3 \n", - "4 \n", - "5 07EC43 Cognizant Technology Solutions Corp. Technology \n", - "6 \n", - "7 \n", - "8 \n", - "9 594402 United Therapeutics Corp. Health Care \n", - "10 \n", - "11 \n", - "12 \n", - "13 DI7L1U CoreWeave Inc. Technology \n", - "14 \n", - "15 \n", - "16 \n", - "17 D69946 Coinbase Global Inc. Financials \n", - "18 \n", - "19 \n", + " rp_entity_id entity name sectors \\\n", + "0 R49HQR Ethos Technologies Inc. Financials \n", + "1 \n", + "2 8C8XX4 Kodiak Building Partners Inc. Industrials \n", + "3 \n", + "4 \n", "\n", - " industry country website \\\n", - "0 Recreational Products US http://www.polaris.com \n", - "1 \n", - "2 \n", - "3 \n", - "4 \n", - "5 Computer Services US http://www.cognizant.com \n", - "6 \n", - "7 \n", - "8 \n", - "9 Biotechnology US http://www.unither.com \n", - "10 \n", - "11 \n", - "12 \n", - "13 Computer Services US http://www.coreweave.com \n", - "14 \n", - "15 \n", - "16 \n", - "17 Financial Services US http://www.coinbase.com \n", - "18 \n", - "19 \n", + " industry country website \\\n", + "0 Life Insurance US http://www.ethos.com \n", + "1 \n", + "2 Industrial Suppliers US \n", + "3 \n", + "4 \n", "\n", - " bulletpoint \\\n", - "0 **Polaris Inc.** (PII) reports strong Q3 resul... \n", - "1 Polaris anticipates that the expected sale of ... \n", - "2 The company achieved a 21% year-over-year redu... \n", - "3 Operational efficiencies from lean manufacturi... \n", - "4 Polaris gained market share in both Off Road a... \n", - "5 Cognizant's third-quarter revenue grew 6.5% ye... \n", - "6 The company's three-vector AI builder strategy... \n", - "7 **Cognizant Technology Solutions Corp.** (CTSH... \n", - "8 The company anticipates Q4 revenue growth of 2... \n", - "9 The company announces the upcoming launch of T... \n", - "10 Results from the TETON-2 study indicate that n... \n", - "11 **United Therapeutics Corp.** (UTHR) reports r... \n", - "12 Management is exploring partnership opportunit... \n", - "13 **CoreWeave Inc.** (CRWV) announces the launch... \n", - "14 The company has entered into a definitive agre... \n", - "15 Following the termination of its merger agreem... \n", - "16 The acquisition of Marimo will integrate its t... \n", - "17 **Coinbase Global Inc.** (COIN) reports Q3 ear... \n", - "18 Coinbase's acquisition of Deribit, completed o... \n", - "19 The company achieved a net income of $432.6 mi... \n", + " bulletpoint \\\n", + "0 **Ethos Technologies Inc.** launches a new Ind... \n", + "1 The company outlines three growth strategies f... \n", + "2 **Kodiak Building Partners Inc.** enters into ... \n", + "3 The merger will result in the governance docum... \n", + "4 Post-merger, the name of the surviving entity ... \n", "\n", - " source \n", - "0 Polaris Inc.: Q3 2025 Earnings Call \n", - "1 Polaris Inc.: Q3 2025 Earnings Call \n", - "2 Polaris Inc.: Q3 2025 Earnings Call \n", - "3 Polaris Inc: Q3 2025 Earnings Call on Oct 28, ... \n", - "4 Polaris Inc.: Q3 2025 Earnings Call \n", - "5 COGNIZANT TECHNOLOGY SOLUTIONS CORP files FORM... \n", - "6 Cognizant Technology Solutions Corp.: Q3 2025 ... \n", - "7 Cognizant Technology Solutions Corporation: Q3... \n", - "8 Cognizant Technology Solutions Corp.: Q3 2025 ... \n", - "9 United Therapeutics Corp.: Q3 2025 Earnings Call \n", - "10 United Therapeutics Corporation: Q3 2025 Earni... \n", - "11 Why Is United Therapeutics (UTHR) Stock Soarin... \n", - "12 UTHR Q3 Deep Dive: Clinical Pipeline Advances ... \n", - "13 CoreWeave to Enter the U.S. Federal Market \n", - "14 CoreWeave announces agreement to acquire Marimo \n", - "15 CoreWeave 'respects views' of Core Scientific ... \n", - "16 CoreWeave announces agreement to acquire Marimo \n", - "17 Coinbase Reports Strong Q3 Growth Driven by De... \n", - "18 Coinbase Q3 FY2025 Earnings Call Transcript \n", - "19 Coinbase Reports Strong Q3 Growth Driven by De... " + " source \n", + "0 Ethos Technologies, Inc.: Q4 2025 Earnings Call \n", + "1 Ethos Technologies, Inc.: Q4 2025 Earnings Cal... \n", + "2 QXO, Inc. files FORM 8-K on Feb 11, 2026; QXO,... \n", + "3 QXO, Inc. files FORM 8-K on Feb 11, 2026 \n", + "4 QXO, Inc. files FORM 8-K on Feb 11, 2026 " ] }, "metadata": {}, @@ -1737,7 +1407,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.9" + "version": "3.11.13" } }, "nbformat": 4,