我有一个多维的模糊字符串匹配问题:
假设我有一个熊猫数据框,其中包含变量“公司名称”,“股票代码”和“国家/地区”。简化的子集可能看起来像这样:
pd.DataFrame(columns = ["Company name", "Ticker", "Country"],
data = [["Vestas Wind Systems", "VWS.CO", "Denmark"],
["Vestas", "VWS", "Denmark"],
["Vestas Wind", "VWS", np.nan],
["Amazon.com Inc", np.nan, "United States of America"],
["AMAZONIA", "BAZA3 BZ", "Brazil"],
["AMAZON.COM", "AMZN US", "United States"]])
Run Code Online (Sandbox Code Playgroud)
整个数据帧将包含数十万行。
我要确定的是数据框中的公司,它们是相同的。 在这种情况下,意味着确定行0、1、2都是“ Vestas Wind Systems”公司的不同表达方式,行3、5都代表“ Amazon.com Inc”,行4代表“ Amazonia”。
为了增加正确匹配的机会,我认为最好利用所有三列的信息。
但是,所有三列都需要通过模糊逻辑进行比较:公司,股票行情和国家/地区的写法可能不同。例如,“ Vestas风力系统”与“ Vestas”或“美国”与“美国”。
另一个复杂性是,“股票行情”和“国家/地区”列都可能包含NaN值(公司名称绝不能为空)。
问题1:解决此问题的理想方法是什么?
我目前的计划:
我想通过利用三列中的信息来匹配公司。跨列的实体越相似,匹配的可能性就越高。此外,每列的权重应该不同:仅仅因为两家公司都位于美国,并不意味着它们是同一家公司。因此,例如,“国家/地区”列应具有较低的权重。
我目前尝试在每列上使用模糊算法来识别相似的字符串表示形式。这将产生如下结果,其中分数代表字符串相似度:
pd.DataFrame(columns = ["Company name 1", "Company name 2", "Score"],
data = [["vestas wind systems", "vestas wind", 0.9],
["vestas wind", "vestas", 0.85],
["amazon.com inc", "amazon.com", …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过 Ibpy 从盈透证券(IB)获取历史数据。我已经尝试了几个用于此任务的脚本,这些脚本是我从其他人那里改编而来的,他们表明它应该可以工作。然而,它们都不适合我!我是Python新手,所以我承认我对这些方法的工作原理没有完全的了解——但是,我应该尝试最明显的修复。下面我列出了我尝试过的两个脚本。我正在使用 python 2x。
在 TWS 中我有以下设置:
选中:启用 ActiveX 和套接字客户端。未选中:启用 DDE 客户端。未选中:只读 API。选中:下载连接上的未结订单。选中:发送投资组合时包括外汇头寸。选中:发送 EEP 的状态更新。Socket port = 7496.勾选:使用负数绑定自动订单。未选中:创建 API 消息日志文件。未选中:在 API 日志文件中包含市场数据。日志记录级别 = 错误。主API客户端ID = 222。向API发送批量数据的超时时间为30秒。组分交换分离器 = 空白。选中:仅允许来自本地主机的连接。
API - 检查预防措施:绕过 API 订单的订单预防措施。此选项卡中的所有其他内容均未选中。
当我运行 python 脚本时,我已经登录并运行了 TWS,并且与其他人在网上所说的相比,上面的 TWS API 设置似乎是正确的。我有一个订阅美国股票数据的真实 IB 账户。还应该提到的是,我也尝试运行另一个通过 IBPY 下订单的脚本 - 这有效,因此问题似乎仅(至少目前)存在于获取历史数据方面。
脚本1:
from time import sleep, strftime, localtime
from ib.ext.Contract import Contract
from ib.opt import ibConnection, message
new_symbolinput = ['AAPL']
newDataList = []
dataDownload = []
def historical_data_handler(msg):
global newDataList
print (msg.reqId, msg.date, msg.close) …Run Code Online (Sandbox Code Playgroud) 说我有一本这样的字典
D = {'a': [1,2,3], 'b': [2,3,4], 'c': [3,4,5]}
Run Code Online (Sandbox Code Playgroud)
对于所有列表中存在的每个唯一元素,我想找到相关的字典键。
因此,想要的输出是:
out = {1: ['a'], 2: ['a', 'b'], 3: ['a', 'b', 'c'], 4: ['b', 'c'], 5: ['c']}
Run Code Online (Sandbox Code Playgroud)
我如何最有效地做到这一点?
编辑:我需要为一个包含 ~100 个键的大字典和每个列表在 50-10000 个元素之间执行此操作