[ Python ] 数据挖掘:股票价格

题目

数据挖掘是通过对大量的数据进行排序,挑选出相关信息的过程。商业情报结构和金融分析师会用到它,而且正日益被用在科学领域中,从现代实验和观测方法所产生的巨大数据集中提取信息。

在这个项目中,我们想要对一些公司的股票价格进行初步的数据挖掘。以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()


在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页