在我的本地数据库里面有整个A股市场的标的数据,包括
有个需求是【在2019年7月31号--2022年7月31号之间,股票要满足上市时间超过250个交易日,即使退市了,也没关系】
仔细观察会发现除去真实退市的,其他的标的退市时间为'2200-01-01'
解决思路,以2019年7月31号之后250个交易日的时间为退市日期,在聚宽api里面有相应函数可以拿到交易日,这里为'2020-08-10';把‘2200-01-01’统一设置为需求截止时间‘2022-07-31’
本以为可以直接操作,但是发现这一字段是 timedelta64类型 不能用字符串的形式对比,所以得想个办法转换
df.loc[df[df['退市时间'] == '2200-01-01'].index.tolist(), '退市时间'] = '2022-07-31'
把退市时间为‘2200-01-01’的索引统一拿到,再直接赋值。
(即对dataframe某一列的值进行赋值处理,即使是timedelta64也可以)
根据需求,退市时间和上市时间的间隔必须是250个交易日!虽然但是,在本地环境差值却不是250!是2022-07-31--->2020-08-10的实际自然日,即376天
实际的timedeltaa64类型很难和int/float做对比,所以要换个思路,利用pandas的apply方法转换
# timedelta64类型
df['days'] = df['退市时间'] - df['上市时间']
# timedelta64类型的天数变为int类型
df['diff'] = df['days'].apply(lambda x: x.days)
在整个股池中有4920只股
筛选后出来复合需求的只有4420只股了
select_df = df.loc[(df['退市时间'] > '2020-08-10') & (df['diff'] >= 376)]
# 把退市时间复原
select_df.loc[select_df[select_df['退市时间'] == '2022-07-31'].index.tolist(), '退市时间'] = '2200-01-01'
print(select_df)
print('select_df的长度为', len(select_df))
我在把数据入库的时候,为了避免退市时间和上市时间两个字段为date类型,对它做了字符串处理入库
python将Dataframe整个快速存入Mongodb的方法
# 插入对象
data = json.loads(new_df.T.to_json()).values()
# 插入数据
result = new_coll.insert_many(data)
import pymongo
import pandas as pd
import json
# pd.set_option('display.max_rows', None)
# 建立链接
client = pymongo.MongoClient("192.168.2.61", 27017)
# 创建数据库对象
db = client['security']
# 获取集合对象
my_coll = db['index']
# 插入数据库对象
new_db = client['hold_on_security']
# 插入数据库集合对象
new_coll = new_db['index']
# 读取的时候把不读取id字段
df = pd.DataFrame(list(my_coll.find({}, {"_id": 0})))
print(df)
df.loc[df[df['退市时间'] == '2200-01-01'].index.tolist(), '退市时间'] = '2022-07-31'
print('df的长度为', len(df))
# timedelta64类型
df['days'] = df['退市时间'] - df['上市时间']
# timedelta64类型的天数变为int类型
df['diff'] = df['days'].apply(lambda x: x.days)
# print(df)
# print(df.info())
select_df = df.loc[(df['退市时间'] > '2020-08-10') & (df['diff'] >= 376)]
select_df.loc[select_df[select_df['退市时间'] == '2022-07-31'].index.tolist(), '退市时间'] = '2200-01-01'
print(select_df)
print('select_df的长度为', len(select_df))
new_df = select_df[['股票代码', '股票名称', '股票简写', '上市时间', '退市时间']]
print(new_df)
print('new_df的长度为', len(new_df))
# print(new_df.info())
new_df['上市时间'] = new_df['上市时间'].apply(lambda x: str(x)[:10])
new_df['退市时间'] = new_df['退市时间'].apply(lambda x: str(x)[:10])
# 插入对象
data = json.loads(new_df.T.to_json()).values()
# 插入数据
result = new_coll.insert_many(data)
print('程序执行成功!!!')