Python 3.x 如何将数据帧中的列绘制为子图
我做错了什么?我想从Python 3.x 如何将数据帧中的列绘制为子图,python-3.x,pandas,date,matplotlib,Python 3.x,Pandas,Date,Matplotlib,我做错了什么?我想从df创建新的数据框,并在每个新创建的数据框(Emins、FTSE、Stoxx和Nikkei)的折线图中使用日期作为x轴 我从data.xlsx创建了一个名为df的数据帧,它如下所示: Dates ES1 Z 1 VG1 NK1 0 2005-01-04 -0.0126 0.0077 -0.0030 0.0052 1 2005-01-05 -0.0065 -0.0057 0.0007 -0.0095 2 20
df
创建新的数据框,并在每个新创建的数据框(Emins、FTSE、Stoxx和Nikkei)的折线图中使用日期作为x轴
我从data.xlsx创建了一个名为df
的数据帧,它如下所示:
Dates ES1 Z 1 VG1 NK1
0 2005-01-04 -0.0126 0.0077 -0.0030 0.0052
1 2005-01-05 -0.0065 -0.0057 0.0007 -0.0095
2 2005-01-06 0.0042 0.0017 0.0051 0.0044
3 2005-01-07 -0.0017 0.0061 0.0010 -0.0009
4 2005-01-11 -0.0065 -0.0040 -0.0147 0.0070
3670 2020-09-16 -0.0046 -0.0065 -0.0003 -0.0009
3671 2020-09-17 -0.0083 -0.0034 -0.0039 -0.0086
3672 2020-09-18 -0.0024 -0.0009 -0.0009 0.0052
3673 2020-09-23 -0.0206 0.0102 0.0022 -0.0013
3674 2020-09-24 0.0021 -0.0136 -0.0073 -0.0116
从df
我创建了4个新的数据帧,分别称为Eminis、FTSE、Stoxx和Nikkei
谢谢你的帮助
将numpy导入为np
将matplotlib.pyplot作为plt导入
plt.style.use('classic'))
df=pd.read\u excel('data.xlsx')
df=df.rename(列={'Dates':'Date','ES1':'Eminis','z1':'FTSE','VG1':'Stoxx','NK1':'Nikkei','TY1':'Notes','g1':'Gilts','RX1':'Bunds','JB1':'JGBS','CL1':'Oil','HG1':'cu','s1'S 1':'GC1':'Gold','WILLTIPS':'TIPS'))
标题=df.columns
Eminis=df[['Date','Eminis']]
FTSE=df[['日期','FTSE']]
Stoxx=df[['Date','Stoxx']]
日经指数=df[['日期','日经']]
#通过plt.子图(行、列)创建多个图
图,轴=plt.子批次(2,2,图尺寸=(20,15))
x=日期
y1=埃米尼斯
y2=注释
y3=Stoxx
y4=日经指数
#每个子地块上有一个绘图
轴[0][0]。直线(x,y1)
轴[0][1]。直线(x,y2)
轴[1][0]。直线(x,y3)
轴[1][1]。直线(x,y4)
plt.图例()
plt.show()
- 我认为更简洁的选择是不制作许多数据帧,这会产生不必要的工作和复杂性
- Plotting data是关于为plot API塑造数据框的
- 在这种情况下,更好的选择是使用将数据帧从宽格式转换为长(整洁)格式。
- 这会将所有标签放置在一列中,并将值放置在另一列中
- 使用,它可以从长格式的数据帧创建。
是一个用于seaborn
的高级API,使绘图变得更加容易matplotlib
- 如果数据框包含许多库存,但只打印少数库存,则可以使用
将熊猫作为pd导入
导入seaborn作为sns
将matplotlib.pyplot作为plt导入
#从excel导入数据,或设置测试数据框
数据={'Dates':['2005-01-04','2005-01-05','2005-01-06','2005-01-07','2005-01-11','2020-09-16','2020-09-17','2020-09-18','2020-09-23','2020-09-24'],
‘ES1’:[-0.0126,-0.0065,0.0042,-0.0017,-0.0065,-0.0046,-0.0083,-0.0024,-0.0206,0.0021],
‘Z 1’:[0.0077、-0.0057、0.0017、0.0061、-0.004、-0.0065、-0.0034、-0.0009、0.0102、-0.0136],
‘VG1’:[-0.003,0.0007,0.0051,0.001,-0.0147,-0.0003,-0.0039,-0.0009,0.0022,-0.0073],
‘NK1’:[0.0052、-0.0095、0.0044、-0.0009、0.007、-0.0009、-0.0086、0.0052、-0.0013、-0.0116]]
df=pd.DataFrame(数据)
#重命名列
df=df.rename(列={'Dates':'Date','ES1':'Eminis','z1':'FTSE','VG1':'Stoxx','NK1':'Nikkei'})
#将Date设置为datetime
df.Date=pd.to_datetime(df.Date)
#将日期设置为索引
df.set_索引('Date',inplace=True)
#堆叠数据帧
dfs=df.stack().reset_index().rename(列={'level_1':'Stock',0:'val'})
#若要仅从库存中选择值的子集,若要打印,请使用布尔索引进行选择
df_select=dfs[dfs.Stock.isin(['Eminis','FTSE','Stoxx','Nikkei'])]`
#df_select.head()
日期股票价值
0 2005-01-04艾米尼斯-0.0126
1 2005-01-04富时0.0077
2 2005-01-04斯托克-0.0030
3 2005-01-04日经0.0052
4 2005-01-05艾米尼斯-0.0065
#密谋
sns.relplot(数据=df_select,x='Date',y='val',col='Stock',col_wrap=2,kind='line')
我做错了什么?
- 当前的实现效率低下,有许多不正确的方法调用和未定义的变量。
- 未为
x=Date
:y2=Notes
未定义Notes
不是.line
方法,导致plt
;它应该是属性错误
plt.plot
是数据帧,但传递给y轴的plot方法,这会导致y1-y4
;一列应作为TypeError:unhabable type:'numpy.ndarray'
传递y
不是一种方法;它是.legends
。图例
- 如果需要,必须为每个子批次显示图例
- 未为
Eminis=df[['Date','Eminis']]
FTSE=df[['日期','FTSE']]
Stoxx=df[['Date','Stoxx']]
日经指数=df[['日期','日经']]
#通过plt.子图(行、列)创建多个图
图,轴=plt.子批次(2,2,图尺寸=(20,15))
x=df.日期
y1=埃米尼斯。埃米尼斯
y2=FTSE.FTSE
y3=Stoxx.Stoxx
y4=日经指数.日经指数
#每个子地块上有一个绘图
轴[0][0]。绘图(x,y1,标签='Eminis')
轴[0][0]。图例()
轴[0][1]。绘图(x,y2,label='FTSE')
轴[0][1]。图例()
轴[1][0]。绘图(x,y3,label='Stoxx')
轴[1][0]。图例()
轴[1][1]。绘图(x,y4,label='Nikkei')
轴[1][1]。图例()
plt.show()
优雅的解决方案是:
- 将数据框中的Dates列设置为索引
- 创建具有所需子地块数量的地物 (在您的案例4中),调用plt.subplot
- 从数据框中绘制绘图,传递:
- ax-子批次的ax结果(此处为轴的数组 对象,而不是单个轴)
- Subplot=True-以单独的方式绘制每列 子地块
fig, a = plt.subplots(2, 2, figsize=(12, 6), tight_layout=True)
df.plot(ax=a, subplots=True, rot=60);
为了测试上述代码,我创建了以下数据帧:
np.random.seed(1)
ind = pd.date_range('2005-01-01', '2006-12-31', freq='7D')
df = pd.DataFrame(np.random.rand(ind.size, 4),
index=ind, columns=['ES1', 'Z 1', 'VG1', 'NK1'])
并得到以下图片:
由于我的测试数据是随机的,我假设“7天”的频率为
图片不要太“凌乱”。
在真实数据的情况下,考虑例如重采样。
e、 g.还有“7D”频率和mean()聚合函数