Pandas DataFrame Matplotlib BoxPlot 框

brn*_*792 5 matplotlib python-2.7 yahoo-finance pandas

如何制作箱线图,其中数据框对象中的每一行都是图中的一个框?

我有一些股票数据想要用箱线图绘制。我的数据来自雅虎财经,包括每个交易日的开盘价、最高价、最低价、收盘价、调整收盘价和成交量数据。我想绘制一个箱线图,其中每个箱体都是 1 天的 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()
Run Code Online (Sandbox Code Playgroud)

但是,当我将此数据框绘制为箱线图时,我只得到一个包含整个交易量列的开盘价、最高价、最低价和收盘价的方框。

同样,我尝试重新采样调整后的每日收盘价格数据以获得每周 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
Run Code Online (Sandbox Code Playgroud)

这将生成一个包含 4 个框的箱线图。每个框是每列的范围,而不是行。例如,第一个框“开盘”显示整个“开盘”列的开盘价、收盘价、最高价和最低价。

但我真正想要的是每个“日期”(我的数据帧的索引或行)有 1 个框。因此第一个框将显示第一行的 OHLC,“2010-01-10”。第二个框将是第二行(“2010-01-17”)。

但我真正想要的是原始每日数据(SP DataFrame)中的每一行都是它自己的 OHLC 框。本质上我想要每日烛台,生成为箱线图()。

                 Open        High        Low         Close     
    Date                        
    2010-01-04   1116.56     1133.87     1116.56     1132.99
Run Code Online (Sandbox Code Playgroud)

如何使用 Pandas DataFrame 和 Matplotlib boxplot() 执行此操作?我只想要一个基本的箱线图,其中 DataFrame 中的每一行都是图中的 OHLC 箱。此时没什么特别的。谢谢!

Pau*_*l H 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()
Run Code Online (Sandbox Code Playgroud)