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 箱。此时没什么特别的。谢谢!
正如我在评论中所说,你并不真正想要箱线图。相反,您应该制作烛台图。这里有一些代码可以帮助您入门。
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)
| 归档时间: |
|
| 查看次数: |
4824 次 |
| 最近记录: |