在本文中,我们将为您详细介绍使用Pandas导入多个SQL表的相关知识,并且为您解答关于pandas导入数据库的疑问,此外,我们还会提供一些关于9-pandas导入导出数据、mysqlsource导入
在本文中,我们将为您详细介绍使用Pandas导入多个SQL表的相关知识,并且为您解答关于pandas 导入数据库的疑问,此外,我们还会提供一些关于9-pandas导入导出数据、mysql source导入多个sql文件和较大文件及在线互转、MySQL高效导入多个.sql文件方法详解、PandaSQL:一个让你能够通过SQL语句进行pandas的操作的python包的有用信息。
本文目录一览:- 使用Pandas导入多个SQL表(pandas 导入数据库)
- 9-pandas导入导出数据
- mysql source导入多个sql文件和较大文件及在线互转
- MySQL高效导入多个.sql文件方法详解
- PandaSQL:一个让你能够通过SQL语句进行pandas的操作的python包
使用Pandas导入多个SQL表(pandas 导入数据库)
我有一个包含多个表的数据库,并且我试图将每个表作为pandas数据框导入。我可以对单个表执行以下操作:
import pandas as pd
import pandas.io.sql as psql
import pypyodbc
conn = pypyodbc.connect("DRIVER={SQL Server};\
SERVER=serveraddress;\
UID=uid;\
PWD=pwd;\
DATABASE=db")
df1 = psql.read_frame('SELECT * FROM dbo.table1',conn)
数据库中表的数量将发生变化,并且我希望能够随时将每个表导入其自己的数据框中。如何将所有这些桌子放入大熊猫中?
9-pandas导入导出数据
#encoding:utf8
''''''
数据导入导出处理:
索引和列名
缺失值处理
逐块读取数据
保存数据到磁盘
二进制数据
其他格式:HDF5,Excel,JSON,SQL,NoSQL
''''''
import numpy as np
import pandas as pd
#读取文件
''''''
a,b,c,d,message
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo
没有行索引
''''''
print(pd.read_csv(''data/ex1.csv''))
''''''
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
''''''
#读取数据,分隔符逗号,支持正则
print(pd.read_table(''data/ex1.csv'',sep='',''))
''''''
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
''''''
#读取数据没有行,列名称
''''''
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo
''''''
print(pd.read_csv(''data/ex2.csv''))
#说明没有列名称,并且指定列名称
print(pd.read_csv(''data/ex2.csv'',header=None,names=[''a'',''b'',''c'',''d'',''msg'']))
''''''
1 2 3 4 hello
0 5 6 7 8 world
1 9 10 11 12 foo
默认把第一行作为列名称
a b c d msg
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
''''''
#指定某列名为行索引
print(pd.read_csv(''data/ex2.csv'',header=None,names=[''a'',''b'',''c'',''d'',''msg''],index_col=''msg''))
''''''
a b c d
msg
hello 1 2 3 4
world 5 6 7 8
foo 9 10 11 12
''''''
#分隔符不规则的
''''''
A B C
aaa -0.264438 -1.026059 -0.619500
bbb 0.927272 0.302904 -0.032399
ccc -0.264273 -0.386314 -0.217601
ddd -0.871858 -0.348382 1.100491
''''''
print(pd.read_csv(''data/ex3.csv''))
''''''
A B C
0 aaa -0.264438 -1.026059 -0.619500
1 bbb 0.927272 0.302904 -0.032399
2 ccc -0.264273 -0.386314 -0.217601
3 ddd -0.871858 -0.348382 1.100491
实际上它把后面的整体都作为数据了
''''''
print(pd.read_table(''data/ex3.csv'',sep=''\s+''))
''''''
A B C
aaa -0.264438 -1.026059 -0.619500
bbb 0.927272 0.302904 -0.032399
ccc -0.264273 -0.386314 -0.217601
ddd -0.871858 -0.348382 1.100491
如果行列不匹配会自动的把相应第一列作为索引
''''''
#缺失数据
''''''
something,a,b,c,d,message
one,1,2,3,4,NA
two,5,6,,8,world
three,9,10,11,12,foo
''''''
print(pd.read_csv(''data/ex5.csv''))
print(pd.read_csv(''data/ex5.csv'',na_values=[''NA'',''NULL'',''foo'']))
''''''
something a b c d message
0 one 1 2 3.0 4 NaN
1 two 5 6 NaN 8 world
2 three 9 10 11.0 12 foo
会把Na和空值赋值为Nan进行表示
something a b c d message
0 one 1 2 3.0 4 NaN
1 two 5 6 NaN 8 world
2 three 9 10 11.0 12 NaN
指定了缺失值
''''''
#给不同的列取不同的缺失值
print(pd.read_csv(''data/ex5.csv'',na_values={''message'':[''NA'',''NULL'',''foo''],''something'':[''one'',''two'']}))
''''''
something a b c d message
0 NaN 1 2 3.0 4 NaN
1 NaN 5 6 NaN 8 world
2 three 9 10 11.0 12 NaN
''''''
#处理比较多的数据方式
''''''
one,two,three,four,key
0.467976300189,-0.0386485396255,-0.295344251987,-1.82472622729,L
-0.358893469543,1.40445260007,0.704964644926,-0.200638304015,B
10000行左右
''''''
#统计key列出现的次数并且输出前10的
#读取10行
print(pd.read_csv(''data/ex6.csv'',nrows=10))
''''''
one two three four key
0 0.467976 -0.038649 -0.295344 -1.824726 L
1 -0.358893 1.404453 0.704965 -0.200638 B
2 -0.501840 0.659254 -0.421691 -0.057688 G
3 0.204886 1.074134 1.388361 -0.982404 R
4 0.354628 -0.133116 0.283763 -0.837063 Q
5 1.817480 0.742273 0.419395 -2.251035 Q
6 -0.776764 0.935518 -0.332872 -1.875641 U
7 -0.913135 1.530624 -0.572657 0.477252 K
8 0.358480 -0.497572 -0.367016 0.507702 S
9 -1.740877 -1.160417 -1.637830 2.172201 G
''''''
#分块
#每次读取1000行
tr = pd.read_csv(''data/ex6.csv'',chunksize=1000)
print(type(tr))
''''''
<class ''pandas.io.parsers.TextFileReader''>
''''''
#可以同for循环来进行
result = pd.Series()
for chunk in tr:
result = result.add(chunk[''key''].value_counts(),fill_value=0)
print(result)
''''''
0 151.0
1 146.0
2 152.0
3 162.0
4 171.0
5 157.0
6 166.0
7 164.0
8 162.0
9 150.0
A 320.0
B 302.0
C 286.0
D 320.0
E 368.0
F 335.0
G 308.0
H 330.0
I 327.0
J 337.0
K 334.0
L 346.0
M 338.0
N 306.0
O 343.0
P 324.0
Q 340.0
R 318.0
S 308.0
T 304.0
U 326.0
V 328.0
W 305.0
X 364.0
Y 314.0
Z 288.0
''''''
print(result.sort_values(ascending=False)[:10])
''''''
E 368.0
X 364.0
L 346.0
O 343.0
Q 340.0
M 338.0
J 337.0
F 335.0
K 334.0
H 330.0
这样就得到前10的数据
''''''
#保存
df = pd.read_csv(''data/ex5.csv'')
print(df)
''''''
something a b c d message
0 one 1 2 3.0 4 NaN
1 two 5 6 NaN 8 world
2 three 9 10 11.0 12 foo
''''''
df.to_csv(''data/ex5_out.csv'')
''''''
,something,a,b,c,d,message
0,one,1,2,3.0,4,
1,two,5,6,,8,world
2,three,9,10,11.0,12,foo
可以看到它把原来的索引也当成数据写入到文件中了
''''''
df.to_csv(''data/ex5_out.csv'',index=False)
''''''
something,a,b,c,d,message
one,1,2,3.0,4,
two,5,6,,8,world
three,9,10,11.0,12,foo
''''''
#取消列
df.to_csv(''data/ex5_out.csv'',index=False,header=None)
#保存那几列
df.to_csv(''data/ex5_out.csv'',index=False,header=None,columns=[''b'',''c'',''message''])
mysql source导入多个sql文件和较大文件及在线互转
mysql>set names utf8;
mysql>source d:/mysql/all.sql;
通过source命令导入多个文件,可以新建一个all.sql文件,里面存放下面的命令
例如:
source d:/a1.sql;
source d:/a2.sql;
当你运行
mysql>source d:/mysql/all.sql;
这样就可以在一个source命令里面导入多个sql文件了。
我看到还有人尝试用 source *.sql 来执行,这样是不行的(哥也尝试了一下)。
值得注意一点的是,all.sql加载进来的sql文件最好写绝对路径,否则会找不到文件,除非你是在.sql的同级目录底下启用的mysql
但这样会有一个问题,如果有一100个这样的文件我们一个个去写命令肯定很麻烦,下面我百度搜索到一个解决办法
<pre name="code">
<span>新建一个all.sql vim all.sql 在里面写入: source 1.sql source 2.sql ...... source 53.sql source 54.sql 然后只要 mysql> source all.sql</span>
另一种大文件导入解决办法,这个是用服务器管理权限的用户了
在mysql的安装目录下 找到 my.ini文件 加入以下代码:
interactive_timeout = 120 wait_timeout = 120 max_allowed_packet = 32M
source "路径名"+/mytest_emp_dept.sql
如果两个在线的网站互转数据,解决就更简单了:
mysqldump -uuser -ppwd database | mysql -hip -ppwd database
*user为数据库用户名;pwd为数据库密码;ip为数据库ip;database为数据库名字;另外后面为目标库*
MySQL高效导入多个.sql文件方法详解
MySQL有多种方法导入多个.sql文件(里面是sql语句),常用的有两个命令:mysql和source。
但是这两个命令的导入效率差别很大,具体请看最后的比较。
(还有sqlimport和LOAD DATA INFILE等导入方法,不过它们主要用于导入.csv或.xml文件数据,不是.sql文件)
假设我们有一个 users.sql 大文件,为方便我们将其拆分成:user1.sql、user2.sql、user3.sql 三个独立的小sql文件。
1、mysql命令导入
mysql命令导入多个sql文件方法:
$ for SQL in *.sql; do mysql -uroot -p"123456" mydb < $SQL; done
2、source命令导入
source命令需要首先进入MySQL命令行:
$ mysql -uroot -p"123456"
导入多个sql文件需要先创建一个额外的文件,名字随意,这里我们取:all.sql,内容:
source user1.sql
source user2.sql
source user3.sql
注意,这里每行一条,必须以source命令开头。
然后用source命令执行该文件:
mysql > use mydb; mysql > source /home/gary/all.sql
3、如何提高导入速度?
对于百M级以上文件,如果光这样导入,速度是极其缓慢的,
根据MySQL官方建议,我们有几个措施可以极大提高导入的速度,如下:
对于MyISAM,调整系统参数:bulk_insert_buffer_size(至少单个文件大小的2倍以上)
对于InnoDB,调整系统参数:innodb_log_buffer_size(至少单个文件大小的2倍以上,导入完成后可以改回默认的8M,注意不是innodb_buffer_pool_size。)
除主键外,删除其他索引,导入完成后重建索引。
关闭自动提交:autocommit=0。(请勿用set global autocommit=1;命令来关闭,否则整个MySQL系统都会停止自动commit,innodb log buffer很快就会爆满,5和6项也请仅在会话中有效,正确做法请往下看)
关闭唯一索引检查:unique_checks=0。(关闭了这一项会影响on duplicate key update的效果)
关闭外键检查:foreign_key_checks=0。
insert值写在一条语句内,如:INSERT INTO yourtable VALUES (1,2), (5,5), ...;
有自增列的,设置:innodb_autoinc_lock_mode的值为2,
其中,第1-2、8条在修改my.cnf文件,然后重启MySQL:
bulk_insert_buffer_size=2G; innodb_log_buffer_size=2G; innodb_autoinc_lock_mode=2;
第3条用到的命令:
#删除索引 DROP INDEX index_name ON talbe_name ALTER TABLE table_name DROP INDEX index_name ALTER TABLE table_name DROP PRIMARY KEY # 添加索引 ALTER TABLE table_name ADD INDEX index_name (column_list) ALTER TABLE table_name ADD UNIQUE (column_list) ALTER TABLE table_name ADD PRIMARY KEY (column_list)
第4-6条写在.sql中,批量bash脚本如下:
for SQL in *.sql; do echo $SQL; sed -i ''1i\SET autocommit=0;\nSET unique_checks=0;\nSET foreign_key_checks=0;'' $SQL sed -i ''$a\COMMIT;\nSET autocommit=1;\nSET unique_checks=1;\nSET foreign_key_checks=1;'' $SQL done
按照以上几个步骤调整后,插入速度必会有大幅度的提高。
4、mysql和source效率比较
在sql文件较小的情况下,source速度比mysql高,
在实际测试导入时,5个合计25M的sql文件,mysql命令的速度比source要快2秒(我自己的测试,不代表普遍的结果),
可以粗略得出,在导入大的sql文件时,建议使用mysql命令。
以上既是MySQL高效导入多个.sql文件的方法,希望能帮助到大家
- MySQL导入csv、excel或者sql文件的小技巧
- MYSQL导入导出sql文件简析
- mysql导入sql文件报错 ERROR 2013 2006 2002
- MySQL导入导出.sql文件及常用命令小结
- mysql导入sql文件命令和mysql远程登陆使用详解
- 在linux中导入sql文件的方法分享(使用命令行转移mysql数据库)
- mysql source 命令导入大的sql文件的方法
- mysql5的sql文件导入到mysql4的方法
- mysql导入sql文件出错的解决方法
PandaSQL:一个让你能够通过SQL语句进行pandas的操作的python包
Pandas是近年来最好的数据操作库之一。它允许切片、分组、连接和执行任意数据转换。如果你熟练的使用SQL,那么这篇文章将介绍一种更直接、简单的使用Pandas处理大多数数据操作案例。
假设你对SQL非常的熟悉,或者你想有更可读的代码。或者您只是想在dataframe上运行一个特殊的SQL查询。或者,也许你来自R,想要一个sqldf的替代品。
这篇文章将介绍一种在pandas的dataframe中使用SQL的python包,并且使用一个不等链接的查询操作来介绍PandasSQL的使用方法。
不等连接(Non-equi join)
假设你必须连接两个dataframe。其中一个显示了我们对某些商品进行促销的时间段。第二个是事务Dataframe。我想知道促销活动推动的销售情况,也就是促销期间的销售情况。
我们可以通过联接项目列以及联接条件(TransactionDt≥StartDt和TransactionDt≤EndDt)来实现这一点。因为现在我们的连接条件也有大于号和小于号,这样的连接称为不等连接。在继续之前,一定要考虑如何在pandas中做这样的事情。
pandas的解决方案
那么在pandas身上该怎么做呢?pandas肯定可以解决这个问题,尽管我认为它的可读性不够。
让我们从生成一些要处理的随机数据开始。
import pandas as pd
import random
import datetime
def random_dt_bw(start_date,end_date):
days_between = (end_date - start_date).days
random_num_days = random.randrange(days_between)
random_dt = start_date + datetime.timedelta(days=random_num_days)
return random_dt
def generate_data(n=1000):
items = [f"i_{x}" for x in range(n)]
start_dates = [random_dt_bw(datetime.date(2020,1,1),datetime.date(2020,9,1)) for x in range(n)]
end_dates = [x + datetime.timedelta(days=random.randint(1,10)) for x in start_dates]
offerDf = pd.DataFrame({"Item":items,
"StartDt":start_dates,
"EndDt":end_dates})
transaction_items = [f"i_{random.randint(0,n)}" for x in range(5*n)]
transaction_dt = [random_dt_bw(datetime.date(2020,1,1),datetime.date(2020,9,1)) for x in range(5*n)]
sales_amt = [random.randint(0,1000) for x in range(5*n)]
transactionDf = pd.DataFrame({"Item":transaction_items,"TransactionDt":transaction_dt,"Sales":sales_amt})
return offerDf,transactionDf
您不需要担心上面的随机数据生成代码。只要知道我们的随机数据是什么样子就可以了:
offerDf,transactionDf = generate_data(n=100000)
一旦我们有了数据,我们就可以通过合并列项上的数据来进行不等连接,然后根据所需条件进行过滤。
merged_df = pd.merge(offerDf,transactionDf,on=''Item'')pandas_solution = merged_df[(merged_df[''TransactionDt'']>=merged_df[''StartDt'']) &
(merged_df[''TransactionDt'']<=merged_df[''EndDt''])]
结果如下,正如我们所希望的:
PandaSQL解决方案
Pandas解决方案很好,可以做我们想做的事情,但是我们也可以使用PandaSQL以一种可读性更强的方式完成同样的事情。
PandaSQL是什么?
PandaSQL为我们提供了在panda数据数据库上编写SQL的方法。因此,如果您已经编写了一些SQL查询,那么使用pandaSQL可能比将它们转换为panda语法更有意义。为了开始使用PandaSQL,我们简单地安装它:
pip install -U pandasql
安装了pandaSQL之后,我们可以通过创建pysqldf函数来使用它,该函数接受一个查询作为输入,并运行该查询来返回一个Pandas DF。不用担心语法,因为跟使用pandas差不多。
from pandasql import sqldf
pysqldf = lambda q: sqldf(q, globals())
现在,我们可以使用这个函数在我们的pandas dataframe上运行任何SQL查询。下面是不等连接,我们希望使用可读性更强的SQL格式。
q = """
SELECT A.*,B.TransactionDt,B.Sales
FROM
offerDf A
INNER JOIN
transactionDf B
ON
A.Item = B.Item AND
A.StartDt <= B.TransactionDt AND
A.EndDt >= B.TransactionDt;
"""
pandaSQL_solution = pysqldf(q)
结果是一个我们所期望的panda Dataframe。索引已经自动为我们重置了,不像以前那样需要手动操作。
警告
虽然PandaSQL函数允许我们在我们的panda数据框架上运行SQL查询,并且在某些情况下是一个非常好的工具,但是它的性能不如纯panda语法。
当我们用可读性更强的PandaSQL为pandas计时时,我们发现PandaSQL花费的时间大约是原生pandas的10倍。
结论
虽然PandaSQL库的性能不如本地的panda,但当我们想进行特别分析时,它是对我们的数据分析工具箱的一个很好的补充,而且对于那些更习惯使用SQL查询的人来说。
想要更深入地了解这篇文章的代码,请访问我的GitHub知识库,在那里你可以找到这篇文章和我所有的文章的代码。
https://github.com/MLWhiz/data_science_blogs/tree/master/pandasql
译者注:我一直在寻找能够使用sql处理pandas的dataframe的解决方案,pandasSQL在这这方面起到了很好的开端,虽然他的性能还不足以在生产环境中使用,但是我们再进行EDA和数据分析等一次性的操作的时候完全可以使用sql替代复杂的pandas的查询语法。所以如果你跟我一样,对SQL非常熟悉,并且厌倦了pandas的复杂语法,pandasSQL是一个很好的解决方案
作者:Rahul Agarwal
deephub翻译组
本文分享自微信公众号 - DeepHub IMBA(deephub-imba)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
关于使用Pandas导入多个SQL表和pandas 导入数据库的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于9-pandas导入导出数据、mysql source导入多个sql文件和较大文件及在线互转、MySQL高效导入多个.sql文件方法详解、PandaSQL:一个让你能够通过SQL语句进行pandas的操作的python包的相关知识,请在本站寻找。
本文标签: