处理丢失数据

一 . 简单的股票分析

使用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,这时候就需要用行填充

 

posted @ 2019-05-26 23:19  一个很善良的抱爱  阅读(295)  评论(0编辑  收藏  举报