尽量保持这个相对简单,但如果你需要更多的信息,请告诉我。
我有两个字典,每个字典由三个数据帧组成,这些数据帧通过循环产生,然后添加到字典中。它们有相同的键['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)
有问题的代码出了什么问题?
嵌套for循环创建笛卡尔积
外循环3次迭代乘以内循环3次迭代= 9次迭代
9次迭代
trades_dict.keys() == prices_dict.keys()
的结果均为True
dict_a_all_keys == dict_b_all_keys
与dict_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
您可能需要一些错误检查,以防您的键不匹配或连接类型(左,右,内部等)取决于您的列,但这是它的要点。