来自 pandas 数据框的烛台图,按日期替换索引

candlestick plot from pandas dataframe, replace index by dates

此代码给出了带有移动平均线的烛台图,但 x 轴在索引中,我需要日期中的 x 轴。 需要进行哪些更改?

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

输出:

我过去也有很多 "fun" 与此有关...这是使用 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()

输出:

希望这对您有所帮助。

此处笨拙的解决方法,源自其他 post(如果我能再次找到,将参考)。使用 pandas df,按索引绘制,然后将 xaxis 刻度标签引用到日期字符串以供显示。我是 python / matplotlib 的新手,这个解决方案不是那么灵活,但它基本上可以工作。还使用 pd 指数进行绘图删除了市场价格数据上的空白 'weekend' 每日空间。 Matplotlib xaxis index as dates

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

%matplotlib notebook # for Jupyter

# Format m/d/Y,Open,High,Low,Close,Adj Close,Volume
# csv data does not include NaN, or 'weekend' lines, 
# only dates from which prices are recorded
DJIA = pd.read_csv('yourFILE.csv') #Format m/d/Y,Open,High,
    Low,Close,Adj Close,Volume

print(DJIA.head())

fg, ax1 = plt.subplots()

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

ax1.set_xticks(np.arange(len(DJIA)))
ax1.set_xticklabels(DJIA['Date'], fontsize=6, rotation=-90)

plt.show()

简单的 df:

巧妙地使用:

import plotly.figure_factory
fig = plotly.figure_factory.create_candlestick(df.open, df.high, df.low, df.close, dates=df.ts)
fig.show()

将自动解析 ts 列以在 x 上正确显示。