如何使用 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"]))
)
)
我有两个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"]))
)
)