Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何将数据帧中的列绘制为子图_Python 3.x_Pandas_Date_Matplotlib - Fatal编程技术网

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
      是一个用于
      matplotlib
      的高级API,使绘图变得更加容易
  • 如果数据框包含许多库存,但只打印少数库存,则可以使用
将熊猫作为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
    • y1-y4
      是数据帧,但传递给y轴的plot方法,这会导致
      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()聚合函数