Search code examples
pythonpandasmatplotlibcandlestick-chart

candlestick plot from pandas dataframe, replace index by dates


This code gives plot of candlesticks with moving averages but the x-axis is in index, I need the x-axis in dates. What changes are required?

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_finance import candlestick2_ohlc

#date format in data-> dd-mm-yyyy
nif = pd.read_csv('data.csv')   


#nif['Date'] = pd.to_datetime(nif['Date'], format='%d-%m-%Y', utc=True)

mavg = nif['Close'].ewm(span=50).mean()
mavg1 = nif['Close'].ewm(span=13).mean()

fg, ax1 = plt.subplots()

cl = candlestick2_ohlc(ax=ax1,opens=nif['Open'],highs=nif['High'],lows=nif['Low'],closes=nif['Close'],width=0.4, colorup='#77d879', colordown='#db3f3f')

mavg.plot(ax=ax1,label='50_ema')
mavg1.plot(color='k',ax=ax1, label='13_ema')

plt.legend(loc=4)
plt.subplots_adjust(left=0.09, bottom=0.20, right=0.94, top=0.90, wspace=0.2, hspace=0)
plt.show()

Output:

enter image description here


Solution

  • I also had a lot of "fun" with this in the past... Here is one way of doing it using mdates:

    import pandas as pd
    import pandas_datareader.data as web
    import datetime as dt
    import matplotlib.pyplot as plt
    from matplotlib.finance import candlestick_ohlc
    import matplotlib.dates as mdates
    
    ticker = 'MCD'
    start = dt.date(2014, 1, 1)
    
    #Gathering the data
    data = web.DataReader(ticker, 'yahoo', start)
    
    
    #Calc moving average
    data['MA10'] = data['Adj Close'].rolling(window=10).mean()
    data['MA60'] = data['Adj Close'].rolling(window=60).mean()
    data.reset_index(inplace=True)
    data['Date']=mdates.date2num(data['Date'].astype(dt.date))
    
    #Plot candlestick chart
    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    ax2 = fig.add_subplot(111)
    ax3 = fig.add_subplot(111)
    ax1.xaxis_date()
    ax1.xaxis.set_major_formatter(mdates.DateFormatter('%d-%m-%Y'))
    ax2.plot(data.Date, data['MA10'], label='MA_10')
    ax3.plot(data.Date, data['MA60'], label='MA_60')
    plt.ylabel("Price")
    plt.title(ticker)
    ax1.grid(True)
    plt.legend(loc='best')
    plt.xticks(rotation=45)
    candlestick_ohlc(ax1, data.values, width=0.6, colorup='g', colordown='r')
    plt.show()
    

    Output:

    enter image description here

    Hope this helps.