Day 26:专案06 - 股市趋势图03 | Matplotlib、Pandas绘图

图片来源:https://unsplash.com/photos/mcAUHlGirVs

前两天已经将各股日成交资料存成.csv档了,接着就来利用这些资料绘制出趋势图吧~

汇入Pandas

还记得前天我们将Pandas的DataFrame汇出成csv只靠一个函数吗? 现在反过来将csv汇入成DataFrame一样也只需要一个函数哦! 是不是超好用呢?

试着将前天汇出的三种档案.csv.xlsx.html都汇入成DataFrame看看。汇入的参数大致上和汇出一样,顶多就编码要注意一下。

import pandas as pd

# 读取csv
df1 = pd.read_csv("./month_stock.csv", encoding="big5")
print(df1)

# 读取excel
df2 = pd.read_excel("./month_stock.xlsx")
print(df2)

# 读取html
df3 = pd.read_html("./month_stock.html", encoding="utf8")
print(df3)

既然可以汇入csv了,就可以用前天储存的csv档绘制趋势图了! 绘制趋势图我会介绍两种方法:MatplotlibPandas

Matplotlib绘图

Matplotlib是Python绘制数据图的套件,待会就要用这个套件将股价绘制成趋势图。

Anaconda已经有matplotlib套件了,没有的话一样用pip下载。

pip install matplotlib

载完後就引进你的专案中,但因为matplotlib太长了,通常会减写成plt

import matplotlib.pyplot as plt

再来,筛选出画趋势图需要的资料,要日期最高价最低价收盘价这几个栏位。

# 筛选我们要的资料
date = df["日期"]
high_price = df["最高价"]
low_price = df["最低价"]
end_price = df["收盘价"]

plt.plot()这个函数就是在图上绘制一条折线,第一个参数当作x轴,第二个参数当作y轴。因此我们以时间作为x轴,分别画出以最高价最低价收盘价为y轴的折线。

# 绘图
plt.plot(date, high_price)
plt.plot(date, low_price)
plt.plot(date, end_price)

接着加上图片的一些属性,待会再用图说明每个属性的作用。

plt.xlabel("日期")    # x轴标签
plt.ylabel("价格")    # y轴标签
plt.legend(["最高价", "最低价", "收盘价"], loc="lower right")    # 图示,共有左下、左上、右下、右上四个方位
plt.title("110年8月股市趋势图")    # 主标题
plt.grid(True)    # 是否有网格?

最後,用plt.show()显示图片!

# 显示图片
plt.show()

上方功能列可以执行缩放、拖曳、储存等动作。

Matplotlib预设并没有支援中文字体,因此中文字会变成像下图这样的乱码。

解决方法可以参考这篇教学

如果是希望自动存成图片,请使用plt.savefig()这个函数,记得一定要放在plt.show()之前,不然会存空白的图!

# 存成图片(一定要放前面!)
plt.savefig("matplotlib_chart.png")

虽然说matplotlib预设会给每条线不同颜色,但如果不满意预设的颜色,还是能够客制化的。

color参数表示线条颜色,用hex色码表示,可以到这里挑颜色。
linewidth参数表示线条宽度,数字越大越粗。
linestyle参数则表示线条样式,参数值可以参考官方文件

plt.plot(date, high_price, color="#ff2121")
plt.plot(date, low_price, color="#00bd42", linewidth=5)
plt.plot(date, end_price, color="#005de0", linestyle="dashed")

Pandas绘图

嘿嘿~其实Pandas本身就有绘图功能罗,那你可能会想,那我还学Matplotlib干嘛?? 事实上,Pandas的绘图功能有一部份也是依靠Matplotlib的,所以还是要学啦~

Pandas在绘图前要先把资料整理成DataFrame的型态,虽然汇入的资料本身就是DataFrame了,但是我们只需要其中一部分的资料而已,因此我们要先将我们要的栏位筛选出来,跟上面一样,要日期最高价最低价收盘价这四个栏位。

接着,要定义一个栏位当作x轴,这边当然就是用日期栏位。

# 筛选我们要的资料
chart_df = df[["日期", "最高价", "最低价", "收盘价"]]
# 将日期设为x轴
chart_df.set_index("日期", inplace=True)
print(chart_df)

资料整理完後,绘图就变得很简单,只需要用plot()这个函数,属性设定一下就可以了!

# 绘图
chart = chart_df.plot(xlabel="日期", ylabel="价格", title="110年8月股市趋势图", legend=True)
plt.grid()

中文字体问题的解决方法和Matplotlib一样,请参考上方说明。

最後存档和显示图片的方法与Matplotlib一致。

# 存成图片(一定要放前面!)
plt.savefig("pandas_chart.png")
# 显示图片
plt.show()

结果如下:

趋势图就完成了! 至於後续要怎麽应用就看各位的想像力啦!

专案完整程序码

小结

今天一开始先教大家怎麽从汇入csv档,然後使用Matplotlib和Pandas这两种不同方法将股市资料绘制成趋势图。

股市趋势图的专案就到这边! 明天开始会教你如何做出天气小助手,每天早上通知你今天的天气情形,大家敬请期待~


如果喜欢这系列文章麻烦帮我按Like加订阅,你的支持是我创作最大的动力~

本系列文章以及范例程序码都同步更新在GitHub上,後续会持续的更新,如果喜欢也麻烦帮我按个星星吧~

有任何问题或建议,都欢迎在底下留言区提出,还请大家多多指教。


<<:  RDS备份还原与地端的差异

>>:  模型的内容06 def main()

Day12

继续看范例fig06_12.cpp下半段,一开始定义三个函式原型void useLocal(), v...

[Day08] TS:什麽!型别也能做条件判断?认识 Conditional Types

上面这个是今天会提到的内容,如果你已经可以轻松看懂,欢迎直接左转去看我队友们的精彩文章! 昨天我们...

Proxy 代理模式

今天要谈到代理模式,其实跟昨天的装饰器模式很类似。代理模式的目的在於,因应某些条件替换物件原本的行为...

[重构倒数第28天] - 关於拆分 Components 的学问

前言 该系列是为了让看过Vue官方文件或学过Vue但是却不知道怎麽下手去重构现在有的网站而去规画的系...

大共享时代系列_008_共享居家照护

照顾...是谁的工作? 当我病痛衰弱时,谁可以照顾我? 家人?朋友?爱人? 但照顾者不需要休息跟喘息...