我有一个sql表,如下所示:
+----+------------+--------+------------+
| id | department | amount | date |
+----+------------+--------+------------+
| 1 | d1 | 20 | 2018-06-10 |
| 2 | d1 | 12 | 2018-06-10 |
| 2 | d1 | 10 | 2018-06-11 |
| 3 | d2 | 31 | 2018-06-10 |
| 4 | d2 | 42 | 2018-06-10 |
| 5 | d3 | 82 | 2018-06-11 |
| 6 | d3 | 11 | 2018-06-11 |
| 7 | d3 | 10 | 2018-06-14 |
+----+------------+--------+------------+
我使用Pandas的read_sql
方法阅读它,
df = pd.read_sql("select * table my_table", ...)
我想绘制数据的时间序列,因为x轴是一个月的天,而y轴是部门的计数。所以,我想我必须按月的天将它们分组,例如
gdf = df.groupby(['department', pd.Grouper(key='date', freq='d')])['amount'].sum()
和gdf看起来像:
department date
d1 2018-06-10 32
2018-06-11 10
d2 2018-06-10 73
d3 2018-06-11 93
2018-06-14 10
但是,我不知道如何使用gdf
。我想用seaborn或mathplotlib绘制它。
我还想绘制按月份和部门分组的金额总和。
注意:通常,我会编辑sql语句以包含分组数据,但就我而言,我不允许这样做。我必须使用熊猫来做到这一点。
答案 0 :(得分:2)
对于每个唯一部门,将“金额”相加一天,然后将其绘制在同一图上。
首先,在基于分组的分组之前,from sqlalchemy import create_engine
from pandas.io import sql
engine =create_engine('postgresql+psycopg2cffi://...')
sql.execute("""create view test as select name,
regexp_replace(name, '\\s\\(([0-9]+)\\)$', '') as name2
from table""", engine)
必须为date
类型。
datetime
,然后按如下所示绘制时间序列:
df['date'] = pd.to_datetime(df['date'])
答案 1 :(得分:1)
DEEPAK SURANA的答案对于制图是正确的。但是,应该说,如果您的df['date']
列具有str
类型的数据,则此操作将无效。我添加了用于在下面创建DF并将df['date']
列转换为datetime
类型的示例代码。
import pandas as pd
data = [(1, 'd1', 20, '2018-06-10'),
(2, 'd1', 12, '2018-06-10'),
(2, 'd1', 10, '2018-06-11'),
(3, 'd2', 31, '2018-06-10'),
(4, 'd2', 42, '2018-06-10'),
(5, 'd3', 82, '2018-06-11'),
(6, 'd3', 11, '2018-06-11'),
(7, 'd3', 10, '2018-06-14')]
labels = ['id', 'department', 'amount', 'date']
df = pd.DataFrame.from_records(data, columns=labels)
df['date'] = pd.to_datetime(df['date'])
DEEPAK SURANA的图形代码:
import matplotlib.pyplot as plt import matplotlib.dates as mdates fig, ax = plt.subplots(figsize=(10,6)) for d in df['department'].unique(): gdf = df[df['department']==d].groupby(pd.Grouper(key='date', freq='d')).sum() ax.plot(gdf.index, gdf['amount'], label=d) ax.get_xaxis().set_major_locator(mdates.DayLocator()) ax.get_xaxis().set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) plt.xticks(rotation=30) fig.tight_layout() plt.legend(bbox_to_anchor=(1, 0), loc="upper right", box_transform=fig.transFigure, ncol=4, columnspacing=0.5) plt.show()