我正在从一个API来源收集汇率数据,并从另一来源收集国际股票价格,并希望以单一货币表示收益。
问题在于,有关符号的信息需要与相应的货币匹配,然后乘以汇率以获取计价收益。
我简直无法集中精力如何最有效地组合这些操作。
如何合并交易品种和汇率信息,然后如何最有效地将结果与股票价格相乘?
示例数据,限制使用的货币和符号少于实际
数据透视数据
Rate Units
Currency Danish krone Euro Swedish krona US dollar Danish krone Euro Swedish krona US dollar
Date
2016-01-04 128,98 9,62 104,22 8,9578 Hundreds Units Hundreds Units
2016-01-05 130 9,69 104,52 8,923 Hundreds Units Hundreds Units
原始FX数据,CSV格式
Exchange rates,Business,Swedish krona,Norwegian krone,Spot,2016-01-04,105.21,2,false,Hundreds,ECB concertation time 14:15 CET
Exchange rates,Business,Swedish krona,Norwegian krone,Spot,2016-01-05,103.95,2,false,Hundreds,ECB concertation time 14:15 CET
Exchange rates,Business,US dollar,Norwegian krone,Spot,2016-01-04,8.8525,4,false,Units,ECB concertation time 14:15 CET
Exchange rates,Business,US dollar,Norwegian krone,Spot,2016-01-05,8.9224,4,false,Units,ECB concertation time 14:15 CET
Exchange rates,Business,Euro,Norwegian krone,Spot,2016-01-04,9.6475,4,false,Units,ECB concertation time 14:15 CET
Exchange rates,Business,Euro,Norwegian krone,Spot,2016-01-05,9.588,4,false,Units,ECB concertation time 14:15 CET
Exchange rates,Business,Danish krone,Norwegian krone,Spot,2016-01-04,129.29,2,false,Hundreds,ECB concertation time 14:15 CET
Exchange rates,Business,Danish krone,Norwegian krone,Spot,2016-01-05,128.52,2,false,Hundreds,ECB concertation time 14:15 CET
也有可能以beta JSON或XML格式获取数据。 https://www.norges-bank.no/en/Statistics/open-data/get-data/
库存数据
Symbols AAPL ASSA-B.ST BMW.DE CARL-B.CO
Date
04.01.2016 00:00 105,37 175,8 94,71 618
05.01.2016 00:00 105,85 175,2 93,5 612
映射数据帧以将符号链接到fx速率
Symbol Currency
AAPL US dollar
ASSA-B.ST Swedish krona
BMW.DE Euro
CARL-B.CO Danish krone
我无法使用python生成的预期输出是
Symbols AAPL ASSA-B.ST BMW.DE CARL-B.CO
Date
04.01.2016 00:00 943,88 183,22 911,35 797,10
05.01.2016 00:00 944,50 183,12 906,72 795,60
货币换算的公式是价格*货币单位的货币, 和价格*货币/ 100,代表数百种货币。
答案 0 :(得分:0)
忍受我,因为需要进行一些清洁和调整才能获得所需的结果;
首先,请提供数据轻松转换为输入以供他人使用。纯文本,.csv和.xlsx通常是最好的。
为数据框设置子集,并将“费率”转换为单位:
df1 = df1.rename(columns = {2:'Currency', 5:'Date', 6:'Rate', 9:'UoM'})
df1 = df1[['Currency', 'Date', 'Rate', 'UoM']]
df1['Rate'] = np.where(df1.UoM == 'Hundreds', df1.Rate / 100, df1.Rate)
Currency Date Rate UoM
0 Swedish krona 2016-01-04 1.0521 Hundreds
1 Swedish krona 2016-01-05 1.0395 Hundreds
2 US dollar 2016-01-04 8.8525 Units
3 US dollar 2016-01-05 8.9224 Units
4 Euro 2016-01-04 9.6475 Units
5 Euro 2016-01-05 9.5880 Units
6 Danish krone 2016-01-04 1.2929 Hundreds
7 Danish krone 2016-01-05 1.2852 Hundreds
您的“库存数据”为df2(除了将值中的“。”替换为“。”之外,我还必须清理该部分,日期时间格式与您提供的其他数据不同); < / p>
df2
AAPL ASSA-B.ST BMW.DE CARL-B.CO
Date
2016-01-04 105.37 175.8 94.71 618
2016-01-05 105.85 175.2 93.50 612
此处的“符号”框架为df3。通过合并将符号添加到df1,然后通过groupby获得类似于“ stock-data”(df2)的数据框;
merg = pd.merge(df1, df3, on='Currency')
df1['Date'] = pd.to_datetime(df1['Date'])
merg = merg.groupby(['Date', 'Symbol'])['Rate'].sum().unstack()
merg
Symbol AAPL ASSA-B.ST BMW.DE CARL-B.CO
Date
2016-01-04 8.8525 1.0521 9.6475 1.2929
2016-01-05 8.9224 1.0395 9.5880 1.2852
将两个数据框格式化为数字格式,将其相乘并四舍五入到小数点后两位;
cols = merg.columns
merg[cols] = merg[cols].apply(pd.to_numeric, errors='coerce')
cols2 = df2.columns
df2[cols2] = df2[cols2].apply(pd.to_numeric, errors='coerce')
fin = merg.mul(df2)
fin.round(2)
Symbol AAPL ASSA-B.ST BMW.DE CARL-B.CO
Date
2016-01-04 932.79 184.96 913.71 799.01
2016-01-05 944.44 182.12 896.48 786.54
注意;最后的值与您的不同。那是因为您以后提供的数据是不同的。