[ Python ] 数据挖掘:股票价格
数据挖掘是通过对大量的数据进行排序,挑选出相关信息的过程。使用Python 分析Google 股票价格。
·
题目
数据挖掘是通过对大量的数据进行排序,挑选出相关信息的过程。商业情报结构和金融分析师会用到它,而且正日益被用在科学领域中,从现代实验和观测方法所产生的巨大数据集中提取信息。
在这个项目中,我们想要对一些公司的股票价格进行初步的数据挖掘。以Google公司为对象。程序将计算出2013-2018年间Google股票的每月平均价格,并得出Google公司最好和最坏的6个月。提供读取函数的数据,请编写下面几个函数和调用这些函数的主程序。
- (1)首先需要股票历史价格。访问
finance.yahoo.com
,在搜索字段中输入Google
,选择“Historical Prices
”(目前在页面左侧),并找到“Download to Spreadsheet
”选项。将文件保存在Python程序所在文件夹中。默认名称是“table.csv
”,将使用该名称。文件格式由文件前几行给出:
Date, Open, High, Low, Close, Volume, Adj Close 2015-10-11, 461.00, 462.07, 443.28, 449.15, 10006000, 449.15 2015-10-10, 422.64, 439.18, 410.50, 439.08, 8589400, 439.08
- (2)
getDataList (FileName)
“CSV”文件是“用逗号分隔的文件”,所以可以在逗号处分割数据。下面的函数将读取一个文件,从逗号处分隔文件中每行,并把数据放到返回的列表中。结果是二维列表,列表的每行又是一个列表。此外,每个项都是一个字符串。读文件需要使用文件名进行调用:getDataList(‘table.csv’)
,在shell中应用此函数,了解函数的返回值是什么。
def getDataList(fileName):
dataFile = open(fileName, ‘r’)
dataList = [ ] # start with an empty list
for line in dataFile:
# strip end-of-line, split on commas, and append items to list
dataList. append (line.strip().split(‘,’))
return dataList `
- (3)
getMonthlyAverages (dataList)
在这个函数中,将使用getDataList
函数产生的dataList
作为参数。使用Date,Volume, Adj Close
计算每月平均价格。下面是一个计算月平均价格的公式,其中Vi代表Volume,Ci
是当天调整收盘价(Adj Close)
。
averagePrice = (V1 * C1 + V2 *C2 + …….+ Vn * Cn)/(V1 + V2 + ……+ Vn)
为每个月创建包含两个项的元组,包括该月的平均价格和日期(只需要年份和月份)。将每个月的元组添加到列表中(例如monthlyAveragesList
),计算所有月的平均值后,返回此列表。在这里使用元组,是因为这些值计算出来后不想意外的更改它们! - (4)
printInfo (monthlyAveragesList)
在这个函数中,需要使用getMonthlyAverages
函数得到月平均价格列表。需要查找和显示Google
股价中6个最好(最高平均价格)和6个最坏(最低平均价格)的月份。按从高到低的顺序显示,要求精确到小数点后2位。对输出进行格式化,得到美观的输出(包括信息标题栏)。此函数不返回任何值。 - (5)如果不调用这些函数,它们不起作用。因此,应该写代码来调用他们。
提示:
- (1) 列表
sort( )
和reverse( )
方法会起作用。做实验来观察如何在元组列表上使用这两个方法,注意是如何按第一个项进行排序的。 - (2)创建元组,项是圆括号内用逗号分隔的列表:
(x,y)
。 - (3)使用二维列表(或元组列表)时,第一个列表的第一项是
someList[0][0]
,第一个列表的第二项是someList[0][1]
。
实现过程
1.访问finance.yahoo.com
,获取到Google
股票历史价格(2019-06-19 至 2020-06-18)。
新建Python
项目,将数据文件拷贝到项目目录下。
项目结构如下图:
2.编写方法读取股票历史价格数据。
该方法接收文件路径,读取数据存入list
数据结构中,返回该list
。
3.使用 tabulate
库,绘制漂亮的图表,将计算所得Google
股票历史平均价格数据,按照降序排列。
输出结果如图:
4.使用 matplotlib
库绘制 Google
平均股价的柱状图,折线图,散点图。图表形式可准确直观的感受到数据的变化。
绘制的图表见下图:
实现代码
from tabulate import tabulate
import matplotlib.pyplot as plt
# 读取 Google 股票价格数据
def getDataList(fileName):
dataFile = open(fileName, 'r')
dataList = []
for line in dataFile:
dataList.append(line.strip().split(','))
return dataList
# 在这个函数中,将使用getDataList函数产生的dataList作为参数。
# 使用Date,Volume, Adj Close计算每月平均价格。
# 下面是一个计算月平均价格的公式,其中Vi代表Volume,Ci是当天调整收盘价(Adj Close)。
# averagePrice = (V1 * C1 + V2 *C2 + …….+ Vn * Cn)/(V1 + V2 + ……+ Vn)
# 为每个月创建包含两个项的元组,包括该月的平均价格和日期(只需要年份和月份)。
# 将每个月的元组添加到列表中(例如monthlyAveragesList),计算所有月的平均值后,
# 返回此列表。在这里使用元组,是因为这些值计算出来后不想意外的更改它们!
def getMonthlyAverages(dataList):
# 删除表头
del dataList[0]
# 每月平均股价
averagePrice = []
# 每月平均股价列表
monthlyAveragesList = []
# 当前计算月份
month = dataList[0][0][5:7]
# 平均股价计算公式分子
result1 = []
# 平均股价计算公式分母
result2 = []
# 标志位
flag = 0
for i in range(len(dataList)):
# 判断读取的月份是否为当计算月份
if dataList[i][0][5:7] == month:
i -= flag
# 计算分子
vi = dataList[i][6]
# 计算分母
ci = dataList[i][5]
# 累加分子
result1.append(float(vi) * float(ci))
# 累加分母
result2.append(float(vi))
else:
flag += 1
# 当前计算月份
averagePrice.append(dataList[i - 1][0][:7])
# 当前计算月平均股价
averagePrice.append(sum(result1) / sum(result2))
# 将当前计算月平均股价追加到列表
monthlyAveragesList.append(tuple(averagePrice))
# 将计算数据置空(用于计算下一个月份的数据)
result1 = []
result2 = []
averagePrice = []
# 设置当前计算月
month = dataList[i][0][5:7]
# 将最后一个月份的数据追加到列表
averagePrice.append(dataList[i - 1][0][:7])
averagePrice.append(sum(result1) / sum(result2))
monthlyAveragesList.append(tuple(averagePrice))
return monthlyAveragesList
# 在这个函数中,需要使用getMonthlyAverages函数得到月平均价格列表。
# 需要查找和显示Google股价中6个最好(最高平均价格)和6个最坏(最低平均价格)的月份。
# 按从高到低的顺序显示,要求精确到小数点后2位。
# 对输出进行格式化,得到美观的输出(包括信息标题栏)。
# 此函数不返回任何值。
# 使用 tabulate 库,绘制漂亮的图表
def printInfo(monthlyAveragesList):
table_header = ['月份', '价格']
# 按照平均股价排序
monthlyAveragesList.sort(key=lambda x: x[1])
# 倒转列表元素,使按照平均股价降序排列
monthlyAveragesList.reverse()
print("Google股价 12个月平均价格列表")
print(tabulate(monthlyAveragesList, headers=table_header, tablefmt='grid'))
print("Google股价 6个最好月份")
print(tabulate(monthlyAveragesList[:6], headers=table_header, tablefmt='grid'))
print("Google股价 6个最坏月份")
print(tabulate(monthlyAveragesList[7:], headers=table_header, tablefmt='grid'))
# 绘制 Google 平均股价的柱状图,折线图,散点图
# 使用 matplotlib 库 绘制准确的图表
def getReport(monthlyAveragesList):
names = []
values = []
for row in monthlyAveragesList:
names.append(row[0])
values.append(row[1])
fig, axs = plt.subplots(1, 3, figsize=(9, 3), sharey=True)
axs[0].bar(names, values)
axs[1].scatter(names, values)
axs[2].plot(names, values)
fig.suptitle('Google stock')
plt.show()
# 主方法
def main():
# 读取股价数据
dataList = getDataList('./GOOG.csv')
# 计算每月平均股价
monthlyAveragesList = getMonthlyAverages(dataList)
# 绘制图表
getReport(monthlyAveragesList)
# 打印排序后数据
printInfo(monthlyAveragesList)
main()
更多推荐
所有评论(0)