在我的代码我用的是DictCursor从psycopg2.extras这样的
dict_cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
Run Code Online (Sandbox Code Playgroud)
但是,当我加载游标时,突然间我收到以下错误:
AttributeError: 'module' object has no attribute 'extras'
Run Code Online (Sandbox Code Playgroud)
也许在我的装置中有些东西,但我不知道从哪里开始寻找.我用pip做了一些更新,但据我所知,没有依赖关系psycopg2.
我正在尝试用seaborn 进行核密度估计(KDE)图并找到中位数.代码看起来像这样:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
sns.set_palette("hls", 1)
data = np.random.randn(30)
sns.kdeplot(data, shade=True)
# x_median, y_median = magic_function()
# plt.vlines(x_median, 0, y_median)
plt.show()
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我需要magic_function()从中获取中值x和y值kdeplot.然后我想用例如vlines.但是,我无法弄清楚如何做到这一点.结果应该看起来像这样(显然黑色中间条在这里是错误的):

我想我的问题与seaborn并不严格相关,也适用于其他类型的matplotlib图.任何想法都非常感谢.
下面的代码给了我一个非常好的小提琴图(和内部的boxplot).
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
foo = np.random.rand(100)
sns.violinplot(foo)
plt.boxplot(foo)
plt.show()
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是,当我查看时foo,变量不包含任何负值.该seaborn地块似乎这里误导.正常的matplotlib箱图提供了更接近我期望的东西.
如何制作更合适的小提琴曲线(不显示假阴性值)?
如seaborn API中所述,以下代码将生成线性回归图.
import numpy as np, pandas as pd; np.random.seed(0)
import seaborn as sns; sns.set(style="white", color_codes=True)
tips = sns.load_dataset("tips")
g = sns.jointplot(x="total_bill", y="tip", data=tips, kind='reg')
sns.plt.show()
Run Code Online (Sandbox Code Playgroud)

但是,由于有很多数据点,回归线不再可见.我怎样才能改变它的颜色?我找不到内置的seaborn命令.
如果线在背景中(即在点后面),我还想问如何将它带到前面.
如 PostgreSQL手册中所述,可以在单个INSERT语句中添加多行:
INSERT INTO films (code, title, did, date_prod, kind) VALUES
('6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
('6120', 'The Dinner Game', 140, DEFAULT, 'Comedy');
Run Code Online (Sandbox Code Playgroud)
SELECT像这样的嵌套查询也有效:
INSERT INTO films (code, title, did, date_prod, kind)
SELECT table.code, 'Tampopo', 110, '1985-02-10', 'Comedy'
FROM other_table AS table2;
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法想出一种同时进行的方法:
INSERT INTO films (code, title, did, date_prod, kind)
SELECT
(table.code + 100, 'abc', NULL, t2.date_prod, t2.kind),
(table.code + 200, 'xyz', NULL, t2.date_prod, t2.kind)
FROM other_table AS t2;
Run Code Online (Sandbox Code Playgroud)
如果other_table只包含(61717 | …
我想将psycopg2DictRow查询转换为pandas数据帧,但是pandas一直在抱怨:
curs = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
curs.execute("SELECT * FROM mytable")
data = curs.fetchall()
print type(data)
print pd.DataFrame(list(data))
Run Code Online (Sandbox Code Playgroud)
但是,我总是得到一个错误,虽然我特意通过了list???
<type 'list'>
TypeError: Expected list, got DictRow
Run Code Online (Sandbox Code Playgroud)
如果我这样做的结果是一样的pd.DataFrame(data)可以有人请帮我做这个工作吗?
如果数据帧的列名称有效(即提取DictRow并将它们传递给数据帧)也会很好.
更新:
由于我需要处理数据,我想按原样使用psycopg2查询中的数据而不是pandas方法,例如read_sql_query.
我使用Postgresql 9.4作为模型数据库.我的表看起来有点像这样:
CREATE TABLE table1 (
sid INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('table1_sid_seq'::regclass),
col1 INT,
col2 INT,
col3 JSONB);
Run Code Online (Sandbox Code Playgroud)
我的Python 2.7工作流通常如下所示:
curs.execute("SELECT sid, col1, col2 FROM table1")
data = curs.fetchall()
putback = []
for i in data:
result = do_something(i[1], i[2])
putback.append((sid, result))
del data
curs.execute("UPDATE table1
SET col3 = p.result
FROM unnest(%s) p(sid INT, result JSONB)
WHERE sid = p.sid", (putback,))
Run Code Online (Sandbox Code Playgroud)
这通常可以很好地有效地工作.但是,对于大型查询,Postgresql内存使用有时会在UPDATE命令期间通过屋顶(> 50GB),我相信它正被OS X杀死,因为我得到了WARNING: terminating connection because of crash of another server process.我的Macbook Pro有16GB的RAM,有问题的查询有11M行,每行大约有100个字符要回写. …
为什么“请求宽恕比获得许可更容易”( EAFP ) 被认为是 Python 中的好习惯?作为一名编程新手,我的印象是,try...except与使用其他检查相比,使用许多例程会导致代码臃肿且可读性较差。
EAFP 方法的优势是什么?
NB:我知道这里也有类似的问题,但他们大多是指一些具体的例子,而我更感兴趣的是原理背后的哲学。
我有一张大桌子,上面有大约。PostgreSQL 9.4 数据库中有 1000 万行。它看起来有点像这样:
\n\ngid | number1 | random |\xc2\xa0result |\xc2\xa0...\n 1 | 2 | NULL | NULL |\xc2\xa0...\n 2 | 15 | NULL | NULL | ...\n... | ... | ... | ... | ...\nRun Code Online (Sandbox Code Playgroud)\n\n现在我想更新列random和result作为 的函数number1。这意味着至少random需要在数据库外部的脚本中生成。由于我的 RAM 有限,我想知道如何使用psycopg2. 我相信我面临两个问题:如何在不使用太多 RAM 的情况下获取数据以及如何将其放回原处。简单方法看起来像这样:
curs.execute("""SELECT gid1, number1 FROM my_table;""")\ndata = curs.fetchall()\n\nresult = []\nfor i in data:\n result.append((create_random(i[1]), i[0]))\ncurs.executemany("""UPDATE my_table\n SET random = %s\n WHERE gid = %s;""",\n …Run Code Online (Sandbox Code Playgroud) 有可能做这样的事情:
r = {range(0, 100): 'foo', range(100, 200): 'bar'}
print r[42]
> 'foo'
Run Code Online (Sandbox Code Playgroud)
所以我想使用数值范围作为字典索引的一部分.为了使事情变得更复杂,我还想使用多索引('a', range(0,100)).所以这个概念应该理想地扩展到那个.有什么建议?
这里也提出了类似的问题,但我对全面实施感兴趣,而不是该问题的不同方法.
python ×8
psycopg2 ×4
postgresql ×3
seaborn ×3
matplotlib ×2
plot ×2
coding-style ×1
dictionary ×1
importerror ×1
memory ×1
pandas ×1
performance ×1
sql ×1
sql-update ×1
statistics ×1