在 DataFrame 多列数据中模糊查找匹配数据
作者:互联网
先了解一个 DataFrame 筛选数据的方式
import pandas as pd
# 创建 DataFrame
df = pd.DataFrame(data = [[True, False, False, False],
[False, True, False, False],
[True, True, False, False],
[False, False, True, False]],
columns = list('abcd'))
df
a | b | c | d | |
---|---|---|---|---|
0 | True | False | False | False |
1 | False | True | False | False |
2 | True | True | False | False |
3 | False | False | True | False |
# 任一行中,只有其 a 列的值为 True 时,才会输出
df[df.a]
a | b | c | d | |
---|---|---|---|---|
0 | True | False | False | False |
2 | True | True | False | False |
# 任一行中,只有其 b 列的值为 True 时,才会输出
df[df.b]
a | b | c | d | |
---|---|---|---|---|
1 | False | True | False | False |
2 | True | True | False | False |
# 任一行中,当其 a列 或 b列 的值为 True 时,才会输出
df[df.a | df.b]
a | b | c | d | |
---|---|---|---|---|
0 | True | False | False | False |
1 | False | True | False | False |
2 | True | True | False | False |
# 任一行中,当其 a列 且 b列 的值为 True 时,才会输出
df[df.a & df.b]
a | b | c | d | |
---|---|---|---|---|
2 | True | True | False | False |
了解了以上内容后,剩下的就是如何将数据变为 True 了
用 TuShare 上的指数数据来举个例子。
点击 https://tushare.pro/register?reg=414428 ,免费注册后即可获取 tushare 的 token,就可以下载各种金融数据了。
比如,想设计一个输入框,既可以输入指数代码,也可以输入指数名称,来获取指数日线数据。
那么程序获得输入信息后,如何能方便的在两列数据里匹配到你要的数据呢?
# -*- coding: UTF-8 -*-
#
# 从 tushare.pro 获取指数数据
#
# 数据接口说明 https://tushare.pro/document/2?doc_id=94
# https://tushare.pro/document/2?doc_id=95
#
import tushare as ts
import pandas as pd
# 初始化 tushare 连接
ts.set_token('your_token_code')
pro = ts.pro_api()
市场代码 | 说明 |
---|---|
MSCI | MSCI指数 |
CSI | 中证指数 |
SSE | 上交所指数 |
SZSE | 深交所指数 |
CICC | 中金指数 |
SW | 申万指数 |
OTH | 其他指数 |
# 先获取 TuShare 提供的指数基本信息数据
# 接口说明:https://tushare.pro/document/2?doc_id=94
#
df_index = pd.DataFrame()
mktlist = ['SSE', 'SZSE', 'CSI', 'MSCI', 'SW', 'CICC', 'OTH']
for mkt in mktlist:
if df_index.empty:
df_index = pro.index_basic(market=mkt)
else:
df_index = df_index.append(pro.index_basic(market=mkt))
df_index
ts_code | name | market | publisher | category | base_date | base_point | list_date | |
---|---|---|---|---|---|---|---|---|
0 | 000001.SH | 上证指数 | SSE | 中证公司 | 综合指数 | 19901219 | 100.00 | 19910715 |
1 | 000002.SH | 上证A指 | SSE | 中证公司 | 综合指数 | 19901219 | 100.00 | 19920221 |
2 | 000003.SH | 上证B指 | SSE | 中证公司 | 综合指数 | 19920221 | 100.00 | 19920221 |
3 | 000004.SH | 上证工业类指数 | SSE | 中证公司 | 综合指数 | 19930430 | 1358.78 | 19930503 |
4 | 000005.SH | 上证商业类指数 | SSE | 中证公司 | 综合指数 | 19930430 | 1358.78 | 19930503 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
946 | YCJ006.IB | 银行间综合债券指数(净价) | OTH | 全国银行间拆借中心 | 债券指数 | 20070104 | 1000.00 | 20070104 |
947 | YCJ007.IB | 银行间企业债指数(净价) | OTH | 全国银行间拆借中心 | 债券指数 | 20070104 | 1000.00 | 20070104 |
948 | YCJ008.IB | 银行间中期票据指数(净价) | OTH | 全国银行间拆借中心 | 债券指数 | 20080504 | 1000.00 | 20080504 |
949 | ZNCI.SHF | 上期锌期货价格指数 | OTH | 上海期货交易所 | 商品指数 | 20070810 | 1000.00 | 20161201 |
950 | ZNEI.SHF | 上期锌超额收益指数 | OTH | 上海期货交易所 | 商品指数 | 20070810 | 1000.00 | 20161201 |
9509 rows × 8 columns
利用 pandas.Series.str.contains 进行模糊匹配
pandas.Series.str.contains 返回值是 Boolean 型
-
访问 pandas documentation,请注意选择你所使用的 pandas 版本
# 比如匹配 df_index['ts_code'] 中包含字符串 "00000" 的数据
#
df_index.ts_code.str.contains('00000', case=False)
0 True
1 True
2 True
3 True
4 True
...
946 False
947 False
948 False
949 False
950 False
Name: ts_code, Length: 9509, dtype: bool
# 也可以用正则表达式作为输入,比如以 "96" 开头的代码
# 为了突出数据的选择结果,输出匹配筛选出的数据
#
df_index[df_index.ts_code.str.contains('^96', case=False)]
ts_code | name | market | publisher | category | base_date | base_point | list_date | |
---|---|---|---|---|---|---|---|---|
3193 | 960400.MI | MSCI秘鲁 | MSCI | MSCI | 规模指数 | 19921231 | 100.0 | None |
3194 | 961600.MI | MSCI波兰 | MSCI | MSCI | 规模指数 | 19921231 | 100.0 | None |
3195 | 962000.MI | MSCI葡萄牙 | MSCI | MSCI | 规模指数 | 19871231 | 100.0 | None |
# 比如以 "h" 结尾的代码。 case=False 可以忽略大小写检查
#
df_index[df_index.ts_code.str.contains('h$', case=False)]
ts_code | name | market | publisher | category | base_date | base_point | list_date | |
---|---|---|---|---|---|---|---|---|
0 | 000001.SH | 上证指数 | SSE | 中证公司 | 综合指数 | 19901219 | 100.00 | 19910715 |
1 | 000002.SH | 上证A指 | SSE | 中证公司 | 综合指数 | 19901219 | 100.00 | 19920221 |
2 | 000003.SH | 上证B指 | SSE | 中证公司 | 综合指数 | 19920221 | 100.00 | 19920221 |
3 | 000004.SH | 上证工业类指数 | SSE | 中证公司 | 综合指数 | 19930430 | 1358.78 | 19930503 |
4 | 000005.SH | 上证商业类指数 | SSE | 中证公司 | 综合指数 | 19930430 | 1358.78 | 19930503 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
621 | SCH072D.SCH | 上清所5-7年信用债综合指数(净价) | OTH | 上海清算所 | 债券指数 | 20161226 | 100.00 | 20161226 |
622 | SCH07A.SCH | 上清所0-1年信用债综合指数 | OTH | 上海清算所 | 债券指数 | 20161226 | 100.00 | 20161226 |
623 | SCH07B.SCH | 上清所1-3年信用债综合指数 | OTH | 上海清算所 | 债券指数 | 20161226 | 100.00 | 20161226 |
624 | SCH07C.SCH | 上清所3-5年信用债综合指数 | OTH | 上海清算所 | 债券指数 | 20161226 | 100.00 | 20161226 |
625 | SCH07D.SCH | 上清所5-7年信用债综合指数 | OTH | 上海清算所 | 债券指数 | 20161226 | 100.00 | 20161226 |
724 rows × 8 columns
下面用同样代码试试指数代码输入和指数名称输入
先输入指数代码试试
# 输入
input_string = input('输入指数代码或指数名称:').strip()
输入指数代码或指数名称:39996
# 在指数代码和指数名称这两列数据中进行模糊匹配
#
df_info = df_index[df_index.ts_code.str.contains(input_string, case=False) | df_index.name.str.contains(input_string, case=False)]
df_info
ts_code | name | market | publisher | category | base_date | base_point | list_date | |
---|---|---|---|---|---|---|---|---|
390 | 399960.SZ | 中证龙头 | SZSE | 中证公司 | 主题指数 | 20041231 | 1000.0 | 20100209 |
391 | 399961.SZ | 中证上游 | SZSE | 中证公司 | 主题指数 | 20041231 | 1000.0 | 20100416 |
392 | 399962.SZ | 中证中游 | SZSE | 中证公司 | 主题指数 | 20041231 | 1000.0 | 20100416 |
393 | 399963.SZ | 中证下游 | SZSE | 中证公司 | 主题指数 | 20041231 | 1000.0 | 20100416 |
394 | 399964.SZ | 中证新兴 | SZSE | 中证公司 | 主题指数 | 20041231 | 1000.0 | 20100430 |
395 | 399965.SZ | 中证800地产 | SZSE | 中证公司 | 二级行业指数 | 20041231 | 1000.0 | 20140404 |
396 | 399966.SZ | 中证800证保 | SZSE | 中证公司 | 主题指数 | 20041231 | 1000.0 | 20140404 |
397 | 399967.SZ | 中证军工 | SZSE | 中证公司 | 主题指数 | 20041231 | 1000.0 | 20131226 |
398 | 399968.SZ | 300周期 | SZSE | 中证公司 | 主题指数 | 20041231 | 1000.0 | 20100528 |
399 | 399969.SZ | 300非周 | SZSE | 中证公司 | 主题指数 | 20041231 | 1000.0 | 20100528 |
再输入指数名称试试
# 输入
input_string = input('输入指数代码或指数名称:').strip()
输入指数代码或指数名称:中小
# 在指数代码和指数名称这两列数据中进行模糊匹配
#
df_info = df_index[df_index.ts_code.str.contains(input_string, case=False) | df_index.name.str.contains(input_string, case=False)]
df_info
ts_code | name | market | publisher | category | base_date | base_point | list_date | |
---|---|---|---|---|---|---|---|---|
43 | 000046.SH | 上证中小 | SSE | 中证公司 | 规模指数 | 20031231 | 1000.0 | 20090703 |
78 | 000091.SH | 沪财中小 | SSE | 中证公司 | 主题指数 | 20041231 | 1000.0 | 20110406 |
197 | 000867.SH | 港中小企 | SSE | 中证公司 | 主题指数 | 20141114 | 3000.0 | 20150826 |
330 | h00046.SH | 上证中小全收益 | SSE | 中证公司 | 规模指数 | 20031231 | 1000.0 | 20090703 |
365 | h00091.SH | 沪财中小全收益 | SSE | 中证公司 | 主题指数 | 20041231 | 1000.0 | 20110406 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
3056 | 711068L.MI | 全球市场大中小盘(含部分A股)(人民币) | MSCI | MSCI | 其他 | None | NaN | None |
3091 | 718874.MI | MSCI中国全股中小盘 | MSCI | MSCI | 规模指数 | None | NaN | None |
3092 | 718875.MI | MSCI中国A股国际中小盘 | MSCI | MSCI | 规模指数 | None | NaN | None |
1 | 801002.SI | 申万中小板 | SW | 申万研究 | 其他 | 20040705 | 1000.0 | None |
874 | SPHCMSHP.SPI | 标普香港上市中国中小盘精选指数 | OTH | 标准普尔公司 | 其他 | None | NaN | None |
482 rows × 8 columns
有了指数代码,就可以获得指数日线数据了
# 获取指数日线数据
#
index_code = df_info.iloc[0]['ts_code']
df = pro.index_daily(ts_code=index_code)
df.rename(columns={'vol': 'vol(手)', 'amount': 'amount(千元)'}, inplace=True)
df
ts_code | trade_date | close | open | high | low | pre_close | change | pct_chg | vol(手) | amount(千元) | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 000046.SH | 20210430 | 4460.1521 | 4482.3029 | 4482.3029 | 4431.3803 | 4502.2544 | -42.1023 | -0.9351 | 1.531943e+08 | 1.799518e+08 |
1 | 000046.SH | 20210429 | 4502.2544 | 4486.1959 | 4507.0311 | 4466.0925 | 4486.3473 | 15.9071 | 0.3546 | 1.327776e+08 | 1.583016e+08 |
2 | 000046.SH | 20210428 | 4486.3473 | 4443.2279 | 4486.3473 | 4430.3921 | 4450.5305 | 35.8168 | 0.8048 | 1.131329e+08 | 1.410433e+08 |
3 | 000046.SH | 20210427 | 4450.5305 | 4446.0362 | 4460.2883 | 4412.1065 | 4449.3180 | 1.2125 | 0.0273 | 1.191778e+08 | 1.397632e+08 |
4 | 000046.SH | 20210426 | 4449.3180 | 4490.2266 | 4526.9774 | 4446.6732 | 4479.6079 | -30.2899 | -0.6762 | 1.350744e+08 | 1.692510e+08 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
3963 | 000046.SH | 20050110 | 835.8030 | 828.6420 | 835.8030 | 825.4270 | 829.3040 | 6.4990 | 0.7837 | 3.249806e+06 | 2.089842e+06 |
3964 | 000046.SH | 20050107 | 829.3040 | 825.9590 | 838.8730 | 824.4510 | 826.8970 | 2.4070 | 0.2911 | 4.056519e+06 | 2.608160e+06 |
3965 | 000046.SH | 20050106 | 826.8970 | 834.6070 | 834.6070 | 824.4180 | 834.2200 | -7.3230 | -0.8778 | 3.561436e+06 | 2.180104e+06 |
3966 | 000046.SH | 20050105 | 834.2200 | 822.2770 | 836.8670 | 821.9170 | 822.6860 | 11.5340 | 1.4020 | 3.827764e+06 | 2.440814e+06 |
3967 | 000046.SH | 20050104 | 822.6860 | 832.4610 | 832.4610 | 821.3520 | NaN | NaN | NaN | 2.765870e+06 | 1.752842e+06 |
3968 rows × 11 columns
点击 https://tushare.pro/register?reg=414428 ,免费注册后即可获取 tushare 的 token,就可以下载各种金融数据了。
标签:index,中证,指数,df,ts,DataFrame,False,多列,数据 来源: https://blog.csdn.net/hamagudu/article/details/116308173