2017-07-17 71 views
1

我正在制作一个从postgresql数据库中提取数据的Flask web应用程序。我使用psycopg2来管理与数据库的连接。带matplotlib和psycopg2的动态图形

如果我想有一个图形用户活动的(#用户的活动)一段时间(例如,最近7天),我怎么能与matplotlib代表此动态?

我psycopg2查询来获取内过去7天的用户数是这样的(编者):

timeInterval = 7; 

def userCount(conn, cur): 
    cur.execute("""SELECT count(DISTINCT(username)) from user_table WHERE tstampz > 
       (current_timestamp - make_interval(days := %s))""", [timeInterval] 
    return cur.fetchone()[0] 

我的问题是我怎么能得到这个查询我matplotlib图的结果呢?

回答

0

首先,您需要一个显示时间戳的查询,否则您无法绘制时间序列图。我也不知道你在做什么“make_interval()”函数,这是不需要的。所以,你的查询应为:

cur.execute("""SELECT tstampz, count(DISTINCT(username)) 
       from user_table 
       WHERE tstampz > 
       (current_timestamp - INTERVAL '7 days') 
       GROUP BY tstampz ORDER BY tstampz;""") 

(顺便说一句,感谢您使用与时区的时间戳)

Matplotlib要你重组数据作为一个数组,所以你通过它要循环和建立阵列:

tses = [] 
ucounts = [] 
for rec in cur: 
    tses.append(rec[0]) 
    ucounts.append(rec[1]) 

然后,您可以将这些分配给图。请注意,这种结构假定你的时间顺序没有差距;如果你这样做,你需要采取更复杂的方法。

ax.plot(tses, ucounts, color='blue', label='User Count') 

你可以找到我的matplotlib和Postgres教程由downloading the Jupiter notebook更完整的例子。

+0

哎呀,我改变了我的代码为了这个问题的目的,并没有意识到它没有任何意义。修复它在原来的问题。感谢您的评论,我会尝试一下! – Sarah

+0

嘿,如果我的回答很有帮助,请投票给我? – FuzzyChef