如何合并两个数据帧,然后将结果与不同的数据帧相乘?

2024-10-02 10:28:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我从一个API数据源收集汇率数据,从另一个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 

原始外汇数据,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

还可以获取测试版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

将数据帧映射到链接符号到汇率

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。你知道吗


Tags: 数据falseexchangetime货币businessunitsrates
1条回答
网友
1楼 · 发布于 2024-10-02 10:28:06

忍受我,因为有一些清洁和调整做得到的结果需要

首先,请提供易于转换为输入的数据供其他人使用。纯文本、.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. 您的“stock data”是df2(我必须清理该部分,datetime格式与您提供的其他数据不同,此外还交换了值中的“,”for“.”)

    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。使用merge和groupby将符号添加到df1,得到类似于“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. 将两个数据帧格式化为数字,将数据帧相乘并舍入为2位小数

    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
    

注意:最后的值与您的不同。那是因为你稍后提供的数据是不同的。你知道吗

相关问题 更多 >

    热门问题