通过循环合并两个字典中的数据帧



尽量保持这个相对简单,但如果你需要更多的信息,请告诉我。

我有两个字典,每个字典由三个数据帧组成,这些数据帧通过循环产生,然后添加到字典中。它们有相同的键['XAUUSD', 'EURUSD', 'GBPUSD']:

trades_dict

{'XAUUSD': df_trades_1
'EURUSD': df_trades_2
'GBPUSD': df_trades_3}

prices_dict

{'XAUUSD': df_prices_1
'EURUSD': df_prices_2
'GBPUSD': df_prices_3}

我想合并最近时间戳上的表,以产生3个新的数据框,这样XAUUSD交易数据框与相应的XAUUSD价格数据框合并,等等

我已经能够在一个循环中使用:

df_merge_list = []
for trades in trades_dict.values():
for prices in prices_dict.values():
df_merge = pd.merge_asof(trades, prices, left_on='transact_time', right_on='time', direction='backward')
df_merge_list.append(df_merge)

然而,这会产生一个9个数据帧的列表,XAUUSD交易+ XAUUSD价格,XAUUSD交易+ EURUSD价格,XAUUSD交易+ GBPUSD价格等。

是否有一种方法可以让我只连接键相同的数据帧?我假设它需要像这样:if trades_dict.keys() == prices_dict.keys():

df_merge_list = []
for trades in trades_dict.values():
for prices in prices_dict.values():
if trades_dict.keys() == prices_dict.keys():
df_merge = pd.merge_asof(trades, prices, left_on='transact_time', right_on='time', direction='backward')
df_merge_list.append(df_merge)

但是我得到了和上面相同的结果

我接近了吗?我怎样才能对所有的仪器都这样做,并且只产生我需要的3个输出?任何帮助都是感激的

Thanks in advance

"""
Pseudocode :
For each key in the list of keys in trades_dict :
Pick that key's value (trades df) from trades_dict
Using the same key, pick corresponding value (prices df) from prices_dict
Merge both values (trades & prices dataframes)
"""
df_merge_list = []
for key in trades_dict.keys():
trades = trades_dict[key]
prices = prices_dict[key] # using the same key to get corresponding prices
df_merge = pd.merge_asof(trades, prices, left_on='transact_time', right_on='time', direction='backward')
df_merge_list.append(df_merge)

有问题的代码出了什么问题?

  1. 嵌套for循环创建笛卡尔积

    外循环3次迭代乘以内循环3次迭代= 9次迭代

  2. 9次迭代trades_dict.keys() == prices_dict.keys()的结果均为True

    dict_a_all_keys == dict_b_all_keysdict_a_key_1 == dict_b_key_1不相同。因此,你可以遍历dictionary的键并检查它们是否在嵌套循环中匹配,就像这样:

df_merge_list = []
for trades_key in trades_dict.keys():
for prices_key in prices_dict.keys():
if trades_key == prices_key:
trades = trades_dict[trades_key]
prices = prices_dict[trades_key] # since trades_key is same as prices_key, they are interchangeable
df_merge = pd.merge_asof(trades, prices, left_on='transact_time', right_on='time', direction='backward')
df_merge_list.append(df_merge)

您需要以可重复的形式提供具有正确列名的确切数据框,但是您可以使用如下的字典:

import numpy as np
import pandas as pd
np.random.seed(42)
df_trades_1 = df_trades_2 = df_trades_3 = pd.DataFrame(np.random.rand(10, 2), columns = ['ID1', 'Val1'])
df_prices_1 = df_prices_2 = df_prices_3 = pd.DataFrame(np.random.rand(10, 2), columns = ['ID2', 'Val2'])
trades_dict = {'XAUUSD':df_trades_1, 'EURUSD':df_trades_2, 'GBPUSD':df_trades_3}
prices_dict = {'XAUUSD':df_prices_1, 'EURUSD':df_prices_2, 'GBPUSD':df_prices_3}
frames ={}
for t in trades_dict.keys():
frames[t] = (pd.concat([trades_dict[t], prices_dict[t]], axis = 1))
frames['XAUUSD']

这将连接两个数据帧,使它们在相同的键下可用:

ID1      Val1       ID2      Val2
0  0.374540  0.950714  0.611853  0.139494
1  0.731994  0.598658  0.292145  0.366362
2  0.156019  0.155995  0.456070  0.785176
3  0.058084  0.866176  0.199674  0.514234
4  0.601115  0.708073  0.592415  0.046450
5  0.020584  0.969910  0.607545  0.170524
6  0.832443  0.212339  0.065052  0.948886
7  0.181825  0.183405  0.965632  0.808397
8  0.304242  0.524756  0.304614  0.097672
9  0.431945  0.291229  0.684233  0.440152

您可能需要一些错误检查,以防您的键不匹配或连接类型(左,右,内部等)取决于您的列,但这是它的要点。

相关内容

  • 没有找到相关文章

最新更新