41

pandas DataFrame で Yahoo から取得した株式市場データのリストがあります (以下の形式を参照)。日付は 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

Pandas の write_frame コードを読んだところ、現在は index の書き込みをサポートしていません。代わりに to_records を使用しようとしましたが、Numpy 1.6.2 と datetimes で問題が発生しました。現在、.itertuples を使用してタプルを記述しようとしていますが、SQLite はデータ型がサポートされていないというエラーをスローします (以下のコードと結果を参照)。私はPython、Pandas、およびNumpyに比較的慣れていないため、明らかな何かが欠けている可能性は十分にあります。日時を SQLite に書き込もうとして問題が発生していると思いますが、これを複雑にしすぎている可能性があります。

Numpy 1.7 にアップグレードするか、GitHub に修正が投稿されている Pandas の開発バージョンにアップグレードすることで、問題を修正できる可能性があると思います。私はソフトウェアのリリース バージョンを使用して開発したいと考えています。

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)

結果:

---------------------------------------------------------------------------
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.
4

4 に答える 4

58

最近のパンダでは、インデックスはデータベースに保存されます (以前はreset_index最初に保存する必要がありました)。

ドキュメントに従ってください(メモリにSQLite接続を設定します):

import sqlite3
# Create your connection.
cnx = sqlite3.connect(':memory:')

注: ここで SQLAlchemy エンジンを渡すこともできます (回答の最後を参照)。

に保存できprice2ますcnx

price2.to_sql(name='price2', con=cnx)

次の方法で取得できますread_sql

p2 = pd.read_sql('select * from price2', cnx)

ただし、格納された (および取得された)日付unicodeTimestamp. 開始したものに戻すには、次を使用できますpd.to_datetime

p2.Date = pd.to_datetime(p2.Date)
p = p2.set_index('Date')

と同じ 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)

SQLAlchemy エンジンを使用することもできます:

from sqlalchemy import create_engine
e = create_engine('sqlite://')  # pass your db url

price2.to_sql(name='price2', con=cnx)

これにより、以下を使用できます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
于 2013-01-21T05:07:41.777 に答える