熊猫:将汇率查询乘以另一个数据框的相同日期后,按每日金额求和和汇总

Posted

技术标签:

【中文标题】熊猫:将汇率查询乘以另一个数据框的相同日期后,按每日金额求和和汇总【英文标题】:Pandas: Sum and aggregate by daily amounts after multiplying exchange rates look-up by same dates from another dataframe 【发布时间】:2021-12-01 19:07:36 【问题描述】:

提前感谢您的帮助。

我对 Python 完全陌生,我尝试了不同的方法来实现所需的内容(主要使用 groupby()),但到目前为止一切都失败了。

我有一个数据框,其中包含同一天以不同货币进行的多笔交易(116200 行):

Index Account No Withdrawal AMT Deposit AMT Dates Currency
0 12345567 100 300 2015-01-01 eur
1 12345567 100 300 2015-01-01 usd
2 12345567 100 300 2015-01-01 gbp
3 12345567 100 300 2015-01-01 eur
4 34334123 100 300 2015-01-02 usd
5 34334123 100 300 2015-01-02 gbp

我有两个单独的数据框,其中包含每天的汇率(一个用于欧元兑英镑,一个用于美元兑英镑):

Index EURO-GBP Dates
0 1.634 2015-01-01
1 1.6676 2015-01-02
2 1.4554 2015-01-03
3 1.23455 2015-01-04
Index USD-GBP Dates
0 0.934 2015-01-01
1 0.943 2015-01-02
2 0.834 2015-01-03
3 0.945 2015-01-04

首先,我需要想办法将数据帧的第一个值转换为 GBP。正如您所注意到的,每天都包含不同货币的交易,所以任何关于如何做到这一点的提示都将不胜感激!

然后,我想创建一个同一天每行只有一天的数据框,即将每一行与相应的每日取款和存款列的总和合并:

Index Withdrawal AMT Deposit AMT Dates Currency
0 1000 600 2015-01-01 GBP
1 3000 500 2015-01-02 GBP
2 2000 700 2015-01-03 GBP

再次感谢您花时间阅读我的帖子!

附:所有数字都是随机的!

【问题讨论】:

在您的交换数据框中取平均值。然后根据日期将此表与您的事务表合并。现在您可以将汇率乘以金额。 【参考方案1】:

你可以这样做:

(假设您的主数据框名为df1,汇率数据框为df_xr_eurdf_xr_usd):

# Split the main dataframe by currency
df1_eur = df1[df1['Currency'] == 'eur'].copy()
df1_usd = df1[df1['Currency'] == 'usd'].copy()
df1_gbp = df1[df1['Currency'] == 'gbp'].copy()

# Calculate GBP equivalent of currency values
df1_eur['Withdrawal AMT'] *= df1_eur['Dates'].map(df_xr_eur.set_index('Dates')['EURO-GBP'])
df1_eur['Deposit AMT'] *= df1_eur['Dates'].map(df_xr_eur.set_index('Dates')['EURO-GBP'])

df1_usd['Withdrawal AMT'] *= df1_usd['Dates'].map(df_xr_usd.set_index('Dates')['USD-GBP'])
df1_usd['Deposit AMT'] *= df1_usd['Dates'].map(df_xr_usd.set_index('Dates')['USD-GBP'])

# Assemble the previously split datrframes after exchange rate calculation
df2 = pd.concat([df1_eur, df1_usd, df1_gbp]).assign(Currency='GBP')

# Aggregate by `Dates`
df_final = df2.groupby('Dates').agg('Withdrawal AMT': 'sum',
                                     'Deposit AMT': 'sum',
                                     'Currency': 'first'
                                    ).reset_index()

结果:

print(df_final)


        Dates  Withdrawal AMT  Deposit AMT Currency
0  2015-01-01           520.2       1560.6      GBP
1  2015-01-02           194.3        582.9      GBP

【讨论】:

非常感谢您!我被困在最后一行代码中!我收到错误“TypeError:+ 的不支持的操作数类型:'int' 和 'str'”。我将取款和存款转换为数字,但由于某种原因,我无法使用此代码 ```str(df_2["Currency"]) 将货币转换为字符串(是货币对象)。有什么建议吗? @SpaniasCharalampos 是的,如果您的金额列是字符串类型,您必须先转换它们。您可以通过例如转换它们df1_usd['Withdrawal AMT'] = df1_usd['Withdrawal AMT'].astype(float)。对于货币的字符串类型,您可能不需要转换它,因为我们没有对其求和。 @SpaniasCharalampos 但是如果您的金额字段不是数字,这似乎很奇怪,我们的计算步骤也应该失败。在运行最后一行之前,可以通过df2.dtypes检查df2的数据类型来检查数据类型。 如果我继续并在您的初始代码处计算货币价值的英镑等值:transactions_eur['WITHDRAWAL AMT'] *= transactions_eur['dates_parsed'].map(euro_rates.set_index('dates_parsed')['EUR-GBP']),那么“取款”列将充满 NaN。在执行此步骤之前,我尝试转换为浮点数:transactions_eur["WITHDRAWAL AMT"].astype(float) 但是当我使用以下代码检查类型时,它们仍然是一个对象! transactions_eur["WITHDRAWAL AMT"] 结果在最后一步出现类型错误。 @SpaniasCharalampos 当货币数据框中的Dates 不匹配时,会出现NaN 值。您必须确保货币数据框包含主数据框中的每个 Dates。此外,两个数据框中的日期格式必须相同(否则,无法匹配日期)。

以上是关于熊猫:将汇率查询乘以另一个数据框的相同日期后,按每日金额求和和汇总的主要内容,如果未能解决你的问题,请参考以下文章

熊猫:使用数据框的多列作为另一个的索引

将过滤后的行乘以熊猫中的常量

从另一个数据框中删除包含相同日期的行-python-大熊猫

按日期迭代熊猫数据框的正确方法

来自另一个数据框的熊猫多索引分配

更改 Pandas 数据框的日期类型