Mongodb数据库里提取上近3年上市时间超过250天的股池

在我的本地数据库里面有整个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('程序执行成功!!!')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值