如何合并两个数据框,然后将结果与另一个数据框相乘?

时间:2019-01-10 19:33:01

标签: python pandas dataframe matrix-multiplication

我正在从一个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,代表数百种货币。

1 个答案:

答案 0 :(得分:0)

忍受我,因为需要进行一些清洁和调整才能获得所需的结果;

首先,请提供数据轻松转换为输入以供他人使用。纯文本,.csv和.xlsx通常是最好的。

  1. 为数据框设置子集,并将“费率”转换为单位:

    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
    
  2. 您的“库存数据”为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
    
  3. 此处的“符号”框架为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
    
  4. 将两个数据框格式化为数字格式,将其相乘并四舍五入到小数点后两位;

    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
    

注意;最后的值与您的不同。那是因为您以后提供的数据是不同的。