当Excel遇到大数据问题,是时候用Python来拯救了
前言
与从事分析工作的人交谈,他们会告诉你他们对excel的爱恨情仇:
excel能做很多事情;当涉及到更大的数据集时,这简直是一种痛苦。数据需要很长时间才能加载,在你意识到机器的内存耗尽之前,整个事情就变得无法管理了。更不用说excel最多只能支持1,048,576行。
如果有一种简单的方法,那就是将数据传输到SQL数据库中进行分析。这就是Python拯救世界的方式。
Python中的SQL
首先,让我们研究一下在Python中使用SQL时最流行的选项:MySQL和SQLite。
MySQL有两个流行的库:PyMySQL和MySQLDb;而SQLite有SQLite3。
SQLite就是所谓的嵌入式数据库,这意味着它在我们的应用程序中运行,因此不需要先在某个地方安装它(不像MySQL)。
这是一个重要的区别;在我们寻求快速数据分析的过程中起着关键作用。因此,我们将继续学习如何使用SQLite。
在Python中设置SQLite
我们需要做的第一件事是导入库:
import sqlite3
然后,我们需要确定是否要在任何地方保存这个数据库,还是在应用程序运行时将它保存在内存中。
如果决定通过导入任何数据来实际保存数据库,那么我们必须给数据库一个名称,例如' FinanceExplainedDb ',并使用以下命令:
dbname = 'FinanceExplainedDb'
conn = sqlite3.connect(dbname + '.sqlite')
另一方面,如果我们想把整个东西保存在内存中,并在完成后让它消失,我们可以使用以下命令:
conn = sqlite3.connect(':memory:')
至此,SQLite已经全部设置好,可以在Python中使用了。假设我们在Table 1中加载了一些数据,我们可以用以下方式执行SQL命令:
cur = conn.cursor()
cur.execute('SELECT * FROM Table1')
for row in cur:
print(row)
现在让我们探索如何通过使用pandas的应用程序使数据可用。
使用pandas加载数据
假设我们已经有了数据,我们想要进行分析,我们可以使用Pandas库来做这件事。
首先,我们需要导入pandas库,然后我们可以加载数据:
import pandas as pd
#if we have a csv file
df = pd.read_csv('ourfile.csv')
#if we have an excel file
df = pd.read_excel('ourfile.xlsx')
一旦我们加载数据,我们可以把它直接放入我们的SQL数据库与一个简单的命令:
df.to_sql(name='Table1', con=conn)
如果在同一个表中加载多个文件,可以使用if_exists参数:
df.to_sql(name='Table1', con=conn, if_exists='append')
在处理较大的数据集时,我们将无法使用这个单行命令来加载数据。我们的应用程序将耗尽内存。相反,我们必须一点一点地加载数据。在这个例子中,我们假设每次加载10,000行:
chunksize = 10000
for chunk in pd.read_csv('ourfile.csv', chunksize=chunksize):
chunk.to_sql(name='Table1', con=conn, if_exists='append')
把所有的东西放在一起
为了将所有内容综合起来,我们提供一个Python脚本,它涵盖了我们讨论的大部分内容。
import sqlite3, pandas as pd, numpy as np
#####Creating test data for us -- you can ignore
from sklearn import datasets
iris = datasets.load_iris()
df1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']], columns= iris['feature_names'] + ['target'])
df1.to_csv('TestData.csv',index=False)
###########################
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
chunksize = 10
for chunk in pd.read_csv('TestData.csv', chunksize=chunksize):
chunk.columns = chunk.columns.str.replace(' ', '_') #replacing spaces with underscores for column names
chunk.to_sql(name='Table1', con=conn, if_exists='append')
cur.execute('SELECT * FROM Table1')
names = list(map(lambda x: x[0], cur.description)) #Returns the column names
print(names)
for row in cur:
print(row)
cur.close()原文:见文末阅读原文。
- (1024程序员节快乐)阿里祭出大器,Java代码检查插件
- Java多线程神器:join使用及原理
- SpringCloud配置中心内容加密
- Spring Boot日志集成
- MongoDB系列7:MongoDB存储引擎
- MongoDB系列6:MongoDB索引的介绍
- 文本数据处理的终极指南-[NLP入门]
- 神经网络思想建立LR模型(DL公开课第二周答案)
- 如何用卷积神经网络从歌曲中提取纯人声?这里有教程+代码
- 排序算法对比、总结(Python代码)
- 记一道未能答出的算法面试题
- 关于numpy mean函数的axis参数
- 在Keras+TF环境中,用迁移学习和微调做专属图像识别系统
- Tensorflow的LRN是怎么做的
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Azure DevOps+Docker+Asp.NET Core 实现CI/CD(二.创建CI持续集成管道)
- 这样的奇技淫巧,劝你不用也罢
- 我服务又双叒叕奔溃了,含泪干货分享
- Azure DevOps+Docker+Asp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)
- Android数据库高手秘籍(十二),LitePal的索引功能
- 使用pm2管理go应用进程
- 用Docker搭建Redis主从复制的集群
- IDEA 非常重要的一些设置项 → 一连串的问题差点让我重新用回 Eclipse !
- ArrayList源码分析(基于jdk1.8)(二):subList陷阱补充
- Windows10中安装Docker
- Windows下Docker安装ClickHouse
- ArrayList源码分析(基于jdk1.8)(三):Arrays.asList方法带来的问题
- 对基本类型包装类常量池的补充
- 与IntegerCache有关的一个比较坑的面试题
- C# Foreach循环本质与枚举器