matplotlib 使用Grouper按不同的时间范围和图表对框架进行分组

eoxn13cs  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(93)

下面是一个Python程序,它执行以下操作:

  • 对treasury.gov进行API调用以检索数据
  • 将数据存储在Pandas框架中
import requests
import pandas as pd
import matplotlib.pyplot as plt

# ----------------------------------------------------------------------

date = '1900-01-01'

transaction_type = 'Withdrawals'
transaction_catg = 'Interest on Treasury Securities'

page_size = 10000

url = 'https://api.fiscaldata.treasury.gov/services/api/fiscal_service/v1/accounting/dts/deposits_withdrawals_operating_cash'

url_params = f'?filter=record_date:gt:{date},transaction_type:eq:{transaction_type},transaction_catg:eq:{transaction_catg}&page[size]={page_size}'

response = requests.get(url + url_params)

result_json = response.json()

# ----------------------------------------------------------------------

df = pd.DataFrame(result_json['data'])

df['record_date'] = pd.to_datetime(df.record_date)

df['transaction_today_amt'] = pd.to_numeric(df['transaction_today_amt']) 

# ----------------------------------------------------------------------
plt.ion()
# ----------------------------------------------------------------------

字符串

使用strftime分组

让我们使用strftime按月份分组。

items = df.groupby(df['record_date'].dt.strftime('%Y-%m'))['transaction_today_amt'].sum()

plt.figure()
plt.bar(x=items.index, height=items.values)
plt.xticks(rotation=90)


的数据
该图看起来很不错。然而,也有一些缺点:

  • X轴标签起皱
  • 不使用Grouper

使用Grouper分组

items = df.groupby(pd.Grouper(key='record_date', freq='M'))['transaction_today_amt'].sum()

plt.figure()
plt.bar(x=items.index, height=items.values)
plt.xticks(rotation=90)



现在x轴标签看起来很好,我们使用Grouper。但是,列是细线。

使用Grouper分组,使用pandas plot方法。

df.groupby(pd.Grouper(key='record_date', freq='M'))['transaction_today_amt'].sum().plot(kind='bar')



现在我们使用Grouper,列线很粗,但是x轴标签包括时间,所以很粗。

提问

有什么好方法可以设置这个图表,使Grouper在使用时没有上述方法中显示的缺点?
我喜欢使用Grouper,因为它允许轻松地按任意时间段分组。

hzbexzde

hzbexzde1#

在第二个例子中(使用pd.Grouper),bin的宽度对应于 day,因此是瘦bin。一个简单的解决方法是将bin的宽度设置为27(避免2月重叠):

items = df.groupby(pd.Grouper(key='record_date', freq='M'))['transaction_today_amt'].sum()

plt.figure()
plt.bar(x=items.index, height=items.values, width=27)
plt.xticks(rotation=90)
plt.show()

字符串
输出量:


的数据

相关问题