如何做海量数据合并

需求:请使用A股上市公司季度营收预测数据集《Income Statement.xls》和《Company Operating.xlsx》和《Market Data.xlsx》,以Market Data为主表,将三张表中的TICKER_SYMBOL为600383和600048的信息合并在一起。只需要显示以下字段。

表名 字段名
Income Statement TICKER_SYMBOL
Income Statement END_DATE
Income Statement T_REVENUE
Income Statement T_COGS
Income Statement N_INCOME
Market Data TICKER_SYMBOL
Market Data END_DATE_
Market Data CLOSE_PRICE
Company Operating TICKER_SYMBOL
Company Operating INDIC_NAME_EN
Company Operating END_DATE
Company Operating VALUE

思考:海量数据集合并,首先想到运算效率。由于是海量数据合并,如条件不做筛选,数据处理量较大的情况下,读入数据的时长会非常长,导致运算时长较久。

#导入pandas库,数据读入DataFrame容器import pandas as pd
Income_Statement=pd.read_excel('./data/阿里天池/Income Statement.xls',usecols=['TICKER_SYMBOL','END_DATE','T_REVENUE','T_COGS','N_INCOME'])
Market_Data=pd.read_excel('./data/阿里天池/Market Data.xlsx',usecols=['TICKER_SYMBOL','END_DATE_','CLOSE_PRICE'])
Company_Operating=pd.read_excel('./data/阿里天池/Company Operating.xlsx',sheet_name='EN',usecols=['TICKER_SYMBOL','INDIC_NAME_EN','END_DATE','VALUE'])

相比用Heidi直接导入SQL文件,python的数据写入用时很短。这边先在读入数据时做了字段(列名)筛选,便于减少读入的数据量


接下来关于需求的一个核心理解,先看一段SQL代码如下

select i.TICKER_SYMBOL i_TICKER_SYMBOL,i.END_DATE i_END_DATE,i.T_REVENUE,i.T_COGS,i.N_INCOME,m.TICKER_SYMBOL m_TICKER_SYMBOL,m.END_DATE m_END_DATE,m.CLOSE_PRICE,c.TICKER_SYMBOL c_TICKER_SYMBOL,c.INDIC_NAME_EN,c.END_DATE c_END_DATE,c.VALUE
from `market data` m left join `income statement` i on m.TICKER_SYMBOL=i.TICKER_SYMBOL
left join `company operating`c on m.TICKER_SYMBOL=c.TICKER_SYMBOL
where m.TICKER_SYMBOL in (600383,600048);

这边我参考了网上很多写法(大部分都很类似)如上方式,用这类方式合并后的数据量会非常大这么写的结果是:7,871,472行数据量

而网上还有一种很复杂查询方式,如下多个子查询嵌套。最终结果:606行记录

SELECT MD.* ,OD.INDIC_NAME_EN,OD.VALUE,IT.N_INCOME,IT.T_COGS,IT.T_REVENUE
FROM ( SELECT TICKER_SYMBOL,END_DATE,CLOSE_PRICE FROM `market data`
WHERE TICKER_SYMBOL IN ('600383','600048'))AS MD LEFT JOIN
( SELECT TICKER_SYMBOL,INDIC_NAME_EN,END_DATE,VALUE FROM `company operating`
WHERE TICKER_SYMBOL IN ('600383','600048'))AS OD
ON MD.TICKER_SYMBOL=OD.TICKER_SYMBOL AND MD.END_DATE=OD.END_DATE
LEFT JOIN ( SELECT DISTINCT TICKER_SYMBOL,END_DATE,T_REVENUE,T_COGS,N_INCOME
FROM `income statement`
WHERE TICKER_SYMBOL IN ('600383','600048'))AS IT
ON MD.TICKER_SYMBOL=IT.TICKER_SYMBOL AND MD.END_DATE=IT.END_DATE;

仔细对比了2个方式。发现第一种方式是先用主键TICKER_SYMBOL进行inner合并,再做where筛选指定股票代码。

而第二种方式是先把3个列表里指定的股票代码筛选出来后,再合并筛选后的3张表。

重新再看了遍题目的要求:以Market Data为主表,将三张表中的TICKER_SYMBOL为600383和600048的信息合并在一起。也就是只合并3个表里TICKER_SYMBOL为600383和600048的信息

所以如果先用TICKER_SYMBOL作为主键,进行inner合并,再筛选。其实就会出现了很多重复数据,导致数据冗余。也就是导致数据量如此庞大的原因


Md=Market_Data[(Market_Data['TICKER_SYMBOL']==600383) | (Market_Data['TICKER_SYMBOL']==600048)]
Is=Income_Statement[(Income_Statement['TICKER_SYMBOL']==600383) | (Income_Statement['TICKER_SYMBOL']==600048)]
Co=Company_Operating[(Company_Operating['TICKER_SYMBOL']==600383) | (Company_Operating['TICKER_SYMBOL']==600048)]

理解这点后,就先把数据做筛选处理,把3个容器中的TICKER_SYMBOL为600383和600048的数据先筛出来(可以在导入数据时先建立索引。会比现在代码更简洁)

finally_data=pd.concat([Md,Is,Co],keys={'Md','Is','Co'})

最后再用pd.concat合并,并用keys参数区分开3张原表的数据。这里为什么用concat方法,其实刚开始用了merge方法。merge方法的问题是一次只能合并2个表。但这个不是关键,merge方法中文理解应该是【连接】,而concat方法理解是【拼接】。merge方法合并数据即便用outer(外连接),也会自动把重复的数据合并,而拼接是不会合并重复数据。concat方法只会合并重列名和行索引。

最终出来的结果:678条记录

如下完整代码

import pandas as pd#读入数据
Income_Statement=pd.read_excel('./data/阿里天池/Income Statement.xls',usecols=['TICKER_SYMBOL','END_DATE','T_REVENUE','T_COGS','N_INCOME'])
Market_Data=pd.read_excel('./data/阿里天池/Market Data.xlsx',usecols=['TICKER_SYMBOL','END_DATE_','CLOSE_PRICE'])
Company_Operating=pd.read_excel('./data/阿里天池/Company Operating.xlsx',sheet_name='EN',usecols=['TICKER_SYMBOL','INDIC_NAME_EN','END_DATE','VALUE'])
Md=Market_Data[(Market_Data['TICKER_SYMBOL']==600383) | (Market_Data['TICKER_SYMBOL']==600048)]#筛选处理数据
Is=Income_Statement[(Income_Statement['TICKER_SYMBOL']==600383) | (Income_Statement['TICKER_SYMBOL']==600048)]
Co=Company_Operating[(Company_Operating['TICKER_SYMBOL']==600383) | (Company_Operating['TICKER_SYMBOL']==600048)]#合并数据
finally_data=pd.concat([Md,Is,Co],keys={'Md','Is','Co'})

最后对比用SQL和Python分别处理此类情景

SQL文档读入海量数据时间会比CSV读入DataFrame的时间来的久,但一旦读入数据库后,查询处理数据会比较方便。不用像python每次要花时间重新把数据读入容器。

python处理数据比较快,包括后面做数据清洗:如查缺补漏,处理NaN,字符串处理等。最主要python的解题思路是自由决定先后顺序。而不用像SQL代码的执行顺序是固定的,如where必须是select之后,from是最先执行等。

【学习记录】阿里天池SQL练习题1-python与SQL方式比较相关推荐

  1. 数据库笔记(4)SQL练习题及Python与数据库交互

    一.数据的准备 1.1创建数据表 --创建"京东"数据库 create database jing_dong charset=utf8; --使用"京东"数据库 ...

  2. python连接sql sever_R和python连接SQL sever 数据库操作

    在R的使用中,为了方便提取数据, 我们经常要进行数据库进行操作,接下来我们尝试使用R进行连接数据. 这里我们使用R中的RODBC进行操作, 首先,我们需要先配置ODBC资源管理器 通过任务管理器或者w ...

  3. CSS学习记录9/3D的正方体的两种编写方式/3D长方体的编写方式/3D动画/3D播放器

    什么是2D什么是3D? 2D就是一个平面,只是宽度和高度,没有厚度. 3D就是一个立体,有宽度有高度,还有厚度. 默认情况下所有的元素都是呈2D展现的. 如何让某个元素呈3D展现? 和透视一样,只需给 ...

  4. python做实时温度曲线图_Python学习记录 - matplotlib绘制温度变化折线图

    Python学习记录 - matplotlib绘制温度变化折线图 Python学习记录 - matplotlib绘制温度变化折线图 题目:列表a表示10点到12点每一分钟的气温,累计为2个小时,绘制折 ...

  5. 阿里巴巴开源AI技术:强化学习在阿里的技术演进与业务创新

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 当前的机器学习算法大致可以分为有监督的学习.无监督的学习和强化学 习(Reinforcemen ...

  6. Opencv 入门篇学习记录(图片)

    title: Opencv 入门篇学习记录(图片) Opencv 入门篇学习记录(图片) 前言 很早以前就接触Python了,大学的时候还自学了一段时间去做了课设,写了一些最速梯度下降法.黄金分割法. ...

  7. 【阿里天池算法学习赛】测测你的一见钟情指数/机器学习/深度学习/数据处理/Python基础

    [阿里天池算法学习赛]测测你的一见钟情指数 地址:https://tianchi.aliyun.com/competition/entrance/531825/introduction?spm=517 ...

  8. 阿里云天池龙珠计划SQL入门与实践 | Task02 SQL基础查询与排序

    本文为阿里云天池学习<SQL入门与实践>第二讲学习笔记,同时该讲内容基于<SQL基础教程>第二章(查询基础)及第三章(聚合与排序). SQL基础查询与排序 一.SELECT语句 ...

  9. 阿里天池学习赛-金融风控-贷款违约预测

    阿里天池学习赛-金融风控-贷款违约预测 1 赛题理解 1.1 赛题数据 1.2 评测标准 2 探索性分析(EDA) 2.1 初窥数据 2.2 查看缺失值占比 2.3 数值型变量 2.3.1 数据分布 ...

最新文章

  1. 可视化调试工具gdb-dashboard
  2. Rocketmq介绍和安装
  3. JS弹窗确认Ajax封装方法
  4. mysql -d -e_mysql常用函数
  5. 3个框框带你理解EventLoop
  6. 什么是Servlet?对Servlet技术的浅尝解析
  7. JMeter JDBC Request(实现往mysql批量造数)
  8. 苹果应用商店AppStore审核规则指南
  9. 王垠 java_解读王垠博客“一道 Java 面试题”
  10. 服务器恢复系统怎么操作,windows2008用装置盘恢复服务器操作体系
  11. 停不下的脚步:IT高管人士的工作实录
  12. 在Windows(VMware)环境中安装Linux虚拟机(CentOS)
  13. coursera机器学习第二周编程作业
  14. 供应科研试剂Biotin-PEG-Thiol,Biotin-PEG-SH,生物素peg巯基
  15. 疯狂Java讲义-泛型
  16. nginx解决内外网隔离无法访问外网web地址问题
  17. 试一下JAVAMAIL
  18. c语言char数组和short数组的区别,详解C语言中Char型指针数组与字符数组的区别
  19. STM32 HAL库实现编码器测速
  20. KubeVela 1.5:灵活框选 CNCF 原子能力打造独特的企业应用发布平台

热门文章

  1. 微信视频号100w播放收入1000+的变现方式
  2. blas、lapack、atlas在Ubuntu上的安装
  3. mac地址修改_全球首款支持电脑名称和MAC地址修改的浏览器 VMLogin超级防关联指纹浏览器 同时支持模拟真人输入,支持自定义经纬度...
  4. 3.2收缩-扩张喷管实例
  5. 面试后HR让你等通知的真相
  6. 按键--找色找图基础
  7. 22款奔驰S400L升级原厂主动氛围灯,H17钢琴条纹饰板等,浪漫奢华
  8. MySQL学习笔记-从基础到进阶
  9. RT-Thread 柿饼GUI
  10. 32 Qt 之绘图之绘制一个漂亮的西瓜