如何使用 python 和 pandas 中的历史外汇 table 将收入从一种货币转换为另一种货币

how to convert income from one currency into another using a histroical fx table in python with pandas

我有两个dataframes,一个是income df,一个是fx df。我的收入 df 显示不同帐户在不同日期的收入,但它也显示不同货币的额外收入。我的 fx df 显示特定货币对在额外收入进入账户的同一天的汇率。

我想将额外收入的货币转换成与账户相同的货币,例如,23/3 的账户 HP 有额外收入 = 35 英镑,我想将其转换成欧元,因为这是货币的帐户。请注意它必须使用 fx table 因为我有很长的历史数据点要填充和其他帐户所以我不想手动编码 35 * 外汇汇率。最后我想为收入 df 创建另一个列,它将日收入 + 额外收入加在一起 ​​

我不确定如何将两个 df 结合在一起,以便我可以获得该特定日期的正确外汇汇率,以将额外收入的货币转换为账户的货币

我的代码如下

import pandas as pd

income_data = {'date': ['23/3/22', '23/3/22', '24/3/22', '25/3/22'], 'account': ['HP', 'HP', 'JJ', 'JJ'],
        'daily_income': [1000, 1000, 2000, 2000], 'ccy of account': ['EUR', 'EUR', 'USD', 'USD'],
        'extra_income': [50, 35, 10, 12.5], 'ccy of extra_income': ['EUR', 'GBP', 'EUR', 'USD']}

income_df = pd.DataFrame(income_data)

fx_data = {'date': ['23/3/22', '23/3/22', '24/3/22', '25/3/22'], 'EUR/GBP': [0.833522, 0.833522, 0.833621, 0.833066],
        'USD/EUR': [0.90874, 0.90874, 0.91006, 0.90991]}

fx_df = pd.DataFrame(fx_data) 

最终的 df 应该是这样的(我将 fx 汇率翻转为 1/0.833522 以获得一些值)

如果有人能帮助我,我将不胜感激。我最初的想法是合并,但我没有公共专栏,也不确定地图功能是否有效,因为我没有字典。如果我的代码有任何问题,请提前致歉 - 我仍在自学,谢谢!

考虑创建一个公共列以在两个数据框中进行合并。下面使用 assign 添加列和 Series 运算符(算术运算符:+-*/)。

# ADD NEW COLUMN AS CONCAT OF CCY COLUMNS
income_data = income_data.assign(
    currency_ratio = lambda df: df["ccy of account"] + "/" + df["ccy of extra_income"]
)

# ADD REVERSED CURRENCY RATIOS
# RESHAPE WIDE TO LONG FORMAT
fx_data_long = pd.melt(
    fx_data.assign(**{
        "GBP/EUR": lambda df: df["EUR/GBP"].div(-1),
        "EUR/USD": lambda df: df["USD/EUR"].div(-1)
    }),
    id_vars = "date",
    var_name = "currency_ratio",
    value_name = "fx_rate"
)

# MERGE AND CALCULATE
income_data = (
    income_data.merge(
        fx_data_long,
        on = ["date", "currency_ratio"],
        how = "left"
    ).assign(
        total_income = lambda df: df["daily_income"].add(df["extra_income"].mul(df["fx_rate"]))
    )
)