I have a client who has a Python code that they run to pull EPS FY2026 numbers
However they say that every so often (about once every 5 attempts), it returns values for FY2025 instead
They are seeking help to have the code checked to see what might be causing this
Screenshot from the client has been provided as well
Please see below and kindly check and provide your insight please:
"""
Self-contained script to debug detail estimate downloads.
Reproduces issue: FY1 query sometimes returns FY2025 instead of FY2026.
Requirements: lseg, polars, pandas (all pip-installable).
"""
from enum import unique
import logging
import time
import lseg.data as ld
import pandas as pd
import polars as pl
pd.set_option('future.no_silent_downcasting', True)
e = pl.col
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s | %(levelname)-7s | %(message)s',
datefmt='%H:%M:%S',
)
logger = logging.getLogger(__name__)
# %% Define the TR fields we want for EPS FY1
MEASURE = 'EPS'
PERIOD = 'FY1'
FIELDS = [
('est', f'TR.{MEASURE}EstValue(Period={PERIOD})'),
('date2', f'TR.{MEASURE}EstValue(Period={PERIOD}).origdate'),
('date', f'TR.{MEASURE}EstValue(Period={PERIOD}).date'),
('isexcluded', f'TR.{MEASURE}EstValue(Period={PERIOD}).isexcluded'),
('broker', f'TR.{MEASURE}EstValue(Period={PERIOD}).brokername'),
('calcdate', f'TR.{MEASURE}EstValue(Period={PERIOD}).calcdate'),
('revdate', f'TR.{MEASURE}EstValue(Period={PERIOD}).confirmdate'),
('fperiod', f'TR.{MEASURE}EstValue(Period={PERIOD}).fperiod'),
('rfperiod', f'TR.{MEASURE}EstValue(Period={PERIOD}).rfperiod'),
('est_mean', f'TR.{MEASURE}Mean(Period={PERIOD})'),
('est_smart', f'TR.{MEASURE}SmartEst(Period={PERIOD})'),
('prev_est', f'TR.{MEASURE}EstValue(Period={PERIOD},OutputOptions=Prev)'),
(
'prev_date2',
f'TR.{MEASURE}EstValue(Period={PERIOD},OutputOptions=Prev).origdate',
),
('prev_date', f'TR.{MEASURE}EstValue(Period={PERIOD},OutputOptions=Prev).date'),
(
'prev_isexcluded',
f'TR.{MEASURE}EstValue(Period={PERIOD},OutputOptions=Prev).isexcluded',
),
(
'prev_broker',
f'TR.{MEASURE}EstValue(Period={PERIOD},OutputOptions=Prev).brokername',
),
(
'prev_calcdate',
f'TR.{MEASURE}EstValue(Period={PERIOD},OutputOptions=Prev).calcdate',
),
(
'prev_revdate',
f'TR.{MEASURE}EstValue(Period={PERIOD},OutputOptions=Prev).confirmdate',
),
(
'prev_fperiod',
f'TR.{MEASURE}EstValue(Period={PERIOD},OutputOptions=Prev).fperiod',
),
(
'prev_rfperiod',
f'TR.{MEASURE}EstValue(Period={PERIOD},OutputOptions=Prev).rfperiod',
),
]
TR_FIELDS = [f[1] for f in FIELDS]
RENAMES = {f[1].upper(): f[0] for f in FIELDS} | {'Instrument': 'ticker'}
def fetch_eps_fy1(universe: list) -> pl.DataFrame:
"""Fetch EPS FY1 detail estimates for a list of instruments."""
data = ld.get_data(universe, fields=TR_FIELDS, header_type=ld.HeaderType.NAME)
df = pl.DataFrame(data).rename(RENAMES)
return df
# %% Open LSEG session (Workspace must be running)
session = ld.open_session()
# %% Run it
universe = ['6143998']
if __name__ == '__main__':
count = 0
seen_fy = ['FY2025', 'FY2026']
while True:
logger.info('--- Iteration %d ---', count + 1)
df = fetch_eps_fy1(universe)
unique_fperiods = df.select('fperiod').unique().to_series().to_list()
unique_rfperiods = df.select('rfperiod').unique().to_series().to_list()
logger.info(
'%d rows, fperiods: %s, rfperiods: %s',
df.shape[0],
unique_fperiods,
unique_rfperiods,
)
logger.info(
'Sample:\n%s',
str(
df.select(
['ticker', 'est', 'date', 'fperiod', 'rfperiod', 'broker']
).head(3)
),
)
unique_fperiods = set(unique_fperiods)
seen_fy = [fy for fy in seen_fy if fy not in unique_fperiods]
if 'FY2025' in unique_fperiods:
logger.warning(
'!!!!!!!!!!!! Unexpected FY2025 in fperiods: %s', unique_fperiods
)
if len(seen_fy) == 0:
logger.info('Both FY2025 and FY2026 have been seen. Ending test.')
break
count += 1
time.sleep(5)