python dataframe 去重_Python 与金融数据上证50的收盘价汇总

记得  关注、分享、点在看  呀~ 这样您就能持续收到优质的推送啦
上一期中,我们批量获取了上证50全部股票的交易数据,并将每支股票的交易数据以CSV的格式保存到本地。这一期中,我们将把五十支股票的复权收盘价汇总为一个文件,并将其保存到本地。
FinTech History

Python 与金融数据|股票数据的获取与可视化

Python 与金融数据|数据的滑动平均值及多图可视化

Python 与金融数据|数据的重采样与蜡烛图(K线图)的绘制

Python 与金融数据|网页爬取上证50股票代码

Python 与金融数据|批量抓取并保存上证50的交易数据

598f91854d09126e25f3379d95e31a30.png 收盘数据的汇总

目前我们获取到每一支股票的交易数据中包含 开盘价 Open,收盘价 Close,最高价 High,最低价 Low,交易量 Volume 和复权收盘价 Adj Close。这一期我们重点关注复权收盘价,并将五十支股票的复权收盘价汇总到同一个文档中。

类似的的,我们使用函数 compileData 来实现本期的功能:

def compileData():    with open ('SS50tickers.pickle', 'rb') as f:        tickers = pickle.load(f)

‍首先获取上证50所有的股票代码供后续使用。获取的方式与之前相同:

使用文件操作 open 设置为读取模式 'rb',然后使用 load 方法读取 pickle 格式文件中的内容。

因为要将所有的复权收盘价存放到一个文件中,所以首先需要创建一个 data frame 格式的变量用于存放数据。

使用 pandas 中的 DataFrame 方法可以创建一个空的 data frame 格式的变量。

因此,首先需要导入 pandas 这个工具包:

import pandas as pd

然后在函数中使用 pd.DataFrame() 方法创建一个新的变量:

mainDataFrame = pd.DataFrame()

接下来通过一个循环语句,按照保存的文件名,分别读取每支股票的数据文件:

for ticker in tickers:    dataFrame = pd.read_csv('stockDataFrames/{}.csv'.format(ticker))

然后对每支股票的数据进行预处理。首先设置索引方式为按照时间列 'Date' 索引:

dataFrame.set_index('Date', inplace = True)

因为我们只汇总复权成交价,也就是 'Adj Close' 这一列的数据,因此,我们只保存这一列的数据,并以当前股票的名称来命名这一列。

使用 rename() 这个方法重命名列名称,另外使用 drop() 这个方法删除其它几列。

dataFrame.rename(columns = {'Adj Close': ticker}, inplace = True)dataFrame.drop(['Open', 'Close', 'High', 'Low', 'Volume'], 1, inplace = True)

接下来,将处理好的只剩下复权成交价的股票数据,存入我们前面新建好的 mainDataFrame 这个变量中。

如果当前 mainDataFrame 为空的话,就直接将当前交易数据赋值给该变量,否则使用 join() 这个方法将数据附加到该变量中:

if mainDataFrame.empty:    mainDataFrame = dataFrameelse:    mainDataFrame = mainDataFrame.join(dataFrame, how = 'outer')

join() 这个方法中的第二个参数表示的数据的连接(附加)方式。可选择的方式有下面几种:

left, left_outer 或者 leftouter 代表 左连接

使用左侧 DataFrame 中的索引作为连接键。数据量不足时填充 NaN。

right, right_outer 或者 rightouter 代表 右连接

使用右侧  DataFrame  中的 索引作为连接键 。数据量不足时填充 NaN。 inner 代表 内连接

使用两侧 DataFrame 中索引的交集作为连接键。

full, outer, full_outer, fullouter 代表 全连接

使用两侧 DataFrame 中索引的并集作为连接键。数据量不足时填充 NaN。

最后将合并之后的数据导出到本地 CVS 的格式:

mainDataFrame.to_csv('SS50JoinedClose.csv')

这里我们使用 print 输出合并后数据的前几行观察一下:

print(mainDataFrame.head(6))

最后,我们调用并使用 compileData() 这个函数:

getDataFromYahoo()

代码运行结束后,观察到输出内容如下:

            600036.SS  601229.SS  600031.SS  ...  601328.SS  601939.SS  600340.SSDate                                         ...                                 2010-01-04  11.171289        NaN   7.596135  ...   5.171541   3.535063   1.1047342010-01-05  11.183971        NaN   7.602398  ...   5.301394   3.587049   1.0945332010-01-06  10.950527        NaN   7.811027  ...   5.228001   3.529286   1.0764892010-01-07  10.666690        NaN   7.733828  ...   5.047334   3.477300   1.0584452010-01-08  10.666690        NaN   7.594051  ...   5.075567   3.488852   1.0647242010-01-11  10.685614        NaN   7.354129  ...   5.081213   3.546615   1.063152

7e2f5f8ae187111c3eb19e73c51c3878.png

参考代码

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@author:  IT信息教室(微信公众号)订阅/关注,点在看、分享三连吧~"""# 导入 beautiful soup4 包,用于抓取网页信息import bs4 as bs# 导入 pickle 用于序列化对象import pickle# 导入 request 用于获取网站上的源码import requestsimport datetime as dtimport osimport pandas_datareader.data as webimport pandas as pddef saveSS50Tickers():       resp = requests.get('https://q.stock.sohu.com/cn/bk_4272.shtml')    resp.encoding = 'gb2312'    soup = bs.BeautifulSoup(resp.text, 'lxml')        # print(soup)    table = soup.find('table', {'id': 'BIZ_MS_plstock'})    print(table)    tickers = []    # print(table.find_all('tr'))    for row in table.findAll('tr')[2:]:        # print(row)        ticker = row.findAll('td')[0].text        tickers.append(ticker + '.SS')            with open('SS50tickers.pickle', 'wb') as f:        pickle.dump(tickers, f)        return tickersdef getDataFromYahoo(reloadSS50 = False):    if reloadSS50 == True:        saveSS50Tickers()    else:        with open('SS50tickers.pickle', 'rb') as f:            tickers = pickle.load(f)        if not os.path.exists('stockDataFrames'):        os.makedirs('stockDataFrames')        start = dt.datetime(2010, 1, 1)    end = dt.datetime.now()        for ticker in tickers:        if not os.path.exists('stockDataFrames/{}.csv'.format(ticker)):            dataFrame = web.DataReader(ticker, 'yahoo', start, end)            dataFrame.reset_index(inplace=True)            dataFrame.set_index("Date", inplace=True)            # dataFrame = dataFrame.drop("Symbol", axis=1)            dataFrame.to_csv('stockDataFrames/{}.csv'.format(ticker))        else:            print('Already have {}'.format(ticker))def compileData():    with open ('SS50tickers.pickle', 'rb') as f:        tickers = pickle.load(f)            mainDataFrame = pd.DataFrame()    for ticker in tickers:        dataFrame = pd.read_csv('stockDataFrames/{}.csv'.format(ticker))        dataFrame.set_index('Date', inplace = True)                dataFrame.rename(columns = {'Adj Close': ticker}, inplace = True)        dataFrame.drop(['Open', 'Close', 'High', 'Low', 'Volume'], 1, inplace = True)        if mainDataFrame.empty:            mainDataFrame = dataFrame        else:            mainDataFrame = mainDataFrame.join(dataFrame, how = 'outer')                mainDataFrame.to_csv('SS50JoinedClose.csv')    print(mainDataFrame.head())compileData()

Codes: M先森看世界 Edit: M先森看世界
b60a0cb7527bdb904bd6e99448f1cf7f.gif c109b9119a424a09615d4ace4b9816f4.png d842dc7d4b327b4220e6420a2e645261.png 0208bb64fd40a4112e17c57093b952b8.png 435d0867cfdc8c8e63bf07a6d3504d6f.png 54b963b99bcc258381ce2351ffaf63b3.png 599ec1a1a78d1622703e2fbe5598005e.png
ONE MORE THING

如果您对内容有什么需求建议,或者遇到了什么软件、应用使用方面的问题,请直接在公众号主界面下发私信给我,我看都会及时回复。感谢大家的支持!


合作: classroom.it@hotmail.com

0df427da08254b07b20a82cf3f3960ec.gif

Hi

你好呀

我是 M先森 

这是一个共同学习的平台

我会把我会的 你们想学的

做成教程或者写成文章
我们在这一起学英语 

学编程 学算法

学各种各样

好玩的好用的软件

记得要常回来看看呀

(^_^)a(^_^)a


点击 阅读原文 查看Python入门教程~

喜欢就点个 分享 点赞 在看 三连吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值