python pandas处理股票量化数据:笔记2

有一个同学用我的推荐链接注册了tushare社区帐号https://tushare.pro/register?reg=671815,现在有了170分积分。目前使用数据的频率受限制。不过可以在调试期间通过python控制台获取数据,将数据保存在本地以后使用不用高频率访问tushare数据接口,访问频率限制影响不大。

python 复制代码
>>> data = pro.stock_basic(fields='ts_code,symbol,name,area,industry,list_date,market,is_hs,list_status,exchange,delist_date,curr_type')

>>> type(data)
<class 'pandas.core.frame.DataFrame'>
>>> data
        ts_code  symbol     name  area  ... list_status list_date delist_date is_hs
0     000001.SZ  000001     平安银行    深圳  ...           L  19910403        None     S
1     000002.SZ  000002      万科A    深圳  ...           L  19910129        None     S
2     000004.SZ  000004     国华网安    深圳  ...           L  19910114        None     N
3     000006.SZ  000006     深振业A    深圳  ...           L  19920427        None     S
4     000007.SZ  000007    *ST全新    深圳  ...           L  19920413        None     N
...         ...     ...      ...   ...  ...         ...       ...         ...   ...
5360  873726.BJ  873726     卓兆点胶    江苏  ...           L  20231019        None     N
5361  873806.BJ  873806      云星宇    北京  ...           L  20240111        None     N
5362  873833.BJ  873833     美心翼申    重庆  ...           L  20231108        None     N
5363  920002.BJ  920002     万达轴承  None  ...           L  20240530        None     N
5364  689009.SH  689009  九号公司-WD    北京  ...           L  20201029        None  None

[5365 rows x 12 columns]
>>> data.info
<bound method DataFrame.info of         ts_code  symbol     name  area  ... list_status list_date delist_date is_hs
0     000001.SZ  000001     平安银行    深圳  ...           L  19910403        None     S
1     000002.SZ  000002      万科A    深圳  ...           L  19910129        None     S
2     000004.SZ  000004     国华网安    深圳  ...           L  19910114        None     N
3     000006.SZ  000006     深振业A    深圳  ...           L  19920427        None     S
4     000007.SZ  000007    *ST全新    深圳  ...           L  19920413        None     N
...         ...     ...      ...   ...  ...         ...       ...         ...   ...
5360  873726.BJ  873726     卓兆点胶    江苏  ...           L  20231019        None     N
5361  873806.BJ  873806      云星宇    北京  ...           L  20240111        None     N
5362  873833.BJ  873833     美心翼申    重庆  ...           L  20231108        None     N
5363  920002.BJ  920002     万达轴承  None  ...           L  20240530        None     N
5364  689009.SH  689009  九号公司-WD    北京  ...           L  20201029        None  None

[5365 rows x 12 columns]>
>>> data.describe()
          ts_code  symbol  name  area  ... list_status list_date delist_date is_hs
count        5365    5365  5365  5358  ...        5365      5365           0  5364
unique       5365    5365  5364    32  ...           1      2727           0     3
top     000001.SZ  000001  三维股份    浙江  ...           L  20200727         NaN     N
freq            1       1     2   706  ...        5365        31         NaN  2481

[4 rows x 12 columns]
>>> data.index
RangeIndex(start=0, stop=5365, step=1)
>>> data.columns
Index(['ts_code', 'symbol', 'name', 'area', 'industry', 'market', 'exchange',
       'curr_type', 'list_status', 'list_date', 'delist_date', 'is_hs'],
      dtype='object')
>>> data.shape
(5365, 12)
>>> data.shape[0]
5365
>>> data.shape[1]
12
>>> data.values
array([['000001.SZ', '000001', '平安银行', ..., '19910403', None, 'S'],
       ['000002.SZ', '000002', '万科A', ..., '19910129', None, 'S'],
       ['000004.SZ', '000004', '国华网安', ..., '19910114', None, 'N'],
       ...,
       ['873833.BJ', '873833', '美心翼申', ..., '20231108', None, 'N'],
       ['920002.BJ', '920002', '万达轴承', ..., '20240530', None, 'N'],
       ['689009.SH', '689009', '九号公司-WD', ..., '20201029', None, None]],
      dtype=object)
>>> 
>>> print(data.dtypes)
ts_code        object
symbol         object
name           object
area           object
industry       object
market         object
exchange       object
curr_type      object
list_status    object
list_date      object
delist_date    object
is_hs          object
dtype: object
>>> 

1、DataFrame操作

tushare pro接口返回的数据类型<class 'pandas.core.frame.DataFrame'>

>>> type(data)

<class 'pandas.core.frame.DataFrame'>

从上面可以看到data = pro.stock_basic(fields='ts_code,symbol,name,area,industry,list_date,market,is_hs,list_status,exchange,delist_date,curr_type')返回的数据是[5365 rows x 12 columns]

pandas.DataFrame.info

打印一个DataFrame的简要介绍(index范围、columns的dtype、非空值的数量和内存的使用情况):

DataFrame.info(verbose=None, buf=None, max_cols=None, memory_usage=None, show_counts=None)[source]

verbose(adj 冗长的): bool, optional,决定是否打印完整的摘要, 如果为False,那么会省略一部分

buf: writable buffer, defaults to sys.stdout,,决定将输出发送到哪里,默认情况下, 输出打印到sys.stdout

max_cols: int, optional 从"详细输出"转换为"缩减输出",如果DataFrame的列数超过max_cols,则缩减输出。

memory_usage: bool, str, optional 决定是否应显示DataFrame元素(包括索引)的总内存使用情况,默认情况下为True。True始终显示内存使用情况;False永远不会显示内存使用情况。

show_counts: bool, optional,是否显示非空值的数量,值为True始终显示计数,而值为False则不显示计数

>>> data.info(verbose=True)

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 5365 entries, 0 to 5364

Data columns (total 12 columns):

Column Non-Null Count Dtype


0 ts_code 5365 non-null object

1 symbol 5365 non-null object

2 name 5365 non-null object

3 area 5358 non-null object

4 industry 5358 non-null object

5 market 5365 non-null object

6 exchange 5365 non-null object

7 curr_type 5365 non-null object

8 list_status 5365 non-null object

9 list_date 5365 non-null object

10 delist_date 0 non-null object

11 is_hs 5364 non-null object

dtypes: object(12)

memory usage: 251.5+ KB

>>> data.info(verbose=False)

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 5365 entries, 0 to 5364

Columns: 12 entries, ts_code to is_hs

dtypes: object(12)

memory usage: 251.5+ KB

>>>
>>> print(data.tail())

ts_code symbol name area ... list_status list_date delist_date is_hs

5360 873726.BJ 873726 卓兆点胶 江苏 ... L 20231019 None N

5361 873806.BJ 873806 云星宇 北京 ... L 20240111 None N

5362 873833.BJ 873833 美心翼申 重庆 ... L 20231108 None N

5363 920002.BJ 920002 万达轴承 None ... L 20240530 None N

5364 689009.SH 689009 九号公司-WD 北京 ... L 20201029 None None

[5 rows x 12 columns]

>>> print(data.head())

ts_code symbol name area ... list_status list_date delist_date is_hs

0 000001.SZ 000001 平安银行 深圳 ... L 19910403 None S

1 000002.SZ 000002 万科A 深圳 ... L 19910129 None S

2 000004.SZ 000004 国华网安 深圳 ... L 19910114 None N

3 000006.SZ 000006 深振业A 深圳 ... L 19920427 None S

4 000007.SZ 000007 *ST全新 深圳 ... L 19920413 None N

[5 rows x 12 columns]

>>>

获得DataFrame行索引信息

data.index

# 获得DataFrame列索引信息

data.columns

获得DataFrame的size

data.shape

# 获得DataFrame的行数

data.shape[0]

获得DataFrame的 列数

data.shape[1]

获得DataFrame中的值

data.values

获得DataFrame中列值数据类型

data.dtypes

Pandas describe()

Pandas describe()用于查看一些基本的统计详细信息,例如每列的均值、标准差、最大值、最小值和众数

>>> data.describe()

ts_code symbol name area ... list_status list_date delist_date is_hs

count 5365 5365 5365 5358 ... 5365 5365 0 5364

unique 5365 5365 5364 32 ... 1 2727 0 3

top 000001.SZ 000001 三维股份 浙江 ... L 20200727 NaN N

freq 1 1 2 706 ... 5365 31 NaN 2481

[4 rows x 12 columns]

>>> type(data.describe())

<class 'pandas.core.frame.DataFrame'>

>>>

describe()的输出也是DataFrame

python 复制代码
>>> import pandas as pd
>>> import pdb
>>> 
dict_data={"X":list("abcdef"),"Y":list("defghi"),"Z":list("ghijkl")}
df=pd.DataFrame.from_dict(dict_data)
df.index=["A","B","C","D","E","F"]

>>> df
   X  Y  Z
A  a  d  g
B  b  e  h
C  c  f  i
D  d  g  j
E  e  h  k
F  f  i  l
>>> df.describe()
        X  Y  Z
count   6  6  6
unique  6  6  6
top     a  d  g
freq    1  1  1
>>> 
>>> type(df.describe())
<class 'pandas.core.frame.DataFrame'>
>>> 
>>> # A 行 X 列数据,必须两个数据都输入,否则报错
print(df.at["A","X"]) 
# 第二 行 第二 列数据,序号从0开始
print(df.iat[2,2]) 
a
i
>>>
>>> # 指定行名和列名的方式,和at的用法相同
print(df.loc["A","X"],"\n","*"*20)
 
# 可以完整切片,这是 at 做不到的
print(df.loc[:,"X"],"\n","*"*20)
 
# 可以从某一行开始切片
print(df.loc["B":,"X"],"\n","*"*20)
 
# 可以只切某一列
print(df.loc["B",:],"\n","*"*20)
 
# 和指定上一条代码效果是一样的
print(df.loc["B"],"\n","*"*20)
a 
 ********************
A    a
B    b
C    c
D    d
E    e
F    f
Name: X, dtype: object 
 ********************
B    b
C    c
D    d
E    e
F    f
Name: X, dtype: object 
 ********************
X    b
Y    e
Z    h
Name: B, dtype: object 
 ********************
X    b
Y    e
Z    h
Name: B, dtype: object 
 ********************
>>> 
>>> # 指定行号和列号的方式,和 loc 的用法相同
print(df.iloc[0,0],"\n","*"*20)
 
# 可以完整切片
print(df.iloc[:,0],"\n","*"*20)
 
# 可以从某一行开始切片
print(df.iloc[1:,0],"\n","*"*20)
 
# 可以只切某一列
print(df.iloc[1,:],"\n","*"*20)
 
# 和指定上一条代码效果是一样的
print(df.iloc[1],"\n","*"*20)
a 
 ********************
A    a
B    b
C    c
D    d
E    e
F    f
Name: X, dtype: object 
 ********************
B    b
C    c
D    d
E    e
F    f
Name: X, dtype: object 
 ********************
X    b
Y    e
Z    h
Name: B, dtype: object 
 ********************
X    b
Y    e
Z    h
Name: B, dtype: object 
 ********************
>>>

DataFrame索引数据

at 函数:通过行名和列名来取值

loc函数主要通过 行标签 索引行数据

iloc函数主要通过行号、索引行数据

导出数据

dataframe可以使用to_csv方法方便地导出到csv文件中,如果数据中含有中文,一般encoding指定为"utf-8″,否则导出时程序会因为不能识别相应的字符串而抛出异常,index指定为False表示不用导出dataframe的index数据。

>>> data.to_csv("C:\\Users\\Downloads\\stock.csv", index=False)

>>> data.to_csv("C:\\Users\\Downloads\\stock_indx.csv", index=True)

index为False和True时区别如下

从文件读取数据到pandas

pandas在读取csv文件是通过read_csv这个函数读取

base_data = pd.read_csv("C:\\Users\\Downloads\\stock.csv")

base_data1 = pd.read_csv("C:\\Users\\Downloads\\stock_idx.csv") #比上一个文件多一列

看我发现了什么神奇的宝藏:从零开始用Python实现股票量化交易之小白笔记(1)-CSDN博客

躺平了,照着做吧。

mysql数据库

sql 复制代码
mysql -u root -p
alter user root@localhost identified by 'password';

create database stock;
use stock

CREATE TABLE `stock_basic` (

  `index` int(11) DEFAULT NULL,

  `ts_code` varchar(12) DEFAULT NULL,

  `symbol` varchar(10) DEFAULT NULL,

  `name` varchar(10) DEFAULT NULL,

  `area` varchar(10) DEFAULT NULL,

  `industry` varchar(50) DEFAULT NULL,

  `market` varchar(10) DEFAULT NULL,

  `exchange` varchar(10) DEFAULT NULL,

  `curr_type` varchar(10) DEFAULT NULL,

  `list_status` varchar(5) DEFAULT NULL,

  `list_date` varchar(10) DEFAULT NULL,

  `delist_date` varchar(20) DEFAULT NULL,

  `is_hs` varchar(5) DEFAULT NULL,

  KEY `ix_stock_basic_index` (`index`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `stock_daily_qfq` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `trade_date` varchar(10) DEFAULT '' COMMENT '交易日',
  `ts_code` varchar(12) DEFAULT '' COMMENT '股票代码',
  `open` decimal(10,2) DEFAULT '0.00' COMMENT '开盘价',
  `high` decimal(10,2) DEFAULT '0.00' COMMENT '最高价',
  `low` decimal(10,2) DEFAULT '0.00' COMMENT '最低价',
  `close` decimal(10,2) DEFAULT '0.00' COMMENT '收盘价',
  `pre_close` decimal(10,2) DEFAULT '0.00' COMMENT '昨日收盘价',
  `change` decimal(10,2) DEFAULT '0.00' COMMENT '价格变化',
  `pct_chg` double(16,4) DEFAULT '0.0000' COMMENT '涨跌幅',
  `vol` decimal(10,2) DEFAULT '0.00' COMMENT '成交量(手)',
  `amount` double(16,4) DEFAULT '0.0000' COMMENT '成交额(千元)',
  `turnover_rate` double(16,4) DEFAULT NULL COMMENT '换手率',
  `volume_ratio` decimal(10,2) DEFAULT '0.00' COMMENT '量比',
  `ma5` decimal(10,2) DEFAULT '0.00' COMMENT '五日均线',
  `ma_v_5` decimal(10,2) DEFAULT '0.00' COMMENT '5日指数平均值',
  `ma10` decimal(10,2) DEFAULT '0.00',
  `ma_v_10` decimal(10,2) DEFAULT '0.00',
  `ma30` decimal(10,2) DEFAULT '0.00',
  `ma_v_30` decimal(10,2) DEFAULT '0.00',
  `ma60` decimal(10,2) DEFAULT '0.00',
  `ma_v_60` decimal(10,2) DEFAULT '0.00',
  `ma13` decimal(10,2) DEFAULT '0.00',
  `ma_v_13` decimal(10,2) DEFAULT '0.00',
  `ma21` decimal(10,2) DEFAULT '0.00',
  `ma_v_21` decimal(10,2) DEFAULT '0.00',
  `ma55` decimal(10,2) DEFAULT '0.00',
  `ma_v_55` decimal(10,2) DEFAULT '0.00',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uni_key` (`trade_date`,`ts_code`) USING BTREE,
  KEY `ts_code` (`ts_code`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=203 DEFAULT CHARSET=utf8

mysql> show tables;
+-----------------+
| Tables_in_stock |
+-----------------+
| stock_basic     |
+-----------------+
1 row in set (0.00 sec)

mysql>

quit
相关推荐
义小深几秒前
TensorFlow|咖啡豆识别
人工智能·python·tensorflow
疯一样的码农4 分钟前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
ajsbxi11 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
TeYiToKu31 分钟前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
dsywws34 分钟前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习
进击的六角龙1 小时前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
一只爱好编程的程序猿1 小时前
Java后台生成指定路径下创建指定名称的文件
java·python·数据下载
Aniay_ivy2 小时前
深入探索 Java 8 Stream 流:高效操作与应用场景
java·开发语言·python
gonghw4032 小时前
DearPyGui学习
python·gui
向阳12182 小时前
Bert快速入门
人工智能·python·自然语言处理·bert