楼主: voodoo
22303 25

[数据管理求助] 数据库匹配问题 [推广有奖]

已卖:14047份资源

院士

70%

还不是VIP/贵宾

-

威望
0
论坛币
3737 个
通用积分
1496.5501
学术水平
324 点
热心指数
365 点
信用等级
253 点
经验
63754 点
帖子
1814
精华
1
在线时间
6560 小时
注册时间
2007-1-5
最后登录
2025-12-28

楼主
voodoo 发表于 2010-8-24 19:33:56 |AI写论文
500论坛币
现有个数据库A,有数据如下(600+ obs):
fndnme
宝盈策略增长
宝盈泛沿海增长
宝盈核心优势
宝盈鸿利收益
宝盈货币A
宝盈增强收益AB
宝盈资源优选
博时策略灵活配置
博时第三产业成长
... ...

另有数据库B,数据如下(400+ obs):
fndnmefull
宝康灵活配置证券投资基金
宝康消费品证券投资基金
宝康债券投资基金
宝盈策略增长股票型证券投资基金
宝盈泛沿海区域增长股票证券投资基金
宝盈鸿利收益证券投资基金
宝盈增强收益债券型证券投资基金
宝盈资源优选股票型证券投资基金
博时策略灵活配置混合型证券投资基金
... ...


希望能在A B库的基础上生成新的数据库C如下(即在fndnmefull和fndnme间建立一一“映射”):
fndnmefull  fndnme
宝康灵活配置证券投资基金 华宝兴业宝康灵活
宝康消费品证券投资基金 华宝兴业消费品
宝康债券投资基金 华宝兴业宝康债券
宝盈策略增长股票型证券投资基金宝盈策略增长
宝盈泛沿海区域增长股票证券投资基金宝盈泛沿海增长
宝盈鸿利收益证券投资基金宝盈鸿利收益
宝盈增强收益债券型证券投资基金宝盈增强收益AB
宝盈资源优选股票型证券投资基金宝盈资源优选


请高手支招!具体数据见4楼附件。

最佳答案

sungmoo 查看完整内容

*设B库中所有基金都能在A库中找到对应的简称,且A库中各简称均有相应代码。 use B,clear g g=1 ren fndnmefull fndnme append using A sort fndnme g replace fndcd=fndcd[_n-1] if indexnot(fndnme[_n-1],fndnme)==0 keep if g==1 drop g *所给的B库中有些基金在A库中找不到对应的简称。
关键词:数据库 混合型证券投资基金 证券投资基金 混合型证券 投资基金 考考

本帖被以下文库推荐

巫毒上传,必属佳品!
坛友下载,三思后行!

沙发
sungmoo 发表于 2010-8-24 19:33:57
voodoo 发表于 2010-8-25 11:23 为B库的基金全称找到相应的基金代码
*设B库中所有基金都能在A库中找到对应的简称,且A库中各简称均有相应代码。

use B,clear
g g=1
ren fndnmefull fndnme
append using A
sort fndnme g
replace fndcd=fndcd[_n-1] if indexnot(fndnme[_n-1],fndnme)==0
keep if g==1
drop g

*所给的B库中有些基金在A库中找不到对应的简称。
已有 4 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
remlus + 100 精彩帖子
日新少年 + 2 + 2 + 2 精彩帖子
Sunknownay + 3 + 3 + 3 热心帮助其他会员
crystal8832 + 20 + 1 + 1 热心帮助其他会员

总评分: 经验 + 100  论坛币 + 20  学术水平 + 6  热心指数 + 6  信用等级 + 5   查看全部评分

藤椅
sungmoo 发表于 2010-8-25 08:39:54
这个首先需要把两个变量的所有观测值都贴出来吧(以便考虑双射关系)。

板凳
sungmoo 发表于 2010-8-25 08:42:06
voodoo 发表于 2010-8-24 19:33
现有个数据库A,有数据如下(600+ obs):
另有数据库B,数据如下(400+ obs):
希望能在A B库的基础上生成新的数据库C如下(即在fndnmefull和fndnme间建立一一“映射”)
另外,A、B两库观测值数不一致,双射的规则是什么?

(是否A库中有实质内容相同的观测值?)

报纸
voodoo 发表于 2010-8-25 11:23:07
2# sungmoo

事实上是很常见的一个数据处理问题,我把数据(包括A、B和C)贴上来吧。

顺道也把任务说明白些,A是基本库,包括唯一基金代码fndcd和基金简称fndnme,而B则是公告中出现基金全称fndnmefull(当然还有其它字段,我已经删去),我希望为B库的基金全称找到相应的基金代码,然后才可和其它基金年报或行情序列数据进行merge。当然我可以手动逐一进行匹配,但效率太低,也容易犯错。我希望有种算法可轻松实现80%+的匹配,然后再手工去进行剩下20%-的匹配工作。

ABC.rar
下载链接: https://bbs.pinggu.org/a-728235.html

18.13 KB

本附件包括:

  • A.dta
  • B.dta
  • C.dta

巫毒上传,必属佳品!
坛友下载,三思后行!

地板
voodoo 发表于 2010-8-25 11:25:46
sungmoo 发表于 2010-8-25 08:42
另外,A、B两库观测值数不一致,双射的规则是什么?

(是否A库中有实质内容相同的观测值?)
对于A、B库来说并不存在简单的“双射规则”。映射规则可能因数据库不同而有所差异,但我希望得到的是一个处理相似问题的整体思路和算法
已有 1 人评分经验 收起 理由
remlus + 100 精彩帖子

总评分: 经验 + 100   查看全部评分

巫毒上传,必属佳品!
坛友下载,三思后行!

7
voodoo 发表于 2010-8-25 16:18:52
sungmoo 发表于 2010-8-25 15:02
voodoo 发表于 2010-8-25 11:23 为B库的基金全称找到相应的基金代码
*设B库中所有基金都能在A库中找到对应的简称,且A库中各简称均有相应代码。

use B,clear
g g=1
ren fndnmefull fndnme
append using A
sort fndnme g
replace fndcd=fndcd[_n-1] if indexnot(fndnme[_n-1],fndnme)==0
keep if g==1
drop g

*所给的B库中有些基金在A库中找不到对应的简称。
indexnot()真是妙极!——我就因为没有意识到这个函数的存在竟然自己编了个循环实现大致相应的功能,可谓笨极!
还有几点小问题:
①replace fndcd=fndcd[_n-1] if indexnot(fndnme[_n-1],fndnme)==0起作用严格依赖于append+sort后的排序,要求A库简称fndnme恰好排在B库fndnmefull之前,这就使得“宝盈泛沿海区域增长股票证券投资基金”由于简称中被删除了“区域”两字,排序在全称之后,最终无法匹配。能否实现对A库全库搜索匹配呢?
②还有剩下剩下81个没有匹配的基金中,有些也是有规律,如32家封闭式基金(比如全称“泰和证券投资基金”,其简称就是“基金泰和”),其它如“交银施罗德……”、“摩根士丹利华鑫……”等,这又该如何逐一系统实现?
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
日新少年 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

巫毒上传,必属佳品!
坛友下载,三思后行!

8
sungmoo 发表于 2010-8-25 17:32:34
voodoo 发表于 2010-8-25 16:18 还有剩下剩下81个没有匹配的基金中,有些也是有规律,如32家封闭式基金(比如全称“泰和证券投资基金”,其简称就是“基金泰和”),其它如“交银施罗德……”、“摩根士丹利华鑫……”等,这又该如何逐一系统实现?
首先,如果“简称”与“全称”没有统一的规律,编程也就实在“无律可循”。

其次,如果上述封闭基金全是如此简称,可以考虑先删除前面的“基金”以及其中的“施罗德”几字。
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
remlus + 100 精彩帖子
日新少年 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

9
voodoo 发表于 2010-8-26 00:38:57
再提醒大家一下,indexnot()对中文的处理有点问题(因为中文是双字节的嘛),如
di indexnot("基金天华", "天元证券投资基金")
结果竟然是0。
希望大家注意,一定要检查结果!
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
日新少年 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

巫毒上传,必属佳品!
坛友下载,三思后行!

10
sungmoo 发表于 2010-8-26 06:31:36
voodoo 发表于 2010-8-26 00:38 再提醒大家一下,indexnot()对中文的处理有点问题(因为中文是双字节的嘛),如di indexnot("基金天华", "天元证券投资基金")结果竟然是0。
*如果考虑全字段匹配(简称是全称的一个连续子字段),可考虑使用

replace fndcd=fndcd[_n-1] if subinstr(fndnme,fndnme[_n-1],"",.)!=fndnme&fndcd==""

*代替indexnot()
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
remlus + 100 精彩帖子
Sunknownay + 3 + 3 + 3 热心帮助其他会员

总评分: 经验 + 100  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-29 06:46