|
27 | 27 | 'subscribe', |
28 | 28 | 'adjust_ccy', |
29 | 29 | 'turnover', |
| 30 | + 'bql', |
30 | 31 | 'active_futures', |
31 | 32 | 'fut_ticker', |
32 | 33 | 'cdx_ticker', |
@@ -740,3 +741,45 @@ def turnover( |
740 | 741 |
|
741 | 742 | if data.empty and use_volume.empty: return pd.DataFrame() |
742 | 743 | return pd.concat([adjust_ccy(data=data, ccy=ccy).div(factor), use_volume], axis=1) |
| 744 | + |
| 745 | + |
| 746 | +def bql(query: str, params: dict | None = None, overrides: list[tuple[str, object]] | None = None, **kwargs) -> pd.DataFrame: |
| 747 | + r"""Execute a BQL (Bloomberg Query Language) request. |
| 748 | +
|
| 749 | + Args: |
| 750 | + query: BQL query string. |
| 751 | + params: Optional request options for BQL (mapped directly to elements). |
| 752 | + overrides: Optional list of (field, value) overrides for the BQL request. |
| 753 | + **kwargs: Session and logging options. |
| 754 | +
|
| 755 | + Returns: |
| 756 | + pd.DataFrame: Parsed tabular results when available; otherwise a flattened view. |
| 757 | +
|
| 758 | + Examples: |
| 759 | + Basic usage (requires Bloomberg session; skipped in doctest): |
| 760 | +
|
| 761 | + >>> from xbbg import blp # doctest: +SKIP |
| 762 | + >>> df = blp.bql("get(px_last for('AAPL US Equity'))") # doctest: +SKIP |
| 763 | + >>> isinstance(df, pd.DataFrame) # doctest: +SKIP |
| 764 | + True |
| 765 | + """ |
| 766 | + logger = logs.get_logger(bql, **kwargs) |
| 767 | + |
| 768 | + # Use BQL sendQuery with 'expression', mirroring common BQL request shape. |
| 769 | + settings = [('expression', query)] |
| 770 | + if params: |
| 771 | + settings.extend([(str(k), v) for k, v in params.items()]) |
| 772 | + |
| 773 | + request = process.create_request( |
| 774 | + service='//blp/bql', |
| 775 | + request='sendQuery', |
| 776 | + settings=settings, |
| 777 | + ovrds=overrides or [], |
| 778 | + **kwargs, |
| 779 | + ) |
| 780 | + |
| 781 | + logger.debug(f'Sending BQL request ...\n{request}') |
| 782 | + handle = conn.send_request(request=request, **kwargs) |
| 783 | + |
| 784 | + rows = list(process.rec_events(func=process.process_bql, event_queue=handle["event_queue"], **kwargs)) |
| 785 | + return pd.DataFrame(rows) if rows else pd.DataFrame() |
0 commit comments