pandas 学习笔记 以下仅个人学习记录如有引用就说明出处
## 1.安装pandas
python ide可以pip 安装,把下面的代码第一行改为当前电脑上的python的安装目录再拷贝到TXT文件中保存为bat文件后直接点击运行
cd C:\Program Files\Python38
python -m pip install --upgrade pip
python -m pip install numpy
python -m pip install pandas
说明:第一行为运行到python目录,第二行为升级本地pip版本,下面两行为安装模块
## 2.pandas 结构:
pandas 的结构核心为Series和DataFrame
Series 为一维数组,和numpy的数据结构一样一个数组内只能有一各数据类型,不能同时有两个或两个以上的数据类型。如:只能是int,str,float中的一个,这样的好处是可以提高访问速度
Times-Series:以时间为索引的Series
DataFrame 二维的Series
## 3.Series 的创建:
3.1通过一维数组创建:
```python
#! /user/bin/env python
#_*_coding:utf-8 -*_
#__author__ = '株洲市易美智能工程有限责任公司'
#Email:[email protected]
import numpy as np
import pandas as pd
series = pd.Series([x for x in range(10,20,1)],index = None)#列表推导式创建数组
# series = pd.Series(['A','B','C','D'],index = [x for x in range(4)])#列表创建
print(series,series.dtype)
```
创建二选一就可以了,后面的index可以省略,如果省略的话就默认就是None
输出就不写了
3.2 字典方式创建:
```python
#! /user/bin/env python
#_*_coding:utf-8 -*_
#__author__ = '株洲市易美智能工程有限责任公司'
#Email:[email protected]
import numpy as np
import pandas as pd
series = pd.Series({'A':[x for x in range(5)],'B':[x for x in range(20,30,2)]})
print(series)
```
## 4.DataFrame的创建:
DataFrame是一个表格式的结构,我认为和XLS有点象
DataFrame每一行和每一列都是一个Series
DataFrame的创建:
4.1通过二维数组创建:
```python
#! /user/bin/env python
#_*_coding:utf-8 -*_
#__author__ = '株洲市易美智能工程有限责任公司'
#Email:[email protected]
import numpy as np
import pandas as pd
Data = pd.DataFrame(np.array(np.arange(100).reshape(20,-1)))
print(Data)
```
4.2 通过字典方式创建
```python
#! /user/bin/env python
#_*_coding:utf-8 -*_
#__author__ = '株洲市易美智能工程有限责任公司'
#Email:[email protected]
import numpy as np
import pandas as pd
Data = pd.DataFrame({'A':[x for x in range(10)],'B':['A',True,'C','D',88,'F','G','H','I',5]})
print(Data)
```
这里在创建时并不要求是同一个数据类型但必须各列是一样的长度
## 5.股票列表的导入
5.1导入聚宽数据
安装jqdatasdk
先安装anadonda和get,再打开anadonda promt et cd定位到anaconda 的目录
再拷贝以下代码运行
```python
pip install git+https://github.com/JoinQuant/jqdatasdk.git -i https://mirrors.aliyun.com/pypi/simple/
```
```python
#! /user/bin/env python
#_*_coding:utf-8 -*_
#__author__ = '株洲市易美智能工程有限责任公司'
#Email:[email protected]
import numpy as np
import pandas as pd
import jqdatasdk as jq
x = jq.auth('***********','******')#导入账号密码
data = jq.get_price('000001.XSHE',start_date = '2020-01-01',end_date = '2020-02-29')#查询代码000001,从2020-01-01 到了2020-02-29的数据
```
获取股票数据的sdk 有QUANTAXIS,baostock,Tushare,OpenDataTools等
## 6.DataFrame操作
```python
**这个代码在使用时请确定哪一行要用哪一行不要用,否则报错**
#! /user/bin/env python
#_*_coding:utf-8 -*_
#__author__ = '株洲市易美智能工程有限责任公司'
#Email:[email protected]
import pandas as pd
import numpy as np
import jqdatasdk as jq
x = jq.auth('1887318','00aa')
data = jq.get_price('000001.XSHE',start_date = '2020-01-01',end_date = '2020-02-29')
# for x in data.columns:
print(x, end = ' ') #列出所有的列名
print('\n')
print(data[['close','high']].head(n= 15)) #查看多列的前15行数据,如果n = 15不写默认为5
print(data.close.tail(n = 15))#查看单列的后15个数据,如果n = 15不写默认为5
print(data.index)#输出所有的行名
data = data.T #行列翻转
data.columns = ['a','b','c','d','e','f']#列名改名,如果是这样改的话要所有列名要在列表内,否则报错
data = data.rename(columns = {'open':'o'})#列改名,如果只要改一个要做成字典
Series = data.open #把open行改为Series
data1 = data.copy()#复制DataFrame,这个只是简单的复制,如果有一个数据改变另外一个同时改变
print(data)
data2 = data[['open','close']]#这个列深层的切片,源数据改变不影响另一个,如果这个是只有用一对[]的话返回Series且不支持两个或以上的
# columns也不是深度拷贝
data3 = data['2020-02-07':'2020-02-17']
data3 = data[1:5]#DataFrame 行切片可以用行名和行序号,切片方法如果是行名的话两头都包括,如果是序列的话只包前不包后
data4 = data.iloc[0:5,0:15]#iloc,为index locate 用index索引进行定位,所以参数是整型,索引会在范围内寻找,
# 如果没有的话会忽略为空
data5 = data.loc['2020-01-02':'2020-03-12','open':'low']#loc 为columns索引参数必须为columns,如果是数字索引基本结构
# 必须保持不要求精确,DataFrame会在这个范围内寻找,如果是字母索引必须是正确的索引号,否则报错
data6 = data[1:5]#这种方式只能行索引切片
data7= data.iat[3,1]#这个iat 和上面的iloc的i是一样的为index
***data8 = data.at[5,'open']#这个at按理前面是index 后面是columns不知哪里不对***
data9 = data[data.colose <16] #按条件取行,返回所有符合条件的行
**这个代码在使用时请确定哪一行要用哪一行不要用,否则报错**
```
## DataFrame sort
```python
#! /user/bin/env python
#_*_coding:utf-8 -*_
#__author__ = '株洲市易美智能工程有限责任公司'
#Email:[email protected]
import pandas as pd
import numpy as np
import jqdatasdk as jq
jq.auth('1887','0aa')
data = jq.get_price('000001.XSHE',start_date = '2020-01-01',end_date = '2020-02-29')
data1 = data.sort_values(by = ['close','open'],ascending= [True,False])#排序,close 对应True,open对应False,
# 这个排序方式是先用close 以升序排列再用open以降序排列,axis没写默认行排列
```
## DataFrame 插入删除列
```
#! /user/bin/env python
#_*_coding:utf-8 -*_
#__author__ = '株洲市易美智能工程有限责任公司'
#Email:[email protected]
import pandas as pd
import numpy as np
import jqdatasdk as jq
x = jq.auth('188718','0a')
data = jq.get_price('000001.XSHE',start_date = '2020-01-01',end_date = '2020-02-29')
data.insert(0,'aa',1) #插入列数据,前机的0为列序号,aa为列的columns,1为要插入的值,这个1可以为列表,
# 但列表的长度必须为DataFrame的列长度一至,要手入的值如果为一个值的话这个值会全列都是这一个值,如果是列表的话会按序号填充
data.insert(0,'inster',np.arange(len(data))) #插入列表
del data['close']#删除整列
data3 =data.drop('open',axis = 1)#返回删除的数据,对原数据没有影响
```