一 . 简单的股票分析
使用 tushare 包获取某股票历史行情数据
输出该股票所有收盘比开盘上涨 3% 以上的日期
输出该股票所有开盘比前日收盘跌幅超过 2% 的日期
假如我从 2010 年 1.1 日开始, 每月第一个交易日买入 1 手股票, 每年最后一个交易日卖出所有的股票, 到今天为止, 我的收益如何
导包
- import pandas
- from pandas import Series,DataFrame
- import numpy as np
- import tushare
可以去帮助文档看 tushare 的用法
df_tushare = tushare.get_k_data(code='600519',start='2000-01-01') # code 是股票代码, start 是起始日期, 写的早于上市时间, 就按上市时间开始
把数据写到文件里
- # 写入数据
- df_tushare.to_csv('./maotai.csv')
- # 将 data 列的数据转成时间序列, 然后将改列作为整个数据的行索引
- data = pandas.read_csv('./maotai.csv',index_col='date',parse_dates=['date'])
- data.drop(labels='Unnamed: 0',axis=1,inplace=True) # 关于 drop 的方法, axis=1 代表列, 0 代表行, inplace=True, 代表在原数据上修改
输出该股票所有收盘比开盘上涨 3% 以上的日期
- # 输出该股票所有收盘比开盘上涨 3% 的日期
- # (收盘 - 开盘)/ 开盘 > 0.03
- indexs = (data['close']-data['open'])/data['open']> 0.03 # 返回的是布尔值, 满足条件是 True
- data.loc[indexs].index # 中括号里面可以写布尔值
让数据向后推一个
data['close'].head().shift(1)
输出该股票所有开盘比前日收盘跌幅超过 2% 的日期
- indexs = (data['open'] - data['close'].shift(1))/data['close'].shift(1)< -0.02
- data.loc[indexs].index
假如我从 2010 年 1.1 日开始, 每月第一个交易日买入 1 手股票, 每年最后一个交易日卖出所有的股票, 到今天为止, 我的收益如何
- new_data = data['2010-01':'2019'] # 切片可以只切年, 也可以切到月, 日
- # 找出每一年的第一个交易日对应的行数据 (数据的重新取样)
- df_month_first = new_data.resample('M').first() # M 代表月份 日期是最后一天, 但是数据是第一天的数据
- # 获取每年的最后一次开盘价
- df_year_last = new_data.resample('Y').last()
- df_year_last[:-1]
- # 然后自己算就 OK 啦
二 . 处理丢失数据
两种丢失数据
- 1. None
- 2. num.nan(NaN)
- import numpy
- import pandas
- from pandas import Series,DataFrame
numpy.nan(NaN) 是浮点型, 能参与计算, 但是计算结果是 NaN
pandas 中的 None 和 NaN
pandas 中 None 与 numpy.nan 都视作 numpy.nan
创建 DataFrame
- df = DataFrame(data=numpy.random.randint(0,100,size=(10,12)))
- # 将某些数组元素复制为 nan
- df.iloc[1,1] = None
- df.iloc[5,6] = None
- df.iloc[3,5] = None
- df.iloc[4,4] = None
- df.iloc[2,8] = numpy.nan
- # 将 NaN 对应的行删除
- # 1. 进行空值检测
- df.isnull()
- df.isnull().any(axis=1) # isnull 和 any 一起用 True 证明有空值
- df.notnull().all(axis=1) # notnull 和 all 一起用 False 证明有空值
过滤函数
df.dropna() 由于是与 drop 相关的函数, 所以 axis=0 代表行
df.dropna(axis=0) # 删除 NaN 所在的行
填充函数 df.fillna() 返回的是 DateFrame, 可以继续调用 fillna
- df.fillna(method='bfill',axis=0) # 这里的 axis=0 是列 , 按照前边的值填充
- df.fillna(method='ffill',axis=1) # 按照 行 后边的值填充
- # 如果一列里连着多个 NaN, 这时候就需要用行填充
来源: http://www.bubuko.com/infodetail-3072975.html