选股策略1:2_处理非交易日(python)

学习目标:选股策略1:2_处理非交易日

学习内容:

1:导入必要的库

import pandas as pd
pd.set_option('expand_frame_repr', False)  # 当列太多时不换行

2:导入数据和指数函数

# 导入数据
def import_stock_data(stock_code):
    """
    只导入如下字段:'交易日期', '股票代码', '开盘价', '最高价', '最低价', '收盘价', '涨跌幅'
    最终输出结果按照日期排序
    :param stock_code:
    :return:
    """
    df = pd.read_csv(stock_code + '.csv', encoding='gbk')
    #print(df)
    
    df = df[['交易日期','股票代码', '开盘价', '最高价', '最低价', '收盘价', '成交量', '涨跌幅']]
    df.sort_values(by=['交易日期'], inplace=True)
    df['交易日期'] = pd.to_datetime(df['交易日期'])
    df.reset_index(inplace=True, drop=True)

    return df

# 导入指数
def import_sh000001_data():
    # 导入指数数据
    df_index = pd.read_csv('sh000001.csv', parse_dates=['date'])
    df_index = df_index[['date', 'change']]
    df_index.rename(columns={'date': '交易日期', 'change': '大盘涨跌幅'}, inplace=True)
    df_index.sort_values(by=['交易日期'], inplace=True)
    df_index.dropna(subset=['大盘涨跌幅'], inplace=True)
    df_index.reset_index(inplace=True, drop=True)

    return df_index

3:数据导入

# =====数据导入
# ===导入股票数据
# 读入数据
code = 'sz300001'
df = import_stock_data(code)
start_date = df.iloc[0]['交易日期']  # 取数据开始的日期
end_date = df.iloc[-1]['交易日期']  # 取数据结束的日期

# ===导入指数数据
# 选取日期
df_index = import_sh000001_data()
df_index.rename(columns={'大盘涨跌幅': '涨跌幅'}, inplace=True)  # 对列名重命名
df_index = df_index[(df_index['交易日期'] >= start_date) &
                    (df_index['交易日期'] <= end_date)]

4:使用merge函数将指数数据和股票数据进行横向合并

# =====将指数数据和股票数据进行横向合并
# ===上课资料文件夹中的《merge函数解释》,说明横向合并的含义。
# ===使用merge函数
df = pd.merge(
    left=df,  # 两个表合并,放在左边的表
    right=df_index,  # 两个表合并,放在右边的表
    on=['交易日期'],  # 以哪个变量作为合并的主键,可以是多个,但是一定要在两张表中都存在。
    how='outer',
    # left:只保留左表的主键,right:只保留右表的主键,
    # outer:两边的主键都保留,inner:两边都有的主键才保留
    # 此处使用outer和right都可以
    sort=True,  # 结果数据是否按照主键进行排序
    suffixes=['_股票', '_指数'],  # 若两边除了主键之外有相同的列名,给这些列加上后缀
    # indicator=True  # 增加_merge列,表明这一行数据来自哪个表
)

5:填补合并之后的缺失值

# ===填补合并之后的缺失值
# 对于'股票代码', '收盘价',应该如何填补?
df[['股票代码', '收盘价']] = df[['股票代码', '收盘价']].fillna(method='ffill')
# 对于开盘价、最高价、最低价,应该如何填补?
df['开盘价'] = df['开盘价'].fillna(value=df['收盘价'])
df['最高价'] = df['最高价'].fillna(value=df['收盘价'])
df['最低价'] = df['最低价'].fillna(value=df['收盘价'])
# 对于'成交量', '涨跌幅_股票',应该如何填补?
df[['成交量', '涨跌幅_股票']] = df[['成交量', '涨跌幅_股票']].fillna(value=0)
# print df[df['交易日期'] >= pd.to_datetime('20160310')]

# ===判断当天是否交易,增加一列"是否交易",判断这个股票今天是否交易
df.loc[df[df['成交量'] != 0].index, '是否交易'] = 1
df['是否交易'].fillna(value=0, inplace=True)
# print df[df['交易日期'] >= pd.to_datetime('20160310')]


# =====输出
df.to_csv('sz300001_after_merge.csv', index=False, encoding='gbk')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值