2013-12-13 2 views
4

Как сделать коробку, где каждая строка в моем объекте dataframe является полем на графике?Pandas DataFrame Matplotlib BoxPlot Boxes

У меня есть данные о запасах, которые я хочу построить с графиком. Мои данные получены из финансов yahoo и включают в себя данные Open, High, Low, Close, Adjusted Close и Volume за каждый торговый день. Я хочу построить участок коробки, где каждый ящик составляет 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() 

Но когда я сюжет этот кадр данных как boxplot, я получаю только одну коробку с 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 

Это дает Box Участок с 4 коробки. Каждый ящик - это диапазон каждого столбца, а не строка. Так, например, первая коробка, «открытая», показывает Open, Close, High и Low всей «открытой» колонки.

Но то, что я на самом деле хочу, - это 1 поле для каждой «даты» (индекс или строка моего DataFrame). Таким образом, первая коробка покажет OHLC первой строки, «2010-01-10». Второй ящик будет второй строкой ('2010-01-17').

То, что я действительно хочу, это каждая строка в моих первоначальных ежедневных данных (SP DataFrame) - это собственный OHLC Box. По сути, мне нужны ежедневные подсвечники, созданные как boxplot().

    Open  High  Low   Close  
    Date       
    2010-01-04 1116.56  1133.87  1116.56  1132.99 

Как это сделать, используя Boxplot() Pandas DataFrame и Matplotlib boxplot()? Мне просто нужен базовый график, где каждая строка из DataFrame является полем OHLC на графике. Ничего необычного в этот момент. Благодаря!

+0

Я думаю, что вы хотите что-то вроде этого: https://github.com/pydata/pandas/issues/783 Это еще не реализован, но могут быть некоторые предложения там, которые помогут вам. – TomAugspurger

+0

@TomAugspurger также это: https://github.com/matplotlib/matplotlib/pull/2643 –

+1

О, geez, есть 'matplotlib.finance.candlestick' http://matplotlib.org/examples/pylab_examples/finance_demo.html?highlight = candlestick –

ответ

4

Как я уже сказал в комментариях, вам не нужны коробки. Вместо этого вы должны сделать подсвечник. Вот вам какой-то код, чтобы вы начали.

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() 
+0

Спасибо, Пол Х. Это помогает. Таким образом, ежедневные данные от yahoo finance DataReader уже имеют значения OHLC для каждого дня. Я бы предпочел не повторять выборку, чтобы получать ежемесячные или еженедельные данные OHLC. Как я могу использовать SP из SP = DataReader («^ GSPC», «yahoo») для создания дневных диаграмм подсвечника? Благодарю. – brno792

+0

@ brno792 уверен, что может ... увидеть изменения (это все тот же код, просто используя другой фрейм) –

+0

Спасибо Paul H. Я получаю сообщение об ошибке, хотя на строке подсвечника(): KeyError: «['open' 'close '' high '' low '] не в индексе ". – brno792

Смежные вопросы