xbbg icon indicating copy to clipboard operation
xbbg copied to clipboard

BUG: `ValueError` when calling `BDH` with currency overrides

Open jgmarcel opened this issue 1 year ago • 0 comments

Reproducible Example

import datetime
from xbbg import blp

fields = [
    "PX_OPEN",
    "PX_HIGH",
    "PX_LOW",
    "PX_LAST",
    "PX_VOLUME",
    "EQY_WEIGHTED_AVG_PX",
]
tickers = [
    "CC1 Comdty",
    "CO1 Comdty",
    "CRB CMDT Index",
    "CT1 Comdty",
    "DA1 Comdty",
    "KC1 Comdty",
    "LC1 Comdty",
    "LH1 Comdty",
    "RR1 Comdty",
    "S 1 Comdty",
    "SB1 Comdty",
    "W 1 Comdty",
]
start_date = datetime.date(1993, 3, 12)
end_date = datetime.date(2023, 3, 12)
currency = "INR"
df = blp.bdh(
    tickers=tickers,
    flds=fields,
    start_date=start_date,
    end_date=end_date,
    currency=currency,
)

Issue Description

When running the snippet above in a Jupyter cell results:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[77], line 1
----> 1 df = blp.bdh(tickers=tickers, flds=fields, start_date=start_date, end_date=end_date, currency=currency)

File ~\miniconda3\envs\foot\Lib\site-packages\xbbg\blp.py:187, in bdh(tickers, flds, start_date, end_date, adjust, **kwargs)
    181 if res.empty or any(fld not in res for fld in ['ticker', 'date']):
    182     return pd.DataFrame()
    184 return (
    185     res
    186     .set_index(['ticker', 'date'])
--> 187     .unstack(level=0)
    188     .rename_axis(index=None, columns=[None, None])
    189     .swaplevel(0, 1, axis=1)
    190     .reindex(columns=utils.flatten(tickers), level=0)
    191     .reindex(columns=utils.flatten(flds), level=1)
    192 )

File ~\miniconda3\envs\foot\Lib\site-packages\pandas\core\frame.py:9112, in DataFrame.unstack(self, level, fill_value)
   9050 """
   9051 Pivot a level of the (necessarily hierarchical) index labels.
   9052 
   (...)
   9108 dtype: float64
   9109 """
   9110 from pandas.core.reshape.reshape import unstack
-> 9112 result = unstack(self, level, fill_value)
   9114 return result.__finalize__(self, method="unstack")

File ~\miniconda3\envs\foot\Lib\site-packages\pandas\core\reshape\reshape.py:476, in unstack(obj, level, fill_value)
    474 if isinstance(obj, DataFrame):
    475     if isinstance(obj.index, MultiIndex):
--> 476         return _unstack_frame(obj, level, fill_value=fill_value)
    477     else:
    478         return obj.T.stack(dropna=False)

File ~\miniconda3\envs\foot\Lib\site-packages\pandas\core\reshape\reshape.py:499, in _unstack_frame(obj, level, fill_value)
    497 def _unstack_frame(obj: DataFrame, level, fill_value=None):
    498     assert isinstance(obj.index, MultiIndex)  # checked by caller
--> 499     unstacker = _Unstacker(obj.index, level=level, constructor=obj._constructor)
    501     if not obj._can_fast_transpose:
    502         mgr = obj._mgr.unstack(unstacker, fill_value=fill_value)

File ~\miniconda3\envs\foot\Lib\site-packages\pandas\core\reshape\reshape.py:137, in _Unstacker.__init__(self, index, level, constructor)
    129 if num_cells > np.iinfo(np.int32).max:
    130     warnings.warn(
    131         f"The following operation may generate {num_cells} cells "
    132         f"in the resulting pandas object.",
    133         PerformanceWarning,
    134         stacklevel=find_stack_level(),
    135     )
--> 137 self._make_selectors()

File ~\miniconda3\envs\foot\Lib\site-packages\pandas\core\reshape\reshape.py:189, in _Unstacker._make_selectors(self)
    186 mask.put(selector, True)
    188 if mask.sum() < len(self.index):
--> 189     raise ValueError("Index contains duplicate entries, cannot reshape")
    191 self.group_index = comp_index
    192 self.mask = mask

ValueError: Index contains duplicate entries, cannot reshape

Expected Behavior

The code above should return a valid DataFrame.

Installed Versions

>pip show blpapi xbbg
Name: blpapi
Version: 3.19.3
Summary: Python SDK for Bloomberg BLPAPI
Home-page: http://www.bloomberglabs.com/api/
Author: Bloomberg L.P.
Author-email: [email protected]
License:
Location: ~\miniconda3\envs\foot\Lib\site-packages
Requires:
Required-by:
---
Name: xbbg
Version: 0.7.7
Summary: Intuitive Bloomberg data API
Home-page: https://github.com/alpha-xone/xbbg
Author: Alpha x1
Author-email: [email protected]
License: Apache
Location: ~\miniconda3\envs\foot\Lib\site-packages
Requires: numpy, pandas, pyarrow, pytest, pytz, ruamel.yaml
Required-by:
INSTALLED VERSIONS
------------------
commit           : 2e218d10984e9919f0296931d92ea851c6a6faf5
python           : 3.11.0.final.0
python-bits      : 64
OS               : Windows
OS-release       : 10
Version          : 10.0.19044
machine          : AMD64
processor        : Intel64 Family 6 Model 142 Stepping 9, GenuineIntel
byteorder        : little
LC_ALL           : None
LANG             : None
LOCALE           : English_United States.1252

pandas           : 1.5.3
numpy            : 1.24.2
pytz             : 2022.7.1
dateutil         : 2.8.2
setuptools       : 67.6.0
pip              : 23.0.1
Cython           : None
pytest           : 7.2.2
hypothesis       : None
sphinx           : None
blosc            : None
feather          : None
xlsxwriter       : None
lxml.etree       : 4.9.2
html5lib         : 1.1
pymysql          : None
psycopg2         : 2.9.5
jinja2           : None
IPython          : 8.11.0
pandas_datareader: None
bs4              : 4.11.2
bottleneck       : None
brotli           : 
fastparquet      : None
fsspec           : 2023.3.0
gcsfs            : None
matplotlib       : 3.7.1
numba            : None
numexpr          : None
odfpy            : None
openpyxl         : 3.1.1
pandas_gbq       : None
pyarrow          : 11.0.0
pyreadstat       : None
pyxlsb           : None
s3fs             : None
scipy            : None
snappy           : None
sqlalchemy       : 2.0.5.post1
tables           : None
tabulate         : None
xarray           : None
xlrd             : 2.0.1
xlwt             : None
zstandard        : None
tzdata           : None

jgmarcel avatar Mar 13 '23 12:03 jgmarcel