首页/新闻资讯/正文详情

Zephyr中国跨国并购数据清洗实战:从CSV到面板数据的完整指南

发布时间:2026/9/26 15:06:09 来源:云帆数科 栏目:资讯中心
Zephyr中国跨国并购数据清洗实战:从CSV到面板数据的完整指南
简介Zephyr中国跨国并购数据2000—2024年是一份面向经济金融研究者、高校师生及企业战略团队的并购数据集重点覆盖中国境内及跨境并购事件时间跨度从2000年延续到2024年这段时期恰好涵盖了中国企业“走出去”和外资入境的多个关键周期可用于实证分析、行业趋势观察、区域比较和案例研究。压缩包内共2个文件主要文件类型为xls和html整体大小约9.09MBxls表格提供结构化并购数据便于按年度、行业、交易主体进行筛选与计量处理html说明页则用于核对数据来源、导出时间与生成条件两者配合能增强数据使用的可追溯性和可信度。目前已有121人浏览学习适合需要系统获取长周期、成体系并购样本的用户直接使用尤其适合开展跨国并购影响因素、投资趋势与行业分布等专题分析。这一压缩包省去了逐条查找与手工汇总的大量工作拿到后即可快速整理成标准数据表支撑学术论文中的描述统计、回归分析也可服务于企业战略部门的对标研究与并购标的选择。1. Zephyr 中国跨国并购数据2000-2024年压缩包到底装了什么第一次拿到「zephyr中国跨国并购数据2000-2024年.zip」这个文件时我以为解压后是一份可以直接画图的汇总表结果里面躺着几十个 csv光搞清楚哪些表跟哪些表能关联就花了一个晚上。这份压缩包来自 BvD 旗下 Zephyr 数据库的中国跨境并购样本覆盖 2000 到 2024 年记录源是监管公告、交易所文件和主流财经媒体。它的价值在于回答两类问题外资买了多少中国公司中企出海又买了什么。适合做跨境资本流动研究的学生、金融机构的行业分析师以及企业战投部做标的初筛。但请先放下「开箱即用」的期待——它是一堆需要拼装的原件不是成品报告。2. 解压与摸底把 zip 变成一张干净的 deals 主表Zephyr 的导出文件通常按「主交易表 参与方表 附加信息表」拆开主表一行一笔交易参与方表一行一个买方、卖方或标的公司附加表则放交易来源、财务数据和公司关系链。拿到压缩包的第一步永远是先看清单而不是直接把某个 csv 拖进 pandas。因为你不提前摸清文件结构大概率会读错表把参与方表当主表用后面所有统计口径全错。2.1 先看文件清单哪些 csv 是核心表哪些只是关联表解压前先列文件这一步能帮你判断导出版本的结构。常见做法是解压后先跑一段 Python 脚本打印所有文件名和大小同时确认有没有 readme 或字段字典。Zephyr 的官方导出一般带一个字段说明文件先读它比猜列名省一小时。import zipfile zpath zephyr中国跨国并购数据2000-2024年.zip zp zipfile.ZipFile(zpath) for info in zp.infolist(): print(f{info.filename}\t{info.file_size})这段代码用infolist()拿到压缩包内每个文件的元信息file_size单位是字节能直观看出哪个表是几 GB 的大头、哪个表只有几百 KB。按经验容量最大的通常不是主表而是存放公司财务数据的从表真正的主表 deals 反而不大。先把文件名打印出来再对照 readme 把「主表 / 参与方表 / 代码表」分好类后续加载就不会盲目。2.2 用 pandas 首次加载编码、分隔符与列名规范化确认文件清单后用 pandas 读主表。这里有两个高发问题一是中文 Windows 导出的 csv 常带 BOM 头直接read_csv会把第一列列名读成\ufeffdeal_id二是老数据里有混合类型列low_memory默认 True 时会蹦一堆警告。先跑通加载再谈清洗。import pandas as pd df_deals pd.read_csv( zp.open(deals.csv), encodingutf-8-sig, # 兼容 BOM中文列名不乱码 sep,, # 标准分隔符遇分号再改 low_memoryFalse # 关掉分块推断类型减少警告 ) print(df_deals.shape) print([c for c in df_deals.columns if deal in c.lower()])encodingutf-8-sig会自动去掉开头的\ufeff如果读出乱码再试gbk或latin1。low_memoryFalse只是减少警告真正解决类型问题要靠后面dtype参数或pd.to_numeric。zp.open()返回的是文件句柄read_csv可以直接读取不用先把 zip 拆到磁盘省临时空间。注意列名可能是英文也可能带中文别名先打印看看再决定用哪套字段做清洗。这一步如果报ParserError通常是文件里有未转义引号或行内换行。解决方式是给read_csv加quotingcsv.QUOTE_ALL或者enginepython但enginepython在大文件上慢只用来排查。加载失败时优先用文本编辑器看文件前 30 行比反复改参数快得多。3. Zephyr 关键字段说明书看懂交易金额、股权比例与 deal statusZephyr 的字段体系对第一次用的人不太友好deal_status、deal_value、equity_percent 这三个字段决定了一笔记录能不能被算作「一笔完成的并购」但它们的取值规则分散在字段字典和实际数据两个地方。不看字段字典直接跑描述统计很容易把传言交易当成真实交割把少数股权投资当成控制权并购。这一章先把关联关系和状态枚举讲清楚。3.1 三张核心表怎么 joindeal_id 与 company_id 的关系主表是 Dealsacquirers 和 targets 是两张子表。主表的唯一键是 deal_id子表通过 deal_id 关联主表但一个 deal 可能对应多个 acquirer联合收购也可能对应多个 target一揽子并购。因此 join 之后行数会膨胀这是正常现象不是 bug。df_acq pd.read_csv(zp.open(acquirers.csv), encodingutf-8-sig) df_tgt pd.read_csv(zp.open(targets.csv), encodingutf-8-sig) merged ( df_deals .merge(df_acq, ondeal_id, howleft, suffixes(, _acq)) .merge(df_tgt, ondeal_id, howleft, suffixes(_acq, _tgt)) ) print(merged.shape, df_deals.shape)suffixes参数让合并后的列名带来源标记避免 Target Company 和 Acquirer Company 撞车。合并完必须看 shape如果行数明显大于主表说明存在一对多关系。这时要决定分析单位是「交易笔数」还是「参与方记录数」——做描述统计建议按 deal_id 去重做买方行业分析才用展开后的行。注意join 后行数膨胀是数据结构的正常表现别急着删行。先确认重复来自 acquirer 还是 target再决定去重策略。3.2 deal status 的四个取值Completed 才是你要的状态字段是 Zephyr 里最容易被误用的一个。常见取值至少有四个Completed、Pending、Rumour、Announced。研究「真实发生的跨境并购」时主流做法是把 Completed 和 Unconditional 作为最终口径Announced 代表公告意向很多交易最后会流产如果把它算进完成交易趋势图会凭空多出不少尖峰。print(merged[deal_status].value_counts(dropnaFalse)) deal_done merged[ merged[deal_status].isin([Completed, Unconditional]) ].copy()先跑value_counts看你的版本里状态字段的实际取值有的中文导出会写成「已完成」「传言中」。确认枚举后再写isin别用str.contains(完成)——它会同时匹配「未完成」。另外 Pending 状态在 2000 年代初的数据里占比偏高因为这些交易后来有不少被终止但终止状态没回填。稳妥做法是对 Pending 记录做二次筛选如果 completed_date 有值说明最终交割了否则按未完成处理。3.3 股权比例与交易金额两个字段要一起看Zephyr 的equity_percent记录的是交易完成后买方持有的股份比例单位是百分比。大于 50 是控股并购30 到 50 是战略投资低于 10 基本是财务投资。如果你研究的是「并购」而不是「投资」必须过滤掉低股权比例交易否则样本里会混入大量少数股权购买结论偏得厉害。maj_control deal_done[ (deal_done[equity_percent] 50) | ( deal_done[equity_percent].isna() deal_done[deal_type].str.contains(Acquisition, caseFalse) ) ]这段代码的逻辑是优先用股权比例判断控制权比例缺失时用 deal_type 里的 Acquisition 关键词兜底。caseFalse是为了兼容acquisition全小写的历史记录。这个处理属于研究口径选择写论文时要交代清楚不然评审会问为什么你的样本全是控股交易。至于交易金额字段Zephyr 文档写的是 EUR 百万但实际存在不披露金额的 unpublished deal这部分记录金额是空值或 0下一章专门处理。4. 数据清洗实战把 2000-2024 年的跨国并购记录变成面板数据这个压缩包的最终用途大多是变成「年份 × 方向 × 金额」的面板数据用来画趋势、跑回归或者做行业对比。清洗路径就三步筛出中国相关交易、统一金额单位、把日期降到年份。每一步都有容易翻车的细节下面按顺序讲。4.1 筛选中国相关交易inbound 与 outbound 两个口径中国跨国并购要同时保留两个方向inbound 是外资买中国标的outbound 是中企买海外标的。纯粹的境内交易中国买中国不属于跨国并购要从分析里剔除。Zephyr 的国家字段同时存在于 acquirer 和 target 两侧先看实际取值再归一化。# 先看国家字段到底有哪些写法 print(merged[target_country].unique()[:50]) cnt_map {中国: CN, China: CN, 中华人民共和国: CN} merged[target_country_norm] ( merged[target_country].map(cnt_map).fillna(merged[target_country]) ) merged[acquirer_country_norm] ( merged[acquirer_country].map(cnt_map).fillna(merged[acquirer_country]) ) merged[inbound] ( (merged[target_country_norm] CN) (merged[acquirer_country_norm] ! CN) ) merged[outbound] ( (merged[acquirer_country_norm] CN) (merged[target_country_norm] ! CN) ) cn_deals merged[merged[inbound] | merged[outbound]].copy() print(cn_deals[inbound].sum(), cn_deals[outbound].sum())这里的关键是先打印unique()看国家字段的写法有的老记录里是中国香港、英属维尔京群岛这种带行政区划的名字直接 CN会漏掉。map加fillna的思路是能映射的转成 CN没映射到的保留原值这样不会误伤香港、台湾地区的记录。布尔列inbound和outbound后面直接用来做分组聚合不用反复写条件。4.2 金额换算与单位统一EUR 百万只是文档里的默认值Zephyr 字段字典说金额单位是 EUR 百万但老数据里存在按原币种导入的情况尤其是 2000 年代初的部分交易。做跨国并购研究我习惯统一换算成 USD 百万这样和公开报道、上市公司公告直接可比。年度聚合用年均汇率就够逐笔交易分析才需要精确到宣布日。# 准备一张年份-汇率表两列year, eurusd fx pd.read_csv(annual_fx_usd_eur.csv, encodingutf-8-sig) cn_deals[announced_year] pd.to_datetime( cn_deals[announced_date], errorscoerce ).dt.year cn_deals cn_deals.merge(fx, left_onannounced_year, right_onyear, howleft) cn_deals[deal_value_usdm] cn_deals[deal_value] / cn_deals[eurusd]EUR 转 USD 是除以汇率即 1 欧元兑多少美元。这份annual_fx_usd_eur.csv不在 zip 里需要自己去数据源整理——这也是 Zephyr 数据落地的标准动作。这里最容易翻车的是单位没对齐如果原始金额是 EUR thousand结果要再除以 1000 才是 USD million。我建议取几笔已知大额交易手工核对数量级比如查找当年媒体公开的头部并购案比对着验算一下再放心进入聚合步骤。4.3 日期降维到年份按年度聚合之前先补全缺失日期Zephyr 对早期交易经常只有公告年份、没有完整日期直接to_datetime会得到一堆 NaT。我的做法是分别从公告日期和交割日期提取年份再用同行可用的年份兜底。如果两个日期都缺失单独打标不要悄悄丢行。cn_deals[announced_year] pd.to_datetime( cn_deals[announced_date], errorscoerce ).dt.year cn_deals[completed_year] pd.to_datetime( cn_deals[completed_date], errorscoerce ).dt.year # 公告缺失用交割年补都缺失就标记出来 cn_deals[year_ref] cn_deals[announced_year].fillna(cn_deals[completed_year]) cn_deals[year_missing] cn_deals[year_ref].isna() print(年份缺失比例:, cn_deals[year_missing].mean())errorscoerce把坏日期变成 NaT而不是中断整个解析这是刻意为之。year_ref是后续所有年度聚合的时间键。year_missing的均值如果超过 5%说明 2000 年代初的覆盖质量一般写报告时要单独说明别用dropna悄悄抹掉。5. 用 zephyr 中国并购数据做分析的 5 个常见坑与排查方法数据清洗到最后真正影响结论正确性的往往不是字段缺失而是几个结构性坑。下面这五条全是血泪经验每一条都按「现象 → 原因 → 解决」写排查时直接对照。5.1 交易金额为 0 或空值unpublished deal 占比高过预期现象做完value_counts发现金额为 0 或空值的记录接近三分之一。 原因Zephyr 里有大量 Unpublished deal——交易真实发生但未披露金额金额字段留空或写 0。这是数据库特性不是数据损坏。 解决先别dropna。把金额缺失单独标记描述统计时报告「已披露金额交易的均值」回归分析时加一个金额缺失哑变量。cn_deals[amount_missing] ( cn_deals[deal_value_usdm].isna() | (cn_deals[deal_value_usdm] 0) ) print(cn_deals[amount_missing].mean())如果这个比例超过四成说明样本里中小型交易占主导结论只能解释「披露金额的交易」不能泛化到全部跨国并购。5.2 开曼群岛和百慕大注册地遮蔽了真实资本来源现象做来源国排名时 Cayman Islands 排进前五甚至比日本还高。 原因大量境外基金和红筹结构公司把注册地设在开曼、百慕大这类离岸中心实际决策方可能来自香港、新加坡或美国。 解决不要试图穿透股东链条那是一条不归路。把这类注册地单独归为「离岸金融中心」类别与主权国家分开统计。代码上就是维护一份离岸中心清单做映射offshore {KY, BM, VG, JE, GG, MH} # 开曼、百慕大、维京等 cn_deals[acquirer_group] cn_deals[acquirer_country_norm].apply( lambda x: Offshore if x in offshore else x )这样做既保留了样本量又不会把离岸资金误判成真实的外资来源。研究报告里单独列一个 offshore 类别已经是业内通行做法。5.3 一个 deal_id 对应多行 acquirer交易笔数和参与方数被弄混现象merge 之后行数比主表多出几千行直接len()统计时交易笔数虚高。 原因联合收购、财团并购在 acquirers 表里就是多行记录这不是脏数据。 解决统计交易笔数一律按deal_id的nunique()算只有做买方维度分析时才用展开后的行。n_deals cn_deals[deal_id].nunique() n_rows len(cn_deals) print(f交易笔数 {n_deals}, 行数 {n_rows})任何产出交易笔数的图表底层聚合键都必须是deal_id否则 2016 年前后的联合收购潮会让你的数量曲线出现一个不真实的陡坡。5.4 2000 年代初的金额货币不一致现象把早期交易金额按 EUR 解释后有几笔大额交易数值明显异常比如一笔两亿欧元的收购当年公告实际是两亿美元。 原因早期部分记录按原币种导入字段字典里却统一写成 EUR 百万。 解决用已知大额交易交叉验证。挑每一年金额排名前三的交易手动查当时的公开公告金额。如果发现整体数量级不对按年份单独换算而不是全局除一个汇率。排查方法很朴素按年份分组看各年金额中位数如果 2001 到 2004 的中位数比前后年份高一个数量级那一年大概率混入了原币种记录。这种问题没有自动修复的万金油只有靠业务常识和公开数据校对。5.5 状态为 Completed 但 completed_date 为空现象筛选 Completed 后部分记录的交割日期是 NaT。 原因Zephyr 的状态字段由人工确认更新完成日期没同步写入。这类记录在 2000 年代尤其常见。 解决做年度趋势时用completed_year缺失的样本直接归入公告年份做交易时长分析时缺失行跳过而不是当 0 处理。cn_deals[duration_days] ( pd.to_datetime(cn_deals[completed_date]) - pd.to_datetime(cn_deals[announced_date]) ).dt.days这条计算会在completed_date为空时得到 NaT后续describe()会自动跳过这符合直觉。千万别把 NaT 填充成 0否则会得出「一半交易当天完成」的荒谬结论。6. 最小验证用一年一行的数据复现中国跨境并购趋势图清洗到这步可以做一个最小验证来确认整条链路没问题把数据聚合成「年份 × 方向」的长表画出外资进入中国和中企出海的两条趋势线。如果画出的曲线和公开报道里的并购周期对得上说明清洗逻辑基本正确对不上回头查前面 5 个坑。6.1 年度交割额与交割量的计算用year_ref做时间键inbound做方向键一次性聚合出总额和笔数。yearly ( cn_deals.groupby([year_ref, inbound]) .agg( total_usdm(deal_value_usdm, sum), n_deals(deal_id, nunique) ) .reset_index() ) print(yearly[yearly[inbound]].tail())n_deals用的是nunique保证联合收购只算一笔交易。如果这里用了size()行数膨胀的问题就会在趋势图里暴露成异常尖峰。6.2 用 5 年移动平均剔除公告泡沫原始年度值波动太大2016 年的海外并购尖峰和 2021 年的回调放在同一张图里会让中段年份几乎看不清。我一般叠加一条 5 年移动平均辅助线用来读周期趋势。inbound_pivot yearly[yearly[inbound]].set_index(year_ref)[total_usdm] ma5 inbound_pivot.rolling(5, min_periods1).mean() print(pd.DataFrame({raw: inbound_pivot, ma5: ma5}).tail())min_periods1让前几年也有值避免图前段出现空白。移动平均只作为辅助线原始值保留在图上这样读者能同时看到真实波动和周期趋势。做完这条验证再回头看 4.2 的汇率换算是否合理——如果趋势曲线的量级和公开统计相差十倍以上优先查单位换算而不是代码逻辑。我最初拿到这份 zip 时踩的第一个跟头就是把 Rumour 算进了已完成交易画出来的趋势图和当年公开报道完全错位。后来养成的习惯是任何并购数据库导出包第一步永远是打印value_counts和nunique而不是直接画图。这份 zephyr 中国跨国并购数据只要把状态口径、金额单位和离岸注册地三个问题处理干净2000-2024 这个长区间能支撑很多扎实的实证分析。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

端侧原生DOA+波束降噪:远场语音增强的硬件-算法协同方案
端侧原生DOA+波束降噪:远场语音增强的硬件-算法协同方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 15:06:09

MiMo-V2.6:面向5G/6G的物理信息神经信道建模系统
MiMo-V2.6:面向5G/6G的物理信息神经信道建模系统

1. MiMo-V2.6 不是“又一个大模型”,而是通信与AI交叉领域里一次静默但关键的范式迁移你可能在技术社区刷到过“MiMo-V2.6”这个代号,但它几乎从不登上主流AI媒体的头条——没有发布会、没有参数对比图、没有“吊打GPT-4”的营销话术。它甚至不是传统意义… · 2026/9/26 15:06:09

多重假设检验校正:FDR、q值与BH方法详解
多重假设检验校正:FDR、q值与BH方法详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 15:06:09

video-use:视频工程实践的四层架构与生产避坑指南
video-use:视频工程实践的四层架构与生产避坑指南

1. “video-use”不是功能模块,而是一套视频工程实践的通用代号你搜“video-use”,什么也找不到——它既不是 npm 包名,也不是 PyPI 上的库,更不是某个开源项目的官方命名。但如果你在 GitHub 提交记录里看到git commit -m "… · 2026/9/26 15:36:38

Java SpringBoot 实战B2b笔记_dto list-CSDN博客
Java SpringBoot 实战B2b笔记_dto list-CSDN博客

首屏导读 本教程配套付费专栏: 大模型工程师修炼手记 19.9 元(AI 编程 / Agent 实战 | 本文同主题系统课程) AI时代程序员的自我提升 49.9 元(AI 时代成长方法论)。 单篇不过瘾?订阅解锁全量源… · 2026/9/26 15:36:25

Hotel-ID打击人口贩卖
Hotel-ID打击人口贩卖

据报道,每年约有20,000名妇女遭到拐卖,许多犯罪分子在酒店房间内给人口贩运的受害者拍照。这些照片在警方调查中至关重要,然而,由于图像质量通常受到像素不足和摄像机角度问题的影响,识别这些酒店房间对于破案工作来说颇具挑战。 在CVPR 2022的FGVC9(细粒度视觉分类)研… · 2026/9/26 15:36:25

Windows 10 下 wsl --update 权限报错解决与离线安装 WSL 内核指南
Windows 10 下 wsl --update 权限报错解决与离线安装 WSL 内核指南

1. 问题背景与核心痛点拆解1.1 这个报错到底在说什么如果你在 Windows 10 上敲下wsl --update,终端回你一句“请求的操作需要提升”,别慌,这不是系统坏了,也不是 WSL 装错了。这句话翻译成人话就是:当前这个终端窗口没… · 2026/9/26 15:36:19

AI写小说哪个软件好用?亲测10款工具后,我把TaoToken接进了创作工作流
AI写小说哪个软件好用?亲测10款工具后,我把TaoToken接进了创作工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 15:36:10

基于 hermes agent 与 llm-wiki 的知识管理:TaoToken 统一 Key 接入配置实战
基于 hermes agent 与 llm-wiki 的知识管理:TaoToken 统一 Key 接入配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 15:36:10

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码