For a deeper look into our Eikon Data API, look into:

Overview |  Quickstart |  Documentation |  Downloads |  Tutorials |  Articles

question

Upvotes
Accepted
20 1 2 2

Merging historical and forecast dataframe yields duplicates

I get duplicate cells when I merge two dataframes: one containing historical data, a second containing forecast data, as follows:

tkrrenew = ['0916.HK', '0958.HK', '0451.HK', '1798.HK']
fdflds = ['CF_NAME', 'TR.EBITDA.rfperiod', 'TR.BasicEpsExclExtraItems.Currency', 'TR.BasicEpsExclExtraItems', 'TR.DpsCommonStock']
param = {'Period': 'FY0', 'SDate': 'FY-2', 'EDate': 'FY0', 'FRQ': 'FY'}
valrenew, err = ek.get_data(tkrrenew, fdflds, param)


frcstfld = ['CF_NAME', 'TR.EPSSmartEst.rfperiod', 'TR.EPSSmartEst', 'TR.DPSMean']
paramfcst = {'Period': 'FY1', 'SDate': '0', 'EDate': '2', 'FRQ': 'FY'}
fcstrenew, err = ek.get_data(tkrrenew, frcstfld, paramfcst)

testrenew = valrenew.merge(fcstrenew, on=['Instrument', 'Name'], how='inner')

The output, after some other commands is as follows:

Apart from .drop_duplicate(subset=['Instrument', 'FY']) which leaves me with:

What can I do to have both historical and forecast data till FY3 in one dataframe. If .join or .append can place the FY1-FY3 in the same column as FY-2 to FY0, that would ideal.

Pls advise.

eikoneikon-data-apiworkspaceworkspace-data-apirefinitiv-dataplatform-eikonpythondatahistorical
eikon.png (29.1 KiB)
eikon2.png (21.2 KiB)
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 5.0 MiB each and 10.0 MiB total.

Upvotes
Accepted
39.2k 75 11 27

Is this what you're looking for?
valrenew.merge(fcstrenew, on=['Instrument', 'Financial Period Relative' ], how='outer')
This will give you


You can then sort the resulting dataframe on Instrument and then Financial Period Relative column to get chronological view grouped by the stock. You can remove duplicate CF_NAME column (CF_NAME_x or CF_NAME_y), or you can drop CF_NAME field from one of the requests.


mergeddataframe.png (44.1 KiB)
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 5.0 MiB each and 10.0 MiB total.

Upvotes
20 1 2 2

Thanks, Alex & Wasin.

I've rewritten my code such that it now goes as follows:

dffrkFY0 = dffrank[dffrank.FY == 'FY0'] #extract FY0 data
dffrkFY1 = dffrank[dffrank.FY == 'FY-1'] #extract FY-1 data
dffrkFY1.columns = [['Instrument', 'Name', 'FYE', 'RpCrncy','EstEPS','EstDPS','EstBVPS','PxCrncy','Price',\
                     'FXCode', 'FXRate', 'EstPER', 'EstPB', 'EstD_Yld']]

# dffwd is an earlier DataFrame

dffmerge = pd.concat([dffwd, dffrkFY0, dffrkFY1], join='inner')
dffmerge = dffmerge.sort_values(['Instrument', 'FYE'])
dffmerge = dffmerge.reset_index(drop=True)
dffmerge[:15]

Thanks for your effort; much appreciated.

Later on in the code, I re-jig the <Name> such that it doesn't appear at such an odd position.


dtframe.png (39.1 KiB)
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 5.0 MiB each and 10.0 MiB total.

Click below to post an Idea Post Idea