jma*_*use 26 python sqlite pandas
我有一个从大熊猫DataFrame中提取的股票市场数据列表(见下面的格式).该日期用作DataFrame中的索引.我想将数据(包括索引)写入SQLite数据库.
AAPL GE
Date
2009-01-02 89.95 14.76
2009-01-05 93.75 14.38
2009-01-06 92.20 14.58
2009-01-07 90.21 13.93
2009-01-08 91.88 13.95
Run Code Online (Sandbox Code Playgroud)
基于我对Pandas的write_frame代码的阅读,它目前不支持编写索引.我尝试使用to_records,但遇到了Numpy 1.6.2和datetimes的问题.现在我正在尝试使用.itertuples编写元组,但SQLite抛出了一个错误,表明数据类型不受支持(参见下面的代码和结果).我对Python,Pandas和Numpy比较陌生,所以我完全有可能错过一些明显的东西.我想我在尝试为SQLite写一个日期时遇到了问题,但我想我可能会过于复杂.
我想我可以通过升级到Numpy 1.7或Pandas的开发版来修复这个问题,Pandas在GitHub上发布了一个修复程序.我更愿意使用软件的发布版本开发 - 我是新手,我不希望稳定性问题进一步混淆.
有没有办法使用Python 2.7.2,Pandas 0.10.0和Numpy 1.6.2来实现这一目标?也许以某种方式清理日期时间?我有点过头了,任何帮助都会受到赞赏.
码:
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import sqlite3 as db
# download data from yahoo
all_data = {}
for ticker in ['AAPL', 'GE']:
all_data[ticker] = pd.io.data.get_data_yahoo(ticker, '1/1/2009','12/31/2012')
# create a data frame
price = DataFrame({tic: data['Adj Close'] for tic, data in all_data.iteritems()})
# get output ready for database export
output = price.itertuples()
data = tuple(output)
# connect to a test DB with one three-column table titled "Demo"
con = db.connect('c:/Python27/test.db')
wildcards = ','.join(['?'] * 3)
insert_sql = 'INSERT INTO Demo VALUES (%s)' % wildcards
con.executemany(insert_sql, data)
Run Code Online (Sandbox Code Playgroud)
结果:
---------------------------------------------------------------------------
InterfaceError Traceback (most recent call last)
<ipython-input-15-680cc9889c56> in <module>()
----> 1 con.executemany(insert_sql, data)
InterfaceError: Error binding parameter 0 - probably unsupported type.
Run Code Online (Sandbox Code Playgroud)
And*_*den 32
在最近的pandas中,索引将保存在数据库中(您以前必须reset_index先保存).
关注文档(在内存中设置SQLite连接):
import sqlite3
# Create your connection.
cnx = sqlite3.connect(':memory:')
Run Code Online (Sandbox Code Playgroud)
注意:您也可以在此处传递SQLAlchemy引擎(请参阅答案结尾).
我们可以保存price2到cnx:
price2.to_sql(name='price2', con=cnx)
Run Code Online (Sandbox Code Playgroud)
我们可以检索通过read_sql:
p2 = pd.read_sql('select * from price2', cnx)
Run Code Online (Sandbox Code Playgroud)
但是,当存储(和检索)日期unicode而不是Timestamp.要转换回我们开始使用的内容,我们可以使用pd.to_datetime:
p2.Date = pd.to_datetime(p2.Date)
p = p2.set_index('Date')
Run Code Online (Sandbox Code Playgroud)
我们得到了相同的DataFrame prices:
In [11]: p2
Out[11]:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1006 entries, 2009-01-02 00:00:00 to 2012-12-31 00:00:00
Data columns:
AAPL 1006 non-null values
GE 1006 non-null values
dtypes: float64(2)
Run Code Online (Sandbox Code Playgroud)
您还可以使用SQLAlchemy引擎:
from sqlalchemy import create_engine
e = create_engine('sqlite://') # pass your db url
price2.to_sql(name='price2', con=cnx)
Run Code Online (Sandbox Code Playgroud)
这允许您使用read_sql_table(只能与SQLAlchemy一起使用):
pd.read_sql_table(table_name='price2', con=e)
# Date AAPL GE
# 0 2009-01-02 89.95 14.76
# 1 2009-01-05 93.75 14.38
# 2 2009-01-06 92.20 14.58
# 3 2009-01-07 90.21 13.93
# 4 2009-01-08 91.88 13.95
Run Code Online (Sandbox Code Playgroud)
Wes*_*Wes 11
不幸的是,pandas.io.write_frame在最新版本的Pandas中不再存在关于当前接受的答案.例如,我使用的是pandas 0.19.2.你可以做点什么
from sqlalchemy import create_engine
disk_engine = create_engine('sqlite:///my_lite_store.db')
price.to_sql('stock_price', disk_engine, if_exists='append')
Run Code Online (Sandbox Code Playgroud)
然后依次使用以下内容预览您的表格:
df = pd.read_sql_query('SELECT * FROM stock_price LIMIT 3',disk_engine)
df.head()
Run Code Online (Sandbox Code Playgroud)
do-*_*-me 10
import pandas as pd
import sqlite3 as sq
df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
table_name = "test" # table and file name
conn = sq.connect('{}.sqlite'.format(table_name)) # creates file
df.to_sql(table_name, conn, if_exists='replace', index=False) # writes to file
conn.close() # good practice: close connection
Run Code Online (Sandbox Code Playgroud)
conn = sq.connect('{}.sqlite'.format(table_name))
df = pd.read_sql('select * from {}'.format(table_name), conn)
conn.close()
Run Code Online (Sandbox Code Playgroud)
小智 9
以下是对我有用的代码。我能够将它写入 SQLite DB。
import pandas as pd
import sqlite3 as sq
data = <This is going to be your pandas dataframe>
sql_data = 'D:\\SA.sqlite' #- Creates DB names SQLite
conn = sq.connect(sql_data)
cur = conn.cursor()
cur.execute('''DROP TABLE IF EXISTS SA''')
data.to_sql('SA', conn, if_exists='replace', index=False) # - writes the pd.df to SQLIte DB
pd.read_sql('select * from SentimentAnalysis', conn)
conn.commit()
conn.close()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35218 次 |
| 最近记录: |