26

おおよそ次のような選択があるとします。

select instrument, price, date from my_prices;

返された価格を単一のデータフレームに展開し、各商品のシリーズを作成し、日付にインデックスを付けるにはどうすればよいですか?

明確にするために:私は探しています:

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: ...
Data columns (total 2 columns):
inst_1    ...
inst_2    ...
dtypes: float64(1), object(1) 

私は探していません:

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: ...
Data columns (total 2 columns):
instrument    ...
price         ...
dtypes: float64(1), object(1)

...簡単です;-)

4

4 に答える 4

41

カーソル オブジェクトを DataFrame コンストラクターに渡すことができます。ポストグルの場合:

import psycopg2
conn = psycopg2.connect("dbname='db' user='user' host='host' password='pass'")
cur = conn.cursor()
cur.execute("select instrument, price, date from my_prices")
df = DataFrame(cur.fetchall(), columns=['instrument', 'price', 'date'])

次に、次のようにインデックスを設定します

df.set_index('date', drop=False)

または直接:

df.index =  df['date']
于 2013-06-17T20:23:30.437 に答える
32

更新: 最近のパンダには次の機能があります:read_sql_tableread_sql_query.

最初に db エンジンを作成します (接続もここで機能します)。

from sqlalchemy import create_engine
# see sqlalchemy docs for how to write this url for your database type:
engine = create_engine('mysql://scott:tiger@localhost/foo')

sqlalchemy データベースの URLを参照してください。

pandas_read_sql_table

table_name = 'my_prices'
df = pd.read_sql_table(table_name, engine)

pandas_read_sql_query

df = pd.read_sql_query("SELECT instrument, price, date FROM my_prices;", engine)

古い回答では、廃止された read_frame を参照していました (その回答については、この質問のバージョン履歴を参照してください)。


多くの場合、最初に読み取り、次に要件への変換を実行するのが理にかなっています (これらは通常、パンダで効率的で読みやすいため)。あなたの例では、次pivotの結果が得られます。

df.reset_index().pivot('date', 'instrument', 'price')

注: で指定しない を見逃す可能性がありreset_indexます。index_colread_frame

于 2013-06-17T20:26:51.660 に答える