我的Python心路历程 第十期 (10.1 实践实例之股票数据分析)
针对参考1中的代码进行实践,其中有几点体会和问题的处理。
首先,导入pandas库,详见参考2。
其次,准备数据,可以自己制作假数据,也可以从网上下载已有数据。
如下数据进行测试:
将datadir和fname适配为自己的,编译发现无法识别中文,故此将标题改为代码中的对应英文标题。
根据提示更改为如下代码:
# 最大年均复合增长率
print('4.2 最大年均复合增长率')
min_date = adj_price.idxmin()
max_date = adj_price.idxmax()
print(max_date.year)
print(min_date.year)
max_growth_per_year = total_max_growth ** (1.0 / (max_date.year - min_date.year))
print(max_growth_per_year)
编译时发现又一个问题,计算max_growth_per_year时的分母max_date.year - min_date.year为0,调整数据,将Adj Close列的数据从小到大序列化(更改为模拟数据,因为真实数据只有2019年的,故此导致max_date.year和min_date.year均为2019)。
最后,经过以上调整之后所有代码可以成功编译,运行也未出错,结果如下:
但是,out2的图表matplotlib.pyplot示意并没有出来,肿么办呢?
通过参考3的方法测试发现图像是可以显示出来的,测试代码如下:
import numpy as np
import matplotlib.pyplot as plt
def main():
# 线的绘制
x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
c, s = np.cos(x), np.sin(x)
# 绘制
plt.figure(1)
# 自变量 因变量
plt.plot(x, c)
# 自变量 因变量
plt.plot(x, s)
plt.show()
plt.savefig("one.png")
if __name__ == "__main__":
main()
经过初步分析,发现是不是因为没有main函数导致的呢?不应该啊,添加main函数后依旧不现实图像,仔细研读以上测试成功的代码发现少了一句plt.show()
,增加后果然应验,效果如下图所示:
对应代码为:
# coding=UTF-8
import os
import matplotlib.pyplot as plt
def main():
x = [0, 10]
y = [0, 1000]
lines = plt.plot(x, y)
# use keyword args
plt.setp(lines, color='r', linewidth=2.0)
**plt.show()**
if __name__ == "__main__":
main()
果不其然,少了这句就是无法显示Pycharm Matplotlib 图像。
附所有代码如下(更新后):
# coding=UTF-8
import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt
# 股票数据分析,前提是对应的数据已经下载,如SZ#300790.csv
#获取绝对路径,300790-300999为当前文件夹
datadir = os.path.join(os.path.dirname(__file__), '300790-300999')
fname = '00001.csv'
data = pd.read_csv(os.path.join(datadir, fname), index_col='Date', parse_dates=True)
def gpbase0():
# 分析波动幅度
print('1.分析波动幅度')
print(data)
# 使用 resample 针对复权收盘价进行重采样
print('2.使用 resample 针对复权收盘价进行重采样')
adj_price = data['Adj Close']
print(adj_price)
resampled = adj_price.resample('m').ohlc()
print(resampled)
print((resampled.high - resampled.low) / resampled.low)
def growth3():
## 增长曲线
print('3.增长曲线')
adj_price = data['Adj Close']
adj_price.plot(figsize=(8, 6))
print(data.head())
def growth4():
#获取列族'Adj Close'
adj_price = data['Adj Close']
## 增长倍数
print('4.增长倍数')
### 最高增长倍数
print('4.1 最高增长倍数')
total_max_growth = adj_price.max() / adj_price.min()
print(total_max_growth)
# 最大年均复合增长率
print('4.2 最大年均复合增长率')
min_date = adj_price.idxmin()
max_date = adj_price.idxmax()
print(max_date.year)
print(min_date.year)
max_growth_per_year = total_max_growth ** (1.0 / (max_date.year - min_date.year))
print(max_growth_per_year)
def growth5():
#获取列族'Adj Close'
adj_price = data['Adj Close']
## 当前增长倍数及复合增长率
print('5.当前增长倍数及复合增长率')
### 当前平均增长倍数
print('5.1 当前平均增长倍数')
total_growth = adj_price.iloc[0] / adj_price.iloc[-1]
print(total_growth)
### 年复合增长倍数
print('5.2 年复合增长倍数')
old_date = adj_price.index[-1]
now_date = adj_price.index[0]
growth_per_year = total_growth ** (1.0 / (now_date.year - old_date.year))
print(growth_per_year)
### 平均年化增长率
print('5.3 平均年化增长率')
price_in_years = adj_price.to_period(freq='A').groupby(level=0).first()
print(price_in_years)
#print(price_in_years.plot(figsize=(8,6)))
diff = price_in_years.diff()
rate_in_years = diff / (price_in_years - diff)
print(rate_in_years)
print(rate_in_years.mean())
rate_in_years.plot(kind='bar', figsize=(8,6))
X = [0, len(rate_in_years)]
Y = [0, 0]
plt.plot(X, Y, color='red', linestyle='-')
#不增加该代码的话,Pycharm Matplotlib 图像不显示
plt.show()
def main():
growth5()
if __name__ == "__main__":
main()
参考:
1、python数据科学(十三):实例——股票数据分析
2、我的Python心路历程 第七期 (PyCharm配置第三方库)
3、Pycharm Matplotlib 图像不显示问题