我和创建一个热图,它将跨越x轴和y轴的月份。在热图中将返回%。这就是我所追求的。
所以我有一些数据,我把它们变成了pct_change()系列。
import pandas_datareader.data as web
import pandas as pd
from datetime import datetime as dt
import numpy as np
import seaborn as sns
start = dt(year = 2000, month = 1, day = 1)
df = web.DataReader('GDP', 'fred', start = '2000')
df.pct_change()
df.tail()
所以我们正在与之合作。重要的是要注意索引是一个Datetime对象。
GDP
DATE
2016-10-01 18905.545
2017-01-01 19057.705
2017-04-01 19250.009
2017-07-01 19500.602
2017-10-01 19736.491
我想做这样的事情,但我不知道如何用日期时间索引
来实现它gdp = df.pivot(df.index.month, df.index.year, "GDP")
ax = sns.heatmap(gdp)
哪个(预期)不起作用......
KeyError: "Int64Index([ 1, 4, 7, 10, 1, 4, 7, 10, 1, 4, 7, 10, 1, 4, 7, 10, 1,\n 4, 7, 10, 1, 4, 7, 10, 1, 4, 7, 10, 1, 4, 7, 10, 1, 4,\n 7, 10, 1, 4, 7, 10, 1, 4, 7, 10, 1, 4, 7, 10, 1, 4, 7,\n 10, 1, 4, 7, 10, 1, 4, 7, 10, 1, 4, 7, 10, 1, 4, 7, 10,\n 1, 4, 7, 10],\n dtype='int64', name='DATE') not in index"
答案 0 :(得分:1)
它无效,因为您在pivot
函数中提取了月份和年份,并且这些信息不在您指定的原始df
中。
您可以事先指定它们:
df["Year"] = df.DATE.apply(lambda x: x.year)
df["Month"] = df.DATE.apply(lambda x: x.strftime("%B"))
df.pivot_table(index="Month",columns="Year",values="GDP", aggfunc="sum").fillna(0)
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
pt = pt.reindex_axis(months)
sns.heatmap(pt, annot=True)
我正在重新索引行,因为在调用pivot_table
时,它会按升序对列或行进行排序,这不是通常对月份名称进行排序的方式。