201 lines
6.7 KiB
Plaintext
201 lines
6.7 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"id": "1c4126c0",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from operator import index\n",
|
|
"\n",
|
|
"import tushare as ts\n",
|
|
"import pandas as pd\n",
|
|
"import time\n",
|
|
"import akshare as ak\n",
|
|
"\n",
|
|
"ts.set_token('3a0741c702ee7e5e5f2bf1f0846bafaafe4e320833240b2a7e4a685f')\n",
|
|
"pro = ts.pro_api()\n",
|
|
"\n",
|
|
"from datetime import datetime\n",
|
|
"import pandas as pd\n",
|
|
"import warnings\n",
|
|
"import warnings\n",
|
|
"\n",
|
|
"warnings.filterwarnings(\"ignore\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 42,
|
|
"id": "dc90836a",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def filter_rows(df):\n",
|
|
" # 按照 name 和 start_date 分组\n",
|
|
" def select_row(group):\n",
|
|
" # 如果有 end_date 不为 NaT 的行,优先保留这些行\n",
|
|
" valid_rows = group[group['end_date'].notna()]\n",
|
|
" if not valid_rows.empty:\n",
|
|
" return valid_rows.iloc[0] # 返回第一个有效行\n",
|
|
" else:\n",
|
|
" return group.iloc[0] # 如果没有有效行,返回第一行\n",
|
|
"\n",
|
|
" filtered_df = df.groupby(['name', 'start_date'], group_keys=False).apply(select_row)\n",
|
|
" filtered_df = filtered_df.reset_index(drop=True)\n",
|
|
" return filtered_df\n",
|
|
"\n",
|
|
"name_change_df = pd.read_hdf('E:/PyProject/NewStock/data/name_change.h5', key='name_change')\n",
|
|
"name_change_df = name_change_df.drop_duplicates(keep='first')\n",
|
|
"\n",
|
|
"# 确保 name_change_df 的日期格式正确\n",
|
|
"name_change_df['start_date'] = pd.to_datetime(name_change_df['start_date'], format='%Y%m%d')\n",
|
|
"name_change_df['end_date'] = pd.to_datetime(name_change_df['end_date'], format='%Y%m%d', errors='coerce')\n",
|
|
"name_change_df = name_change_df[name_change_df.name.str.contains('ST')]\n",
|
|
"name_change_dict = {}\n",
|
|
"for ts_code, group in name_change_df.groupby('ts_code'):\n",
|
|
" # 只保留 'ST' 和 '*ST' 的记录\n",
|
|
" st_data = group[group['name'].str.contains('ST')]\n",
|
|
" if not st_data.empty and ts_code == '002569.SZ':\n",
|
|
" name_change_dict[ts_code] = filter_rows(st_data)\n",
|
|
" # name_change_dict[ts_code] = st_data"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 43,
|
|
"id": "f0ed36d1",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" ts_code name start_date end_date change_reason\n",
|
|
"7990 002569.SZ ST步森 2020-06-09 NaT 摘星\n",
|
|
"7992 002569.SZ *ST步森 2019-04-30 NaT *ST\n",
|
|
"7993 002569.SZ *ST步森 2019-04-30 2020-06-08 *ST\n",
|
|
" ts_code name start_date end_date change_reason\n",
|
|
"0 002569.SZ *ST步森 2019-04-30 2020-06-08 *ST\n",
|
|
"1 002569.SZ ST步森 2020-06-09 NaT 摘星\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(name_change_df[name_change_df['ts_code'] == '002569.SZ'])\n",
|
|
"print(filter_rows(name_change_df[name_change_df['ts_code'] == '002569.SZ']))\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 44,
|
|
"id": "3c526622",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" ts_code name start_date end_date change_reason\n",
|
|
"0 002569.SZ *ST步森 2019-04-30 2020-06-08 *ST\n",
|
|
"1 002569.SZ ST步森 2020-06-09 NaT 摘星\n",
|
|
" ts_code trade_date is_st\n",
|
|
"3753 002569.SZ 20230120 True\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"\n",
|
|
"warnings.filterwarnings(\"ignore\")\n",
|
|
"\n",
|
|
"\n",
|
|
"def is_st(name_change_dict, stock_code, target_date):\n",
|
|
" target_date = datetime.strptime(target_date, '%Y%m%d')\n",
|
|
" if stock_code not in name_change_dict.keys():\n",
|
|
" return False\n",
|
|
" df = name_change_dict[stock_code]\n",
|
|
" print(df)\n",
|
|
" for i in range(len(df)):\n",
|
|
" sds = df.iloc[i, 2]\n",
|
|
" eds = df.iloc[i, 3]\n",
|
|
" if eds is None or eds is pd.NaT:\n",
|
|
" eds = datetime.now()\n",
|
|
" if (target_date - sds).days >= 0 and (target_date - eds).days <= 0:\n",
|
|
" return True\n",
|
|
" return False\n",
|
|
"\n",
|
|
" \n",
|
|
"trade_date = '20230120'\n",
|
|
"daily_basic_data = pro.daily_basic(ts_code='', trade_date=trade_date)\n",
|
|
"daily_basic_data = daily_basic_data[daily_basic_data['ts_code'] == '002569.SZ']\n",
|
|
"if daily_basic_data is not None and not daily_basic_data.empty:\n",
|
|
" # 添加交易日期列标识\n",
|
|
" daily_basic_data['trade_date'] = trade_date\n",
|
|
" daily_basic_data['is_st'] = daily_basic_data.apply(\n",
|
|
" lambda row: is_st(name_change_dict, row['ts_code'], row['trade_date']), axis=1\n",
|
|
" )\n",
|
|
" \n",
|
|
"print(daily_basic_data[daily_basic_data['ts_code'] == '002569.SZ'][['ts_code', 'trade_date', 'is_st']])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "cf4c9fd5",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 45,
|
|
"id": "4a3638e6",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" ts_code name start_date end_date change_reason\n",
|
|
"0 002569.SZ *ST步森 20250428 None *ST\n",
|
|
"1 002569.SZ ST步森 20200609 None 摘星\n",
|
|
"2 002569.SZ ST步森 20200609 None 摘星\n",
|
|
"3 002569.SZ ST步森 20200609 20250427 摘星\n",
|
|
"4 002569.SZ *ST步森 20190430 None *ST\n",
|
|
"5 002569.SZ *ST步森 20190430 20200608 *ST\n",
|
|
"6 002569.SZ *ST步森 20190430 20200608 *ST\n",
|
|
"7 002569.SZ 步森股份 20110412 20190429 其他\n",
|
|
"8 002569.SZ 步森股份 20110412 20190429 其他\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"df = pro.namechange(ts_code='002569.SZ', fields='ts_code,name,start_date,end_date,change_reason')\n",
|
|
"print(df)"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "new_trader",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.11.11"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|