pands统计
本系列教程采用的数据为上证01号股票数据,感谢Tushare金融社区的数据分享
isnull和notnull:用于检测是否为空值,可用于df和series
dropna:删除缺失值
fillna:填充缺失值
import pandas as pd
df=pd.read_excel('000001.SZ.xlsx',encoding='gbk')
df.set_index('trade_date',inplace=True)
df.head()
| ts_code | open | high | low | close | change | pct_chg | vol | amount | pre_close |
---|
trade_date | | | | | | | | | | |
---|
20160104 | 000001.SZ | 12.00 | 12.03 | 11.23 | 11.33 | -0.66 | -5.50 | 563497.87 | 660376.1531 | 11.99 |
---|
20160105 | 000001.SZ | 11.27 | 11.57 | 11.15 | 11.40 | 0.07 | 0.62 | 663269.95 | 755531.3537 | 11.33 |
---|
20160106 | 000001.SZ | 11.42 | 11.56 | 11.39 | 11.53 | 0.13 | 1.14 | 515706.44 | 591698.5204 | 11.40 |
---|
20160107 | 000001.SZ | 11.41 | 11.41 | 10.91 | 10.94 | -0.59 | -5.12 | 174761.10 | 194869.4935 | 11.53 |
---|
20160108 | 000001.SZ | 11.21 | 11.29 | 10.90 | 11.12 | 0.18 | 1.65 | 747527.58 | 831334.5462 | 10.94 |
---|
汇总类统计
df.describe()
| open | high | low | close | change | pct_chg | vol | amount | pre_close |
---|
count | 1218.000000 | 1218.000000 | 1218.000000 | 1218.000000 | 1218.000000 | 1218.000000 | 1.218000e+03 | 1.218000e+03 | 1218.000000 |
---|
mean | 11.998374 | 12.157094 | 11.856691 | 12.011872 | 0.008112 | 0.077623 | 9.472223e+05 | 1.190617e+06 | 12.003760 |
---|
std | 2.670632 | 2.738598 | 2.605982 | 2.673990 | 0.241713 | 1.867864 | 5.871951e+05 | 8.540574e+05 | 2.667239 |
---|
min | 8.560000 | 8.600000 | 8.450000 | 8.570000 | -1.550000 | -9.974300 | 1.707778e+05 | 1.755915e+05 | 8.570000 |
---|
25% | 9.570000 | 9.700000 | 9.480000 | 9.570000 | -0.100000 | -0.818550 | 5.377827e+05 | 5.597184e+05 | 9.562500 |
---|
50% | 11.205000 | 11.355000 | 11.035000 | 11.210000 | 0.000000 | 0.000000 | 7.969810e+05 | 9.731886e+05 | 11.210000 |
---|
75% | 13.870000 | 14.100000 | 13.660000 | 13.930000 | 0.100000 | 0.880000 | 1.183685e+06 | 1.553497e+06 | 13.927500 |
---|
max | 20.000000 | 20.880000 | 19.590000 | 20.050000 | 1.430000 | 10.035100 | 4.711461e+06 | 7.168653e+06 | 20.050000 |
---|
df['high'].mean()
12.157093596059095
唯一去重和按值计数
一般不用于数值列,而是枚举,分类列
df['ts_code'].unique()
array(['000001.SZ'], dtype=object)
df['ts_code'].value_counts()
000001.SZ 1218
Name: ts_code, dtype: int64
相关系数和协方差
df=df.drop('ts_code',axis=1)
df.head()
| open | high | low | close | change | pct_chg | vol | amount | pre_close |
---|
trade_date | | | | | | | | | |
---|
20160104 | 12.00 | 12.03 | 11.23 | 11.33 | -0.66 | -5.50 | 563497.87 | 660376.1531 | 11.99 |
---|
20160105 | 11.27 | 11.57 | 11.15 | 11.40 | 0.07 | 0.62 | 663269.95 | 755531.3537 | 11.33 |
---|
20160106 | 11.42 | 11.56 | 11.39 | 11.53 | 0.13 | 1.14 | 515706.44 | 591698.5204 | 11.40 |
---|
20160107 | 11.41 | 11.41 | 10.91 | 10.94 | -0.59 | -5.12 | 174761.10 | 194869.4935 | 11.53 |
---|
20160108 | 11.21 | 11.29 | 10.90 | 11.12 | 0.18 | 1.65 | 747527.58 | 831334.5462 | 10.94 |
---|
df.corr()
| open | high | low | close | change | pct_chg | vol | amount | pre_close |
---|
open | 1.000000 | 0.998088 | 0.998606 | 0.996711 | 0.000257 | -0.007285 | 0.325969 | 0.552511 | 0.999211 |
---|
high | 0.998088 | 1.000000 | 0.998166 | 0.998739 | 0.043391 | 0.035916 | 0.357892 | 0.581254 | 0.997335 |
---|
low | 0.998606 | 0.998166 | 1.000000 | 0.998539 | 0.035425 | 0.026793 | 0.317093 | 0.545438 | 0.997856 |
---|
close | 0.996711 | 0.998739 | 0.998539 | 1.000000 | 0.073093 | 0.064621 | 0.342535 | 0.567594 | 0.995907 |
---|
change | 0.000257 | 0.043391 | 0.035425 | 0.073093 | 1.000000 | 0.982789 | 0.196158 | 0.193215 | -0.017345 |
---|
pct_chg | -0.007285 | 0.035916 | 0.026793 | 0.064621 | 0.982789 | 1.000000 | 0.212919 | 0.199264 | -0.024279 |
---|
vol | 0.325969 | 0.357892 | 0.317093 | 0.342535 | 0.196158 | 0.212919 | 1.000000 | 0.955498 | 0.325626 |
---|
amount | 0.552511 | 0.581254 | 0.545438 | 0.567594 | 0.193215 | 0.199264 | 0.955498 | 1.000000 | 0.551521 |
---|
pre_close | 0.999211 | 0.997335 | 0.997856 | 0.995907 | -0.017345 | -0.024279 | 0.325626 | 0.551521 | 1.000000 |
---|
df['high'].corr(df['low'])
0.9981656586604757
pandas缺失值处理
df=pd.read_excel('fraction.xlsx',encoding='utf-8',skiprows=2)
df
| Unnamed: 0 | 姓名 | 科目 | 分数 |
---|
0 | NaN | 小明 | 语文 | 85.0 |
---|
1 | NaN | NaN | 数学 | 90.0 |
---|
2 | NaN | NaN | 英语 | 80.0 |
---|
3 | NaN | NaN | NaN | NaN |
---|
4 | NaN | 小王 | 语文 | 85.0 |
---|
5 | NaN | NaN | 数学 | NaN |
---|
6 | NaN | NaN | 英语 | 90.0 |
---|
7 | NaN | NaN | NaN | NaN |
---|
8 | NaN | 小刚 | 语文 | 80.0 |
---|
9 | NaN | NaN | 数学 | 85.0 |
---|
10 | NaN | NaN | 英语 | 90.0 |
---|
检测空值
df.isnull()
| Unnamed: 0 | 姓名 | 科目 | 分数 |
---|
0 | True | False | False | False |
---|
1 | True | True | False | False |
---|
2 | True | True | False | False |
---|
3 | True | True | True | True |
---|
4 | True | False | False | False |
---|
5 | True | True | False | True |
---|
6 | True | True | False | False |
---|
7 | True | True | True | True |
---|
8 | True | False | False | False |
---|
9 | True | True | False | False |
---|
10 | True | True | False | False |
---|
df['分数'].isnull()
0 False
1 False
2 False
3 True
4 False
5 True
6 False
7 True
8 False
9 False
10 False
Name: 分数, dtype: bool
df.loc[df['分数'].notnull(),:]
| Unnamed: 0 | 姓名 | 科目 | 分数 |
---|
0 | NaN | 小明 | 语文 | 85.0 |
---|
1 | NaN | NaN | 数学 | 90.0 |
---|
2 | NaN | NaN | 英语 | 80.0 |
---|
4 | NaN | 小王 | 语文 | 85.0 |
---|
6 | NaN | NaN | 英语 | 90.0 |
---|
8 | NaN | 小刚 | 语文 | 80.0 |
---|
9 | NaN | NaN | 数学 | 85.0 |
---|
10 | NaN | NaN | 英语 | 90.0 |
---|
删掉全是空值的列
df.dropna(axis=1,how='all',inplace=True)
df.dropna(axis=0,how='all',inplace=True)
df
| 姓名 | 科目 | 分数 |
---|
0 | 小明 | 语文 | 85.0 |
---|
1 | NaN | 数学 | 90.0 |
---|
2 | NaN | 英语 | 80.0 |
---|
4 | 小王 | 语文 | 85.0 |
---|
5 | NaN | 数学 | NaN |
---|
6 | NaN | 英语 | 90.0 |
---|
8 | 小刚 | 语文 | 80.0 |
---|
9 | NaN | 数学 | 85.0 |
---|
10 | NaN | 英语 | 90.0 |
---|
将单个空值填充
df.fillna({'分数':0})
| 姓名 | 科目 | 分数 |
---|
0 | 小明 | 语文 | 85.0 |
---|
1 | NaN | 数学 | 90.0 |
---|
2 | NaN | 英语 | 80.0 |
---|
4 | 小王 | 语文 | 85.0 |
---|
5 | NaN | 数学 | 0.0 |
---|
6 | NaN | 英语 | 90.0 |
---|
8 | 小刚 | 语文 | 80.0 |
---|
9 | NaN | 数学 | 85.0 |
---|
10 | NaN | 英语 | 90.0 |
---|
df['分数']=df['分数'].fillna(0)
df
| 姓名 | 科目 | 分数 |
---|
0 | 小明 | 语文 | 85.0 |
---|
1 | NaN | 数学 | 90.0 |
---|
2 | NaN | 英语 | 80.0 |
---|
4 | 小王 | 语文 | 85.0 |
---|
5 | NaN | 数学 | 0.0 |
---|
6 | NaN | 英语 | 90.0 |
---|
8 | 小刚 | 语文 | 80.0 |
---|
9 | NaN | 数学 | 85.0 |
---|
10 | NaN | 英语 | 90.0 |
---|
df['姓名']=df['姓名'].fillna(method='ffill')
df
| 姓名 | 科目 | 分数 |
---|
0 | 小明 | 语文 | 85.0 |
---|
1 | 小明 | 数学 | 90.0 |
---|
2 | 小明 | 英语 | 80.0 |
---|
4 | 小王 | 语文 | 85.0 |
---|
5 | 小王 | 数学 | 0.0 |
---|
6 | 小王 | 英语 | 90.0 |
---|
8 | 小刚 | 语文 | 80.0 |
---|
9 | 小刚 | 数学 | 85.0 |
---|
10 | 小刚 | 英语 | 90.0 |
---|
df.to_excel('fraction_updated.xlsx',index=False)