熊猫:将汇率查询乘以另一个数据框的相同日期后,按每日金额求和和汇总
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_eur
和df_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
。此外,两个数据框中的日期格式必须相同(否则,无法匹配日期)。以上是关于熊猫:将汇率查询乘以另一个数据框的相同日期后,按每日金额求和和汇总的主要内容,如果未能解决你的问题,请参考以下文章