下面是我想要帮助的代码.我不得不运行超过1,300,000行,这意味着插入~300,000行需要40分钟.
我认为批量插入是加速它的路线?或者是因为我通过for data in reader:部分迭代行?
#Opens the prepped csv file
with open (os.path.join(newpath,outfile), 'r') as f:
#hooks csv reader to file
reader = csv.reader(f)
#pulls out the columns (which match the SQL table)
columns = next(reader)
#trims any extra spaces
columns = [x.strip(' ') for x in columns]
#starts SQL statement
query = 'bulk insert into SpikeData123({0}) values ({1})'
#puts column names in SQL query 'query'
query = query.format(','.join(columns), ','.join('?' * len(columns)))
print 'Query is: %s' …Run Code Online (Sandbox Code Playgroud) 我有一个存储在pandas DataFrame中的股票价格数据,如下所示(实际上它在面板中,但我将其转换为DataFrame)
date ticker close tsr
0 2013-03-28 abc 22.81 1.000439
1 2013-03-28 def 94.21 1.006947
2 2013-03-28 ghi 95.84 1.014180
3 2013-03-28 jkl 31.80 1.000000
4 2013-03-28 mno 32.10 1.003125
...many more rows
Run Code Online (Sandbox Code Playgroud)
我想将它保存在Django模型中,它看起来像这样(匹配列名):
class HistoricalPrices(models.Model):
ticker = models.CharField(max_length=10)
date = models.DateField()
tsr = models.DecimalField()
close = models.DecimalField()
Run Code Online (Sandbox Code Playgroud)
我到目前为止最好的用它来保存它,其中df是我的DataFrame:
entries = []
for e in df.T.to_dict().values():
entries.append(HistoricalPrices(**e))
HistoricalPrices.objects.bulk_create(entries)
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来保存这个?
我看过django-pandas,但看起来它只是从数据库读取.
我有一个1,000,000x 50Pandas DataFrame,我目前正在使用以下方法写入SQL表:
df.to_sql('my_table', con, index=False)
这需要非常长的时间.我已经看到了关于如何在线加速这个过程的各种解释,但它们似乎都不适用于MSSQL.
如果我尝试以下方法:
使用SQLAlchemy批量插入Pandas DataFrame
然后我收到一个no attribute copy_from错误.
如果我尝试多线程方法:
http://techyoubaji.blogspot.com/2015/10/speed-up-pandas-tosql-with.html
然后我收到一个QueuePool limit of size 5 overflow 10 reach, connection timed out错误.
有没有简单的方法来加速to_sql()到MSSQL表?要么是通过BULK COPY还是其他一些方法,而是完全来自Python代码?
我正在做一个项目,我必须编写一个包含数百万行和大约 25 列的数据框,主要是数字类型。我正在使用Pandas DataFrame to SQL Function将数据帧转储到 Mysql 表中。我发现这个函数创建了一个可以一次插入多行的 Insert 语句。这是一个很好的方法,但 MySQL 对可以使用这种方法构建的查询长度有限制。
有没有办法将它并行插入同一个表中,以便我可以加快进程?
当我尝试复制到AWS redshift时遇到此问题.这是我试图运行的代码:
with open('path/to/files, 'rb') as fo:
cursor.copy_from(fo, 'schema.table', sep=',')
cursor.commit()
Run Code Online (Sandbox Code Playgroud)
我遇到了错误:
psycopg2.ProgrammingError: syntax error at or near "stdin"
LINE 1: ...Y schema.table FROM stdin WITH...
Run Code Online (Sandbox Code Playgroud)
我用psycopg2运行python 3.5.希望你们能帮忙!Thx提前!
我来找你是因为我无法解决pandas.DataFrame.to_sql()方法的问题。
我已经在我的脚本和数据库之间建立了连接,我可以发送查询,但实际上它对我来说太慢了。
我想找到一种方法来提高我的脚本的性能。也许有人会找到解决方案?
这是我的代码:
engine = sqlalchemy.create_engine(con['sql']['connexion_string'])
conn = engine.connect()
metadata = sqlalchemy.Metadata()
try :
if(con['sql']['strategy'] == 'NEW'):
query = sqlalchemy.Table(con['sql']['table'],metadata).delete()
conn.execute(query)
Sql_to_deploy.to_sql(con['sql']['table'],engine,if_exists='append',index = False,chunksize = 1000,method = 'multi')
elif(con['sql']['strategy'] == 'APPEND'):
Sql_to_deploy.to_sql(con['sql']['table'],engine,if_exists='append',index = False,chunksize = 1000,method = 'multi')
else:
pass
except Exception as e:
print(type(e))
Run Code Online (Sandbox Code Playgroud)
当我退出 chunksize 和方法参数时,它正在工作,而且太慢了,这一刻它太慢了(30000 行几乎需要 3 分钟)。当我输入这些参数时,我得到一个sqlalchemy.exc.ProgrammingError...
感谢您的帮助 !
使用pandas dataframe的to_sql方法,我可以很容易地将少量行写入oracle数据库中的表:
from sqlalchemy import create_engine
import cx_Oracle
dsn_tns = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<host>)(PORT=1521))\
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=<servicename>)))"
pwd = input('Please type in password:')
engine = create_engine('oracle+cx_oracle://myusername:' + pwd + '@%s' % dsn_tns)
df.to_sql('test_table', engine.connect(), if_exists='replace')
Run Code Online (Sandbox Code Playgroud)
但是对于任何常规大小的数据帧(我的有60k行,不是那么大),代码变得无法使用,因为它在我愿意等待的时间内(从而超过10分钟)从未完成.我用Google搜索并搜索了几次,最接近的解决方案是ansonw在这个问题中给出的答案.但那个是关于mysql,而不是oracle.正如Ziggy Eunicien指出的那样,它对甲骨文不起作用.有任何想法吗?
编辑
以下是数据框中的行示例:
id name premium created_date init_p term_number uprate value score group action_reason
160442353 LDP: Review 1295.619617 2014-01-20 1130.75 1 7 -42 236.328243 6 pass
164623435 TRU: Referral 453.224880 2014-05-20 0.00 11 NaN -55 38.783290 1 suppress
Run Code Online (Sandbox Code Playgroud)
这是df的数据类型:
id int64
name object …Run Code Online (Sandbox Code Playgroud) 假设我有一个脚本,该脚本从数据库中将数据读取到数据帧中,在该数据帧上运行一些逻辑,然后将结果数据帧导出到另一个数据库表中,如下所示。问题是exec函数之后,transform.py中的数据帧不会被覆盖。
注意:这是一个简单的示例,用于说明问题,而不是我尝试使用此方法解决的实际问题。
期望:
执行前
+---------+---------------+--------------+----------+
| metric | modified_date | current_date | datediff |
+---------+---------------+--------------+----------+
| metric1 | 2019-03-31 | 2019-05-03 | 33 |
| metric2 | 2019-03-31 | 2019-05-03 | 33 |
| metric3 | 2019-03-31 | 2019-05-03 | 33 |
| metric4 | 2019-03-20 | 2019-05-03 | 44 |
+---------+---------------+--------------+----------+
Run Code Online (Sandbox Code Playgroud)
执行后
+---------+---------------+--------------+----------+
| metric | modified_date | current_date | datediff |
+---------+---------------+--------------+----------+
| metric4 | 2019-03-20 | 2019-05-03 | 44 |
+---------+---------------+--------------+----------+
Run Code Online (Sandbox Code Playgroud)
实际:
执行前
+---------+---------------+--------------+----------+ …Run Code Online (Sandbox Code Playgroud) pandas ×6
python ×5
performance ×2
pyodbc ×2
sql-server ×2
sqlalchemy ×2
bulkinsert ×1
dataframe ×1
django ×1
import ×1
mysql ×1
oracle ×1
pandasql ×1
postgresql ×1
psycopg2 ×1
python-3.x ×1
sql ×1
stdin ×1