Распаковка sql-select в pandas dataframe
Предположим, что у меня есть выбор примерно так:
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)
..., что легко; -)
Ответы
Ответ 1
Обновление: последние pandas имеют следующие функции: read_sql_table
и read_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:[email protected]/foo')
См. URL-адреса базы данных sqlalchemy.
table_name = 'my_prices'
df = pd.read_sql_table(table_name, engine)
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_index
, который вы не указываете index_col
в read_frame
.
Ответ 2
Вы можете передать объект курсора в конструктор 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']
Ответ 3
Это соединение с postgres и pandas с удаленным postgresql
# 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)