将 sql 选择解压缩到 pandas 数据框中
Posted
技术标签:
【中文标题】将 sql 选择解压缩到 pandas 数据框中【英文标题】:unpacking a sql select into a pandas dataframe 【发布时间】:2013-06-13 21:53:56 【问题描述】:假设我有一个大致像这样的选择:
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】:您可以将光标对象传递给 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']
【讨论】:
你试过read_frame
和psycopg
吗?开发团队将非常感谢任何有关这是否有效的反馈。谢谢!
# 提取列名使得columns=columns: columns = [elt[0] for elt in cur.description]
这是我说的我明确没有寻找的东西,这里没有支点。
我用这种方式动态检索列:df = pd.DataFrame(cur.fetchall(), columns=[desc[0] for desc in cur.description])
感谢您的回答。有没有比手动输入更好的方法来填写列名?【参考方案2】:
更新:最近的熊猫有以下功能: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:tiger@localhost/foo')
见sqlalchemy database urls。
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(有关该答案,请参阅此问题的 version history)。
首先阅读通常是有意义的,然后然后根据您的要求执行转换(因为这些通常在 pandas 中是高效且可读的)。在您的示例中,您可以pivot
结果:
df.reset_index().pivot('date', 'instrument', 'price')
注意:您可能会错过在 read_frame
中未指定 index_col
的 reset_index
。
【讨论】:
哦,就像快捷方式一样。不知道这件事。你知道这是否适用于 psycopg 连接器? 我认为应该可以,您只需使用它设置连接 (con
),如果可以,请告诉我! :)
+1 想知道这是否适合您。 read_frame
/write_frame
的开发人员都不是 postgresql 的普通用户,所以我们没有介绍它。如果遇到问题,请file an issue。
这是否已被 pandas.io.sql.read_sql 取代?尝试在 pandas >= 0.18 中导入 read_frame 时出现 importError,而当前文档提到 read_sql。
@emunsing 绝对是。还有read_sql_table
,应该强烈推荐。【参考方案3】:
这通过远程 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)
【讨论】:
感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并且会使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。 这就是我在问题中明确表示不想做的事情。 是的....当然..因为我是python的初学者..会在那里做更多的解释...【参考方案4】: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
【讨论】:
以上是关于将 sql 选择解压缩到 pandas 数据框中的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中压缩 JSON 并在 Javascript 中解压缩 [关闭]
如果使用 jar,则从 jar 中解压缩文件,然后将提取的文件复制到目录