Я хотел бы добавить столбец в моей df, чтобы показать пиксельные координаты точек, нанесенные в виде линейной диаграммы. Моя цель - получить координаты y двух линейных диаграмм, которые были наложены друг на друга на разных осях y , и найти разницу между каждой парой координат y.
Я черпал вдохновение из этого другого ответа StackOverflow , похожего на него, и пытался применить его. Код не удался на этом этапе:
fig_main.transData.transform(np.vstack([x,y]).T)
Ошибка была:
Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe'
Я думаю, это довольно очевидно, я на самом деле не понимаю, какого черта я здесь делаю.
Мой код такой:
import investpy
import pandas as pd
import matplotlib
#raw data
spot_df = investpy.get_currency_cross_historical_data(currency_cross = "AUD/SGD", from_date = "01/01/2018", to_date = "05/02/2020")
base_yield_df = investpy.bonds.get_bond_historical_data(bond = "Australia 2Y", country = "Australia", from_date = "01/01/2018", to_date = "05/02/2020")
quote_yield_df = investpy.bonds.get_bond_historical_data(bond = "Singapore 2Y", country = "Singapore", from_date = "01/01/2018", to_date = "05/02/2020")
#data munging
df = pd.merge(spot_df["Close"],base_yield_df["Close"], how='inner', left_index=True, right_index=True)
df = pd.merge(df, quote_yield_df["Close"], how='inner', left_index=True, right_index=True)
df.columns = ["AUD/SGD", "base", "quote"]
df["2Y Spread"] = df["base"]/df["quote"]
df
#creating subplot
fig = plt.figure(figsize = [15, 9] )
gs = fig.add_gridspec(3, 2)
fig_main = fig.add_subplot(gs[0:2,:])
#plotting data points
points, = fig_main.plot(df["2Y Spread"], label = "2Y Spread", color = "red")
fig_main = fig_main.twinx()
fig_main.plot(df["AUD/SGD"], label = "AUD/SGD", color = "green")
#attempt to obtain coordinates of data points
x, y = points.get_data()
xy_pixels = fig_main.transData.transform(np.vstack([x,y]).T)
xpix, ypix = xy_pixels.T
xpxi, ypix
#another subplot to display the difference in y-coordinate of the two line graphs
fig_main = fig.add_subplot(gs[2,:])
Вы можете раскомментировать последнюю строку, чтобы увидеть кадр данных, в противном случае вы должны увидеть диаграмму.