Zephyr中国跨国并购数据2000-2024清洗与面板回归实战指南

发布时间:2026/10/11 13:28:10

Zephyr中国跨国并购数据2000-2024清洗与面板回归实战指南 简介这份资源为Zephyr数据库导出的中国跨国并购交易数据合集时间跨度覆盖2000年至2024年面向从事国际商务、公司金融、产业经济研究的学者、研究生及数据分析从业者可用于跨国并购趋势分析、案例筛选与实证研究。压缩包共2个文件包含1个xls数据表和1个html来源说明整体约9.09MBxls承载并购交易明细html用于交代数据出处与口径便于溯源核对。目前已有123人学习下载属于小众但垂直的学术型数据资源。读者可借助该表按年份、行业、交易主体等维度梳理中国企业海外并购的规模与结构变化为论文选题、课题申报或行业报告提供一手素材也可结合来源说明判断字段含义与统计边界减少清洗与校验成本。1. 从一份横跨二十五年的并购底稿说起这套数据到底能干什么如果你正在做中国企业出海、跨国并购绩效、制度距离与交易成败这类题目大概率经历过同一个困境CSMAR 和 Wind 的并购库要么字段太薄要么年份断档想拉一条 2000 年至今的完整时间线中间总得手工补好几段。这份 zephyr 中国跨国并购数据2000-2024 年压缩包解决的就是这个断档问题——它把 Zephyr 库里中国买方发起的跨境并购交易按年份整理成结构化表格覆盖四分之一个世纪直接能进 Stata 或 Python 做面板回归。它适合三类人做实证的硕博生需要一份可复现的原始底稿做行业研究的分析师想快速筛出某年某行业的出海标的以及给论文做稳健性检验的研究者需要一份独立于国内数据库的交叉验证样本。不适合谁想拿现成结论的人——这是原始交易记录不是加工好的指标清洗和口径统一得你自己来。下面我按“数据长什么样 → 怎么读进来 → 怎么清洗 → 坑在哪 → 怎么进阶”的顺序拆一遍都是我实际跑过一遍的路径。2. 先看清字段结构Zephyr 并购表的列到底怎么读拿到压缩包别急着 merge先搞清楚 Zephyr 的字段命名逻辑。它和国内数据库最大的区别是交易层面deal-level和公司层面company-level是分开的一笔交易可能涉及多个买方、多个标的直接按行读会踩一对多的坑。所以第一步永远是先看列名和主键。2.1 核心字段的语义与主键识别Zephyr 导出的表通常以deal_id或deal_number作为交易唯一标识但中国跨境并购里经常出现同一笔交易分多次公告、多个deal_id的情况。我一般先确认三组字段字段类别典型列名说明交易标识deal_id / deal_number交易主键注意是否唯一时间字段announced_date / completed_date公告日与完成日实证里常用公告日主体字段acquiror_name / target_name买方与标的名称中英文混杂金额字段deal_value / deal_value_usd注意币种与是否已折算状态字段deal_status完成/撤回/传闻必须筛主键不唯一是常态。我一般先跑一句去重检查看看到底有多少重复import pandas as pd df pd.read_excel(zephyr_china_ma_2000_2024.xlsx, sheet_nameDeals) # 看主键是否唯一重复多少 dup df[df.duplicated(deal_id, keepFalse)] print(总行数:, len(df), 重复行:, len(dup)) print(dup[[deal_id, announced_date, acquiror_name, target_name]].head(10))这段逻辑很直白duplicated带keepFalse会把所有重复项都标出来而不是只留一条。参数上keepFalse是关键很多人默认keepfirst结果只看到一条重复误以为数据干净。跑完你大概率会发现重复集中在同一交易的多公告记录上后面清洗要按deal_id加时间排序取最新状态。2.2 时间跨度与年份分布的自检2000-2024 这个跨度里早期年份2000-2005中国跨境并购样本本来就少Zephyr 覆盖也偏薄这是数据本身的边界不是文件坏了。我习惯先画个年份分布确认没有整年缺失df[year] pd.to_datetime(df[announced_date], errorscoerce).dt.year year_counts df[year].value_counts().sort_index() print(year_counts)errorscoerce是把无法解析的日期变成 NaT避免整列报错中断。如果某几年计数明显偏低甚至为 0先别慌去核对是不是日期格式混了比如2005/03/12和12-Mar-05并存。这一步做完你对样本的时间重心就有数了——2015 年之后明显放量做子样本回归时心里有底。3. 把 Excel 变成可回归面板清洗与口径统一原始表能读进来只是开始真正决定你能不能跑出结果的是清洗。中国跨境并购数据最烦的三件事买方名称中英文不统一、金额币种混杂、交易状态没筛干净。这一章按顺序处理。3.1 买方名称标准化与同一实体的合并同一家公司可能写成“阿里巴巴集团”“Alibaba Group”“阿里巴巴中国有限公司”不统一就没法做企业层面的固定效应。常见做法是先建一张映射表再批量替换# 手工维护的映射表实际项目里会积累几百条 name_map { Alibaba Group Holding Ltd: 阿里巴巴, Alibaba Group: 阿里巴巴, 阿里巴巴集团: 阿里巴巴, Tencent Holdings: 腾讯, 腾讯控股有限公司: 腾讯, } df[acquiror_std] df[acquiror_name].map(name_map).fillna(df[acquiror_name]) print(df[acquiror_std].nunique(), 个标准化后买方)map加fillna的组合是标准写法能映射上的替换映射不上的保留原名避免把没维护到的公司变成 NaN。参数上没什么玄学关键是映射表要持续维护——我一般会把nunique前后的差值记下来差值太大说明映射覆盖不够回归时企业固定效应会碎掉。3.2 金额字段的币种折算与缺失处理deal_value经常是原币种做跨国比较必须统一到美元或人民币。如果表里已经有deal_value_usd就直接用没有就得按公告年份的汇率折算。缺失值不要直接 drop先看缺失比例# 缺失比例 missing_ratio df[deal_value_usd].isna().mean() print(金额缺失比例:, round(missing_ratio, 3)) # 缺失过多的年份单独标记回归时做敏感性分析 df[value_missing] df[deal_value_usd].isna().astype(int)isna().mean()直接给出缺失占比比isnull().sum()更直观。如果缺失超过三成硬 drop 会引入选择偏误我的习惯是保留缺失标记value_missing主回归用有值样本稳健性检验里把缺失当一类处理。这是血泪经验早期直接 drop 缺失审稿人一句“样本选择偏误”就得重跑。3.3 交易状态筛选与面板结构搭建Zephyr 的deal_status里混着 Completed、Withdrawn、Rumoured 等状态。做绩效研究一般只保留 Completed做公告效应则保留 Announced。筛完之后按“买方-年份”聚合才能得到面板completed df[df[deal_status].str.contains(Completed, caseFalse, naFalse)].copy() panel (completed.groupby([acquiror_std, year]) .agg(deal_count(deal_id, nunique), total_value(deal_value_usd, sum)) .reset_index()) print(panel.head())str.contains加caseFalse是为了兼容大小写不一致naFalse防止 NaN 报错。nunique而不是count是因为前面去重没做彻底时count会把重复公告算进去。聚合完这张panel就是能直接进回归的结构每个买方每年一条deal_count和total_value是核心被解释变量的原料。4. 避坑与排查这份数据最容易翻车的五个地方数据本身没问题翻车基本都翻在口径和细节上。下面五条是我和身边人真实踩过的按“现象 → 原因 → 解决”写。现象一回归跑出来样本量比预期少一大截。原因多半是日期解析失败导致year为 NaN被后续 dropna 静默删掉。解决解析后先print(df[year].isna().sum())把解析失败的原始日期打出来看格式再针对性写format参数。现象二同一笔大额交易在数据里出现三四次金额被重复累加。原因是多公告记录没去重。解决按deal_id分组用completed_date排序取最后一条或者按状态优先级保留 Completed 那条。现象三买方名称标准化后头部企业数量对不上行业认知。原因是映射表只覆盖了英文名中文全称没进去。解决先把acquiror_name里含中文的单独拉出来人工过一遍别指望自动匹配。现象四金额单位混乱有的像美元有的像人民币量级差一个数量级。原因是原表币种列没跟着金额一起导出。解决回到 Zephyr 导出时勾选币种字段或者按交易年份和标的国别做合理性校验量级异常的单独标记。现象五2000-2005 年样本极少以为数据缺年。原因是中国跨境并购在那个阶段本就处于起步期Zephyr 覆盖反映的是真实市场不是文件损坏。解决做全样本回归时加年份固定效应或者把早期年份合并成区间别硬按年切。提示清洗每一步都存一个中间文件命名带日期。数据类项目最怕改到一半忘了哪版是对的后悔药就是版本快照。5. 进阶用法用这份数据做制度距离与并购成败的交叉验证数据清洗完只是半成品真正体现价值的是怎么用它回答一个具体问题。我拿“制度距离是否影响中国跨境并购完成率”举个例子走一遍从这份数据到可解释结果的路径。5.1 构造制度距离变量并与交易层面合并制度距离常用世界银行 WGI 六维度或 Hofstede 文化维度按标的国别匹配。假设你已有一张country_distance.csv含target_country和institution_distancedist pd.read_csv(country_distance.csv) merged completed.merge(dist, left_ontarget_country, right_ontarget_country, howleft) # 检查匹配率匹配不上的国别要单独看 match_rate merged[institution_distance].notna().mean() print(制度距离匹配率:, round(match_rate, 3))howleft保证交易记录不丢匹配不上的国别institution_distance为 NaN。匹配率低于 0.9 就得回头补国别映射——常见坑是“香港”“Hong Kong”“中国香港”被当成三个地区。5.2 完成率回归的变量设定与结果解读被解释变量是交易是否完成0/1核心解释变量是制度距离控制变量包括交易金额对数、买方是否国有、标的国别 GDP 等。用 logit 跑import statsmodels.formula.api as smf completed[log_value] np.log1p(completed[deal_value_usd]) completed[completed_flag] (completed[deal_status] .str.contains(Completed, caseFalse, naFalse)).astype(int) model smf.logit(completed_flag ~ institution_distance log_value soe_flag, datacompleted).fit(dispFalse) print(model.summary())log1p而不是log是为了兼容金额为 0 或极小值的记录避免-inf。dispFalse只是关掉迭代输出不影响结果。解读时注意 logit 系数不是边际效应报告里要么转成优势比要么算平均边际效应别直接说“系数 0.3 就是提高 30%”这是审稿人最爱抓的表述错误。5.3 稳健性检验换样本区间与替换核心变量一份数据能不能站住看的是结论换口径后还在不在。我一般做三组把 2000-2008 剔除只留 2009 年后把制度距离换成文化距离把被解释变量从完成率换成交易金额。三组跑完方向一致才敢写进正文。这一步没有捷径就是重复上面的流程换参数。从那以后我每次拿到新的并购数据都强制先跑一遍主键唯一性、日期解析率、金额缺失率这三个自检再动手清洗。这三个数不对后面全是白干。希望这份拆解能帮你少走几段弯路把这份横跨二十五年的底稿真正用起来。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/11 13:28:09

校园消费行为分析毕设实战:Python数据清洗与聚类

简介:面向Python毕业设计的学生校园消费行为分析项目,以校园一卡通消费记录为基础,覆盖数据清洗、信息关联、食堂就餐分析和消费行为挖掘等完整流程,特别适合需要毕业设计参考或数据分析实战练习的本科生及初级开发者。资源压缩包…

2026/10/11 13:23:09

项目文档“01_概述”怎么写?一套可落地的框架与避坑指南

1. 明明都叫“01_概述”,为什么有人写成了废话元旦前整理一个跨部门项目的文档,我发现一个特别普遍的现象:文档目录里排第一的永远是“01_概述”,可点进去之后,要么是两三句含糊其辞的套话,要么是从需求文档…

2026/10/11 14:48:17

欧瑞博智能家居全屋落地指南:从选型到交付的工程实践

简介:一份欧瑞博智能家居解决方案的完整文档,适合智能家居行业从业者、方案设计师、产品经理及技术研发人员研读。内容系统梳理欧瑞博公司背景、核心产品线(智能开关、智能插座、燃气报警器等),并重点介绍ViHome智能家…

2026/10/11 14:48:17

Flutter扫码App历史记录搜索实战:SQLite模糊查询与性能优化

1. 这次做完"历史记录搜索",我踩了哪些坑? 先说背景。我们团队基于某开源操作系统做了一款跨端扫码App,技术栈是Flutter,扫码这块用的是原生插件对接底层能力,UI和业务逻辑全部在Flutter层实现。之前版本的功…

2026/10/11 14:48:17

MySQL安装配置教程:从下载到第一条SQL的完整路径

简介:这份MySQL安装及使用教程面向数据库零基础的学习者与需要快速上手MySQL的开发人员,系统讲解从环境搭建到日常操作的完整入门路径。资源包内含1个docx文档,大小约1.53MB,以图文并茂的步骤说明为主,便于边看边练。内…

2026/10/11 14:48:17

IoT终端轨迹异常检测:轻量规则引擎与边缘特征工程实践

简介:本资源是一篇聚焦物联网移动终端用户行为分析的学术研究论文,面向计算机科学、数据挖掘与智能安防领域的研究生、科研人员及工业界算法工程师,旨在解决海量不均匀轨迹数据下异常检测效率低、精度不足的现实难题。论文提出双层层次聚类方…

2026/10/11 14:48:17

建筑光储系统规划运行综合优化:改进粒子群算法与Python实现

看到这个标题,第一反应是“这又是把某篇论文的MATLAB代码换成Python的复现活”。但真正动手之后我意识到,建筑集成光储系统的规划运行综合优化,比一般的光伏容量配置复杂得多——它不是算一个容量值就完事,而是要在“装多大”和“…

2026/10/11 14:43:17

基于PyQT6从零开始做一个计时器

前言 PyQt6 是 Qt 6 的 Python 绑定,属于第三方库,要 pip install PyQt6 才能用;本机没有安装环境,所以本文代码只能逐行推演。官方文档写明 PyQt6 要求 Python 3.9 或更高,如果你还在用 3.8,就只能退回 Py…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑