Как объединить два фрейма данных, а затем умножить результат с другим фреймом данных? - PullRequest
0 голосов
/ 10 января 2019

Я собираю данные обменного курса из одного источника API и международные цены на акции из другого источника, и хочу, чтобы деноминированные доходы отражались в одной валюте.

Проблема в том, что информация о символах должна быть сопоставлена ​​с соответствующей валютой, а затем умножена на обменный курс, чтобы получить деноминированную прибыль.

Я просто не могу понять, как наиболее эффективно объединить эти операции.

Как я могу объединить информацию о символе и обменном курсе, и как мне затем наиболее эффективно умножить результат с ценами на акции?

Пример данных, количество валют и символов меньше, чем в действительности

Pivoted fx data

                           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

Также возможно получить данные в бета-формате JSON или XML. https://www.norges -bank.no / ен / Статистика / открытых данных / получить-данные /

Данные по запасам

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 для валют сотнями.

1 Ответ

0 голосов
/ 12 января 2019

Терпите меня, потому что есть некоторая очистка и настройка, чтобы получить необходимый результат;

Во-первых, пожалуйста, предоставьте данные, которые легко преобразовать во входные для других пользователей. Обычный текст, .csv и .xlsx обычно лучше всего.

  1. подмножество вашего фрейма данных и преобразование 'Rate' в единицы:

    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 (мне пришлось очистить эту часть, формат даты и времени отличается от других предоставленных вами данных, в дополнение к замене значений «,» на «.»);

    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 с помощью слияния, а затем сгруппируйте, чтобы получить кадр данных, аналогичный «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
    

примечание; значения в конце отличаются от ваших. это потому, что данные, которые вы предоставили позже, отличаются.

...