Распаковка sql-select в pandas dataframe - программирование
Подтвердить что ты не робот

Распаковка 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)

..., что легко; -)

4b9b3361

Ответ 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.

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_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)