注意:内部操作(包括plot)不用写pd,格式为x.函数名(参数)
DataFrame的基本性质
import pandas as pd
HS300=pd.read_excel('沪深300指数(2018年).xlsx',header=0,index_col=0)
HS300.describe()
Out[4]:
开盘点位 最高点位 最低点位 收盘点位
count 243.000000 243.000000 243.000000 243.000000
mean 3605.910629 3633.511737 3576.081525 3605.809573
std 379.357328 378.562382 380.805563 380.883948
min 2994.795000 3024.352500 2964.875000 2990.505700
25% 3259.739050 3281.134050 3227.896000 3265.065300
50% 3521.587600 3541.782000 3478.213400 3517.656800
75% 3897.636750 3921.321600 3875.582550 3898.566550
max 4389.454700 4403.337500 4351.487100 4389.885300
HS300.index#索引名,注意是没有括号的
Out[8]:
DatetimeIndex(['2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05',
'2018-01-08', '2018-01-09', '2018-01-10', '2018-01-11',
'2018-01-12', '2018-01-15',
...
'2018-12-17', '2018-12-18', '2018-12-19', '2018-12-20',
'2018-12-21', '2018-12-24', '2018-12-25', '2018-12-26',
'2018-12-27', '2018-12-28'],
dtype='datetime64[ns]', name='日期', length=243, freq=None)
HS300.columns#列名,也没有括号
Out[10]: Index(['开盘点位', '最高点位', '最低点位', '收盘点位'], dtype='object')
HS300['收盘点位'].unique()#此列的值的种类
HS300['收盘点位'].value_counts()#每一种值出现的次数汇总
DataFrame的索引与切片
HS300.loc[['2018-12-18'],['开盘点位']]#根据行、列索引名称找出对应数据
Out[5]:
开盘点位
日期
2018-12-18 3139.9493
Name: 2018-12-18 00:00:00, dtype: float64
HS300.iloc[7:13,1:3]#根据具体第几行(和第几列)找出数据
Out[12]:
最高点位 最低点位
日期
2018-01-11 4211.7990 4181.9572
2018-01-12 4227.3923 4199.0251
2018-01-15 4262.9314 4216.3585
2018-01-16 4260.2118 4213.1275
2018-01-17 4283.3449 4230.5367
2018-01-18 4292.6372 4246.6840
HS300[(HS300['开盘点位']>=4100)&(HS300.收盘点位<=4200)]
#不同的筛选条件要用圆括号括起来,并用&相连。有两种表示方法
Out[15]:
开盘点位 最高点位 最低点位 收盘点位
日期
2018-01-04 4114.1213 4137.6420 4105.8858 4128.8119
2018-01-05 4133.3439 4151.2818 4123.2817 4138.7505
2018-01-08 4140.8545 4166.3182 4127.3081 4160.1595
2018-01-09 4157.5394 4191.2843 4153.5021 4189.2977
2018-02-06 4182.3257 4211.5234 4131.5562 4148.8856
2018-02-07 4205.7365 4212.5677 4048.4228 4050.4972
2018-02-27 4120.8712 4120.8712 4051.8054 4058.9806
2018-03-12 4130.7082 4139.5259 4112.7658 4127.6662
2018-03-13 4124.3312 4130.2829 4087.5629 4091.2533
DataFrame的排序
HS300.sort_index(ascending=True)#按照行索引的升序排列,axis=0
Out[18]:
开盘点位 最高点位 最低点位 收盘点位
日期
2018-01-02 4045.2086 4087.7789 4045.2086 4087.4012
2018-01-03 4091.4607 4140.0543 4088.7302 4111.3925
2018-01-04 4114.1213 4137.6420 4105.8858 4128.8119
2018-01-05 4133.3439 4151.2818 4123.2817 4138.7505
HS300.sort_values(by="最高点位",ascending=False)
#按照“最高点位”列的数值大小降序排列
Out[19]:
开盘点位 最高点位 最低点位 收盘点位
日期
2018-01-26 4352.2211 4403.3375 4351.4871 4381.2996
2018-01-24 4389.4547 4397.8196 4349.0865 4389.8853
2018-01-29 4387.0577 4395.9053 4287.1124 4302.0181
2018-01-25 4381.9768 4392.1963 4336.2386 4365.0794
2018-01-23 4346.8885 4383.5722 4346.7925 4382.6129
DataFrame的修改和删除
close=pd.read_csv('C:/Users/lenovo/Desktop/quantitative investment/close.csv',encoding='gb18030');close
Out[22]:
ticker secShortName tradeDate closePrice
0 1 平安银行 2017/6/20 9.12
1 2 万科A 2017/6/20 21.03
2 4 国农科技 2017/6/20 NaN
3 5 世纪星源 2017/6/20 5.45
4 6 深振业A 2017/6/20 8.87
5 7 全新好 2017/6/20 15.87
close2=close.rename(columns={'ticker':'序号'});close2#修改第二列列名,格式与字典相同
Out[24]:
序号 secShortName tradeDate closePrice
0 1 平安银行 2017/6/20 9.12
1 2 万科A 2017/6/20 21.03
2 4 国农科技 2017/6/20 NaN
3 5 世纪星源 2017/6/20 5.45
4 6 深振业A 2017/6/20 8.87
5 7 全新好 2017/6/20 15.87
a=close2.drop(['序号'],axis=1);a#删除“序号”列,删的是列,axis=1一定要写
#直接del close2['序号']也可达到同样效果
Out[25]:
secShortName tradeDate closePrice
0 平安银行 2017/6/20 9.12
1 万科A 2017/6/20 21.03
2 国农科技 2017/6/20 NaN
3 世纪星源 2017/6/20 5.45
4 深振业A 2017/6/20 8.87
5 全新好 2017/6/20 15.87
b=close2.drop(close2[close2.closePrice>10].index);b#删掉符合条件的行
Out[27]:
序号 secShortName tradeDate closePrice
0 1 平安银行 2017/6/20 9.12
2 4 国农科技 2017/6/20 NaN
3 5 世纪星源 2017/6/20 5.45
4 6 深振业A 2017/6/20 8.87
DataFrame的缺失值和重复值处理
注意:isnull()和duplicated()函数返回的是布尔值
close2[close2['closePrice'].isnull()]#找出closeprice列有缺失值的行
Out[27]:
序号 secShortName tradeDate closePrice
2 4 国农科技 2017/6/20 NaN
a=close2.dropna();a#删除有缺失值行
Out[28]:
序号 secShortName tradeDate closePrice
0 1 平安银行 2017/6/20 9.12
1 2 万科A 2017/6/20 21.03
3 5 世纪星源 2017/6/20 5.45
4 6 深振业A 2017/6/20 8.87
5 7 全新好 2017/6/20 15.87
b=close2.fillna(value=close2.closePrice.mean());b#用均值填充缺失值
Out[29]:
序号 secShortName tradeDate closePrice
0 1 平安银行 2017/6/20 9.120
1 2 万科A 2017/6/20 21.030
2 4 国农科技 2017/6/20 12.068
3 5 世纪星源 2017/6/20 5.450
4 6 深振业A 2017/6/20 8.870
5 7 全新好 2017/6/20 15.870
c=close2.fillna(method='ffill');c#用缺失值所在列的前一个非NaN值填充;反之method=bfill
Out[30]:
序号 secShortName tradeDate closePrice
0 1 平安银行 2017/6/20 9.12
1 2 万科A 2017/6/20 21.03
2 4 国农科技 2017/6/20 21.03
3 5 世纪星源 2017/6/20 5.45
4 6 深振业A 2017/6/20 8.87
5 7 全新好 2017/6/20 15.87
close2[close2.duplicated()]#找出重复行,本例无重复
Out[31]:
Empty DataFrame
Columns: [序号, secShortName, tradeDate, closePrice]
Index: []
close2.drop_duplicates()#删除重复行(保留最先出现的)
DataFrame之间的操作
concat
1、pd.concat([数据框1,…,数据框n],axis=0或1),并集拼接,不考虑重复值;
2、若拼接时某行或者某列在其他数据框中没有,则此位置数据输出NaN
c=pd.concat([a,b],axis=0);c#按行拼接
Out[40]:
序号 secShortName tradeDate closePrice
0 1 平安银行 2017/6/20 9.120
1 2 万科A 2017/6/20 21.030
3 5 世纪星源 2017/6/20 5.450
4 6 深振业A 2017/6/20 8.870
5 7 全新好 2017/6/20 15.870
0 1 平安银行 2017/6/20 9.120
1 2 万科A 2017/6/20 21.030
2 4 国农科技 2017/6/20 12.068
3 5 世纪星源 2017/6/20 5.450
4 6 深振业A 2017/6/20 8.870
5 7 全新好 2017/6/20 15.870
merge
1、pd.merge(a,b,how,on,left_on=‘a’,right_on=‘A’,left_index=True,right_index=True,…);
2、how分别可选"left/right/inner/outer",即按照左/右边数据框连接、交集(默认)、并集。具体见下例;
3、on表示按照哪一列作为合并的键,此列在两个表中都有;
4、left_on=‘a’,right_on='A’表示可能两个表没有相同的列名,但a和A列其实是一个东西,比如‘stockid’和‘股票代码’;
5、left_index=True,right_index=True表示合并索引。
data1=pd.DataFrame(np.arange(6).reshape(2,3),columns=list('abc'))
data2=pd.DataFrame(np.arange(20,26).reshape(2,3),columns=list('ayz'))
data1
Out[46]:
a b c
0 0 1 2
1 3 4 5
data2
Out[47]:
a y z
0 20 21 22
1 23 24 25
pd.merge(data1,data2,how='left')#以左数据框的数据为准
Out[48]:
a b c y z
0 0 1 2 NaN NaN
1 3 4 5 NaN NaN
pd.merge(data1,data2,how='right')
Out[49]:
a b c y z
0 20 NaN NaN 21 22
1 23 NaN NaN 24 25
pd.merge(data1,data2,how='inner')
Out[51]:
Empty DataFrame
Columns: [a, b, c, y, z]
Index: []
pd.merge(data1,data2,how='outer')
Out[52]:
a b c y z
0 0 1.0 2.0 NaN NaN
1 3 4.0 5.0 NaN NaN
2 20 NaN NaN 21.0 22.0
3 23 NaN NaN 24.0 25.0
pd.merge(data1,data2,how='outer',left_index=True,right_index=True)
#合并了索引,因为两个数据框都有a列,因此重命名了
Out[59]:
a_x b c a_y y z
0 0 1 2 20 21 22
1 3 4 5 23 24 25
data3=pd.DataFrame(np.arange(6).reshape(2,3),columns=['a1','y','z'])
pd.merge(data1,data3,left_on='a',right_on="a1")
Out[67]:
a b c a1 y z
0 0 1 2 0 1 2
1 3 4 5 3 4 5
join
1、a.join(b, on=None, how=’left默认’, lsuffix=”, rsuffix=”,…),注意没有pd;
2、参数与merge类似,lsuffix表示左数据框中重复列的后缀,rsuffix为右,有相同列时必填;
3、b的关键列是index,可使用set_index()改变,具体见下例。
a=pd.DataFrame({'key':['K0', 'K1', 'K2', 'K3', 'K4', 'K5'], 'A':['A0', 'A1', 'A2', 'A3', 'A4', 'A5']})
b=pd.DataFrame({'key':['K0', 'K1', 'K2','K3'], 'B':['B0', 'B1', 'B2', 'B3']})
a
Out[70]:
key A
0 K0 A0
1 K1 A1
2 K2 A2
3 K3 A3
4 K4 A4
5 K5 A5
b
Out[71]:
key B
0 K0 B0
1 K1 B1
2 K2 B2
3 K3 B3
a.join(b,lsuffix='_a', rsuffix='_b')#对相同的列加后缀区分
Out[75]:
key_a A key_b B
0 K0 A0 K0 B0
1 K1 A1 K1 B1
2 K2 A2 K2 B2
3 K3 A3 K3 B3
4 K4 A4 NaN NaN
5 K5 A5 NaN NaN
a.join(b.set_index('key'), on='key')
#先把指定的列key设置为b的索引,再用on,这点与merge不同。且默认how=left=a
Out[77]:
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 B2
3 K3 A3 B3
4 K4 A4 NaN
5 K5 A5 NaN
pd.merge(a,b,how="left",on='key')
Out[78]:
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 B2
3 K3 A3 B3
4 K4 A4 NaN
5 K5 A5 NaN