Pandas数据框Matplotlib箱线图箱子

5
如何制作箱线图,使得数据框对象中的每一行都是图中的一个盒子?
我有一些股票数据想要用箱线图绘制。我的数据来自雅虎财经,包括每个交易日的开盘价、最高价、最低价、收盘价、调整后收盘价和成交量数据。我希望绘制一个箱线图,其中每个盒子代表一天的OHLC价格走势。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas.io.data import DataReader

# get daily stock price data from yahoo finance for S&P500
SP = DataReader("^GSPC", "yahoo") 

SP.head()
             Open        High        Low         Close       Volume          Adj Close
Date                        
2010-01-04   1116.56     1133.87     1116.56     1132.99     3991400000      1132.99
2010-01-05   1132.66     1136.63     1129.66     1136.52     2491020000      1136.52
2010-01-06   1135.71     1139.19     1133.95     1137.14     4972660000      1137.14
2010-01-07   1136.27     1142.46     1131.32     1141.69     5270680000      1141.69
2010-01-08   1140.52     1145.39     1136.22     1144.98     4389590000      1144.98

plt.figure()
bp = SP.boxplot()

但是当我把这个数据框绘制成箱线图时,我只得到一个箱子,其中包含整个Volume列的Open、High、Low和Close值。

同样地,我试图对我的已调整收盘价每日价格数据进行重新采样,以获取每周的OHLC:

close = SP['Adj Close']
wk = close.resample('W', how='ohlc')
wk.head()

             open        high        low         close
Date                
2010-01-10   1132.99     1144.98     1132.99     1144.98
2010-01-17   1146.98     1148.46     1136.03     1136.03
2010-01-24   1150.23     1150.23     1091.76     1091.76
2010-01-31   1096.78     1097.50     1073.87     1073.87
2010-02-07   1089.19     1103.32     1063.11     1066.19

这将产生一个有4个方框的箱线图。每个方框都是每一列的范围,而不是行。例如,第一个方框“open”显示了整个“open”列的开盘价、收盘价、最高价和最低价。
但实际上,我想要的是每个“日期”(我的DataFrame的索引或行)有1个方框。因此,第一个方框将显示第一行“2010-01-10”的OHLC。第二个方框将是第二行(“2010-01-17”)。
不过,我真正想要的是原始每日数据(SP DataFrame)中的每一行都是其自己的OHLC Box。本质上,我想要每日蜡烛图,作为boxplot()生成。
                 Open        High        Low         Close     
    Date                        
    2010-01-04   1116.56     1133.87     1116.56     1132.99

我该如何使用Pandas DataFrame和Matplotlib boxplot()进行此操作?我只需要一个基本的箱线图,其中DataFrame中的每一行都是绘图中的OHLC框。此时没有什么花哨的东西。谢谢!

我认为你想要的是这样的东西:https://github.com/pydata/pandas/issues/783它还没有被实现,但那里可能有一些建议可以帮助你。 - TomAugspurger
@TomAugspurger 还有这个:https://github.com/matplotlib/matplotlib/pull/2643 - Paul H
1
哦,天啊,有matplotlib.finance.candlestick。请参考http://matplotlib.org/examples/pylab_examples/finance_demo.html?highlight=candlestick。 - Paul H
我只想绘制一个箱线图,其中每个箱子都是我的DataFrame的一行。我的第一段代码正在绘制一个箱线图,其中每个箱子都是我的DataFrame的一列。我希望每一行都成为一个箱子。明白吗?我认为这应该很容易,只是我无法弄清楚如何做。我需要转置或取消堆叠某些内容吗? - brno792
1
几点需要注意:1)盒形图和蜡烛图,尽管它们外观相似,但在概念上是非常不同的;2)你实际上是在尝试制作一个蜡烛图;3)即使你使用 SP.T 转换了数据,boxplot 方法也无法产生你想要的结果;4)你面临的真正挑战是如何将你的数据框转换为 matplotlib.finance.candlestick 可以使用的格式。 - Paul H
1个回答

5

正如我在评论中所说,你实际上不需要箱线图。相反,你应该制作一个蜡烛图表。下面是一些代码,可以帮助你入门。

import numpy as np
import pandas
import matplotlib.pyplot as plt
from matplotlib.finance import candlestick, candlestick2
import matplotlib.dates as mdates
from pandas.io.data import DataReader

# get daily stock price data from yahoo finance for S&P500
SP = DataReader("^GSPC", "yahoo")
SP.reset_index(inplace=True)
print(SP.columns)
SP['Date2'] = SP['Date'].apply(lambda date: mdates.date2num(date.to_pydatetime()))
fig, ax = plt.subplots()
csticks = candlestick(ax, SP[['Date2', 'Open', 'Close', 'High', 'Low']].values)
plt.show()

谢谢Paul H.的帮助。从Yahoo Finance DataReader获取的每日数据已经包含了每天的OHLC值。我不想重新采样以获取每月或每周的OHLC数据。我该如何使用SP=DataReader("^GSPC", "yahoo")来绘制每日蜡烛图?谢谢。 - brno792
@brno792 当然可以...看到修改(这是相同的代码,只是使用不同的数据框) - Paul H
谢谢Paul H. 但是在candlestick()这一行上我遇到了一个错误:KeyError:“['open' 'close' 'high' 'low']不在索引中”。 - brno792
@brno792 只需将它们与您的列名称匹配即可。 - Paul H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接