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 构造函数。对于 postgres:

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 数据库网址

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(请参阅此问题的版本历史以获取该答案)。


首先阅读通常是有意义的,然后根据您的要求执行转换(因为这些在 pandas 中通常是高效且可读的)。在您的示例中,您可以pivot得到以下结果:

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

注意:您可能会错过reset_indexindex_colread_frame.

于 2013-06-17T20:26:51.660 回答
12

这通过远程 postgresql 与 postgres 和 pandas 连接

# CONNECT TO POSTGRES USING PANDAS
import psycopg2 as pg
import pandas.io.sql as psql

这用于建立与 postgres db 的连接

connection = pg.connect("host=192.168.0.1 dbname=db user=postgres")

这用于从 postgres db 读取表

dataframe = psql.read_sql("SELECT * FROM DB.Table", connection)
于 2018-01-09T09:19:12.510 回答
3
import pandas as pd
import pandas.io.sql as sqlio
import psycopg2

conn = psycopg2.connect("host='{}' port={} dbname='{}' user={} password={}".format(host, port, dbname, username, pwd))
sql = "select count(*) from table;"
dat = sqlio.read_sql_query(sql, conn)
conn = None

import pandas as pd

conn = psycopg2.connect("host='{}' port={} dbname='{}' user={} password={}".format(host, port, dbname, username, pwd))
sql = "select count(*) from table;"
dat = pd.read_sql_query(sql, conn)
conn = None
于 2020-06-16T14:52:08.993 回答