下面是一个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,因为它允许轻松地按任意时间段分组。
1条答案
按热度按时间hzbexzde1#
在第二个例子中(使用
pd.Grouper
),bin的宽度对应于 day,因此是瘦bin。一个简单的解决方法是将bin的宽度设置为27(避免2月重叠):字符串
输出量:
的数据