学习笔记

数据的高级处理——Pandas模块进阶

import pandas as pd
'''Pandas模块的进阶用法,包括数据的查找、替换、插入、删除、排序、筛选、运算,以及数据表的结构转换和拼接等'''


print('------------数据的查找和替换------------------')
'''pandas模块中的isin()函数可以查看DataFrame是否包含某个值,
会输出一个原DataFrame格式的内容,然后若是包含查找的值,就在对应的位置显示True,否则显示False
查找的值必须与单元格中的值完全相等才显示True'''
data=pd.read_excel('1.xlsx')
print(data)
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)
0     810  创维数字  25.21   1.941
1  600256  广汇能源  12.50   7.852
2    2444  巨星科技  27.02  -0.111
3    2416   爱施德  10.44  -0.287
4  601155  新城控股  21.51   4.114
5    2831  裕同科技  30.19   2.757
6    1914  招商积余  17.50   1.449
7  603979   金诚信  21.25   7.378
8    2372  伟星新材  20.72   5.445
9  600153  建发股份  11.48   2.226'''
print('---')
data1=data.isin(['00','招商积余','创维数字','能源'])
print(data1)
'''
    股票代码   股票简称  现价(元)  涨跌幅(%)
0  False   True  False   False
1  False  False  False   False
2  False  False  False   False
3  False  False  False   False
4  False  False  False   False
5  False  False  False   False
6  False   True  False   False
7  False  False  False   False
8  False  False  False   False
9  False  False  False   False'''


print('---')
'''isin()函数可以单独用来查找,DataFrame中某一列是否包含某个值
比如在股票简称那一列中查找是否包含招商积余'''
data2=data['股票简称'].isin(['招商积余'])
print(data2)
'''
0    False
1    False
2    False
3    False
4    False
5    False
6     True
7    False
8    False
9    False
Name: 股票简称, dtype: bool'''



print('-----------------替换数据-----------------------')
'''如果需要将数据表中单个或多个值替换成其他值,可以使用pandas模块中的replace()函数来完成。
该函数可以对数据表中的数据进行一对一替换,多对一替换和多对多替换'''

'''一对一替换是指将数据表中的某个值全部替换成另一个值
replace()函数默认情况下不会对源数据表进行替换操作,而是用替换操作的结果生成一个新的数据表
如果想要对原数据表进行操作,需要加入参数inplace=True
'''
data=pd.read_excel('1.xlsx')
data.replace('建发股份','替换内容',inplace=True)
print(data)
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)
0     810  创维数字  25.21   1.941
1  600256  广汇能源  12.50   7.852
2    2444  巨星科技  27.02  -0.111
3    2416   爱施德  10.44  -0.287
4  601155  新城控股  21.51   4.114
5    2831  裕同科技  30.19   2.757
6    1914  招商积余  17.50   1.449
7  603979   金诚信  21.25   7.378
8    2372  伟星新材  20.72   5.445
9  600153  替换内容  11.48   2.226'''

print('---')
'''多对一替换是指把数据表中的多个值替换为某一个值'''
data=pd.read_excel('1.xlsx')
data.replace(['伟星新材','建发股份'],'替换测试',inplace=True)
print(data)
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)
0     810  创维数字  25.21   1.941
1  600256  广汇能源  12.50   7.852
2    2444  巨星科技  27.02  -0.111
3    2416   爱施德  10.44  -0.287
4  601155  新城控股  21.51   4.114
5    2831  裕同科技  30.19   2.757
6    1914  招商积余  17.50   1.449
7  603979   金诚信  21.25   7.378
8    2372  替换测试  20.72   5.445
9  600153  替换测试  11.48   2.226'''


print('---')
'''多对多替换可以看成是多个一对一替换,写法类似于字典的键与值'''
data=pd.read_excel('1.xlsx')
data.replace({'创维数字':'替换1','伟星新材':'替换2','建发股份':'替换3'},inplace=True)
print(data)
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)
0     810   替换1  25.21   1.941
1  600256  广汇能源  12.50   7.852
2    2444  巨星科技  27.02  -0.111
3    2416   爱施德  10.44  -0.287
4  601155  新城控股  21.51   4.114
5    2831  裕同科技  30.19   2.757
6    1914  招商积余  17.50   1.449
7  603979   金诚信  21.25   7.378
8    2372   替换2  20.72   5.445
9  600153   替换3  11.48   2.226'''



print('------------------数据的处理-----------------------------')
#常用的数据的处理包括数据的插入和删除、缺失值和重复值的处理、数据的排序和筛选等

print('--------------插入数据------------------')
'''pandas模块没有专门提供插入行的方法,因此,插入数据主要是指插入一列新的数据。
常用的方法有2种:
第一种是以赋值的方式在数据表的最右侧插入列数据
第二种是用insert()函数在数据表的指定位置插入列数据'''

data=pd.read_excel('1.xlsx')
data['插入测试']=[1,1,1,1,1,1,1,1,1,2]
print(data)
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)  插入测试
0     810  创维数字  25.21   1.941     1
1  600256  广汇能源  12.50   7.852     1
2    2444  巨星科技  27.02  -0.111     1
3    2416   爱施德  10.44  -0.287     1
4  601155  新城控股  21.51   4.114     1
5    2831  裕同科技  30.19   2.757     1
6    1914  招商积余  17.50   1.449     1
7  603979   金诚信  21.25   7.378     1
8    2372  伟星新材  20.72   5.445     1
9  600153  建发股份  11.48   2.226     2'''

print('---')
'''如果需要在数据表的指定位置插入数据,可以使用pandas模块中的insert()函数
insert()函数有3个参数,第一个是需要插入的位置的索引值,第二个是列标签(表头),第三个是插入的列表内容'''
data.insert(0,'指定插入位置',['测试','测试','测试','测试','测试','测试','测试','测试','测试','测试'])
print(data)
'''
  指定插入位置    股票代码  股票简称  现价(元)  涨跌幅(%)  插入测试
0     测试     810  创维数字  25.21   1.941     1
1     测试  600256  广汇能源  12.50   7.852     1
2     测试    2444  巨星科技  27.02  -0.111     1
3     测试    2416   爱施德  10.44  -0.287     1
4     测试  601155  新城控股  21.51   4.114     1
5     测试    2831  裕同科技  30.19   2.757     1
6     测试    1914  招商积余  17.50   1.449     1
7     测试  603979   金诚信  21.25   7.378     1
8     测试    2372  伟星新材  20.72   5.445     1
9     测试  600153  建发股份  11.48   2.226     2'''

print('---------------删除数据----------------------')
'''如果要删除数据表中的数据,可以使用pandas模块中的drop()函数,该函数可以删除指定的列或行'''

#drop()函数中直接给出要删除的列的列标签就能删除指定的列,axis值为0表示按行删除,值为1表示按列删除
a=data.drop(['现价(元)','涨跌幅(%)'],axis=1)
print(a)
'''
  指定插入位置    股票代码  股票简称  插入测试
0     测试     810  创维数字     1
1     测试  600256  广汇能源     1
2     测试    2444  巨星科技     1
3     测试    2416   爱施德     1
4     测试  601155  新城控股     1
5     测试    2831  裕同科技     1
6     测试    1914  招商积余     1
7     测试  603979   金诚信     1
8     测试    2372  伟星新材     1
9     测试  600153  建发股份     2'''


print('---')
print('索引值删除列')
#使用drop()函数删除列,除了可以通过列标签删除,还可以通过列的索引值来删除(注意有2组中括号[])
data2=pd.read_excel('1.xlsx')
'''疑问是,这里重新从Excel文件中读取数据,这里读取出的数据,为什么还会受到前面插入测试的代码影响'''
b=data2.drop(data2.columns[[2,3]],axis=1)
print(a)
'''
  指定插入位置    股票代码  股票简称  插入测试
0     测试     810  创维数字     1
1     测试  600256  广汇能源     1
2     测试    2444  巨星科技     1
3     测试    2416   爱施德     1
4     测试  601155  新城控股     1
5     测试    2831  裕同科技     1
6     测试    1914  招商积余     1
7     测试  603979   金诚信     1
8     测试    2372  伟星新材     1
9     测试  600153  建发股份     2'''

print('---')
#也可以通过列标签以列表的形式传递给drop()函数的参数columns来删除列,这里只需要一组中括号[]
c=data.drop(columns=['股票代码','股票简称'])
print(c)
'''
  指定插入位置  现价(元)  涨跌幅(%)  插入测试
0     测试  25.21   1.941     1
1     测试  12.50   7.852     1
2     测试  27.02  -0.111     1
3     测试  10.44  -0.287     1
4     测试  21.51   4.114     1
5     测试  30.19   2.757     1
6     测试  17.50   1.449     1
7     测试  21.25   7.378     1
8     测试  20.72   5.445     1
9     测试  11.48   2.226     2'''


print('-----------删除行--------------')
'''删除行的方法也可以用drop()函数,但需要将axis参数的值设为0'''
d=data.drop(0,axis=0)   #删除了第一行
print(d)

print('---')
data3=pd.read_excel('1.xlsx',index_col=0)   #需要index_col=0这个参数,否则下面删除行的操作会报错
print(data3)
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)
0     810  创维数字  25.21   1.941
1  600256  广汇能源  12.50   7.852
2    2444  巨星科技  27.02  -0.111
3    2416   爱施德  10.44  -0.287
4  601155  新城控股  21.51   4.114
5    2831  裕同科技  30.19   2.757
6    1914  招商积余  17.50   1.449
7  603979   金诚信  21.25   7.378
8    2372  伟星新材  20.72   5.445
9  600153  建发股份  11.48   2.226'''
print('---')
e=data3.drop([600256],axis=0)   #删除了行标签是600256的这一行
print(e)
'''
        股票简称  现价(元)  涨跌幅(%)
股票代码                       
810     创维数字  25.21   1.941
2444    巨星科技  27.02  -0.111
2416     爱施德  10.44  -0.287
601155  新城控股  21.51   4.114
2831    裕同科技  30.19   2.757
1914    招商积余  17.50   1.449
603979   金诚信  21.25   7.378
2372    伟星新材  20.72   5.445
600153  建发股份  11.48   2.226'''

print('---')
#通过索引值来删除行,注意有2组中括号[]
f=data3.drop(data3.index[[0,1]],axis=0) #删除第0换行和第1行
print(f)
'''
        股票简称  现价(元)  涨跌幅(%)
股票代码                       
2444    巨星科技  27.02  -0.111
2416     爱施德  10.44  -0.287
601155  新城控股  21.51   4.114
2831    裕同科技  30.19   2.757
1914    招商积余  17.50   1.449
603979   金诚信  21.25   7.378
2372    伟星新材  20.72   5.445
600153  建发股份  11.48   2.226'''

print('---')
#还可以通过将行标签以列表的形式传递给drop()参数index来删除行
data=pd.read_excel('1.xlsx',index_col=0)    #缺少index_col=0会报错
#print(data)
dd=data.drop(index=[810,600256])
print(dd)
'''
股票代码                       
2444    巨星科技  27.02  -0.111
2416     爱施德  10.44  -0.287
601155  新城控股  21.51   4.114
2831    裕同科技  30.19   2.757
1914    招商积余  17.50   1.449
603979   金诚信  21.25   7.378
2372    伟星新材  20.72   5.445
600153  建发股份  11.48   2.226'''


print('---------------处理缺失值----------------')
'''获取的数据表中可能有部分数据为空值,也就是缺失值,可以通过pandas模块查看、删除和填充缺失值'''

print('-----查看缺失值----------')
'''在Python中,缺失值一般用NaN表示
如果要查看每一列的缺失值情况,可以用pandas模块中的info()函数'''

data=pd.read_excel('1.xlsx',sheet_name=1)
print(data.info())
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   股票代码    10 non-null     int64  
 1   股票简称    9 non-null      object 
 2   现价(元)   10 non-null     float64
 3   涨跌幅(%)  10 non-null     float64
dtypes: float64(2), int64(1), object(1)
memory usage: 448.0+ bytes
None'''

'''10 non-null表示这一列有10个非空值,
假如出现9 non-null表示这一列有9个非空值,那么就有1个空值(即缺失值)'''


print('---')
#还可以用isnull()函数判断数据表中哪个值是缺失值,并将缺失值标记为True,非缺失值标记为False
data=pd.read_excel('1.xlsx',sheet_name=1)
a=data.isnull()
print(a)
'''
    股票代码   股票简称  现价(元)  涨跌幅(%)
0  False  False  False   False
1  False  False  False   False
2  False  False  False   False
3  False  False  False   False
4  False   True  False   False
5  False  False  False   False
6  False  False  False   False
7  False  False  False   False
8  False  False  False   False
9  False  False  False   False'''


print('---------删除缺失值-----------')
'''dropna()函数可以删除数据表中含有缺失值的行,默认情况下,只要有一行存在缺失值,整行都会被删除'''
#data=pd.read_excel('1.xlsx',sheet_name=1)
b=data.dropna()
print(b)
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)
0     810  创维数字  25.21   1.941
1  600256  广汇能源  12.50   7.852
2    2444  巨星科技  27.02  -0.111
3    2416   爱施德  10.44  -0.287
5    2831  裕同科技  30.19   2.757
6    1914  招商积余  17.50   1.449
7  603979   金诚信  21.25   7.378
8    2372  伟星新材  20.72   5.445
9  600153  建发股份  11.48   2.226'''

#如果只想删除整行都是缺失值的行,则需要为dropna()函数设置参数how的值为'all'
c=data.dropna(how='all')



print('---------缺失值的填充----------')
'''fillna()汗水可以将数据表中的所有缺失值填充为指定的值'''
d=data.fillna('原本是缺失值')
print(d)
'''
     股票代码    股票简称  现价(元)  涨跌幅(%)
0     810    创维数字  25.21   1.941
1  600256    广汇能源  12.50   7.852
2    2444    巨星科技  27.02  -0.111
3    2416     爱施德  10.44  -0.287
4  601155  原本是缺失值  21.51   4.114
5    2831    裕同科技  30.19   2.757
6    1914    招商积余  17.50   1.449
7  603979     金诚信  21.25   7.378
8    2372    伟星新材  20.72   5.445
9  600153    建发股份  11.48   2.226'''

print('---')
'''还可以为fillna()传入一个字典,为不同列中的缺失值设置不同的填充值'''
e=data.fillna({'股票简称':'缺失的股票简称','股票代码':'缺失的股票代码'})
print(e)
'''
     股票代码     股票简称  现价(元)  涨跌幅(%)
0     810     创维数字  25.21   1.941
1  600256     广汇能源  12.50   7.852
2    2444     巨星科技  27.02  -0.111
3    2416      爱施德  10.44  -0.287
4  601155  缺失的股票简称  21.51   4.114
5    2831     裕同科技  30.19   2.757
6    1914     招商积余  17.50   1.449
7  603979      金诚信  21.25   7.378
8    2372     伟星新材  20.72   5.445
9  600153     建发股份  11.48   2.226'''


print('------------处理重复值--------------')
'''重复值的常用处理操作包括:删除重复值和提取唯一值
删除重复值可以使用drop_duplicates()函数
提取唯一值可以使用unique()函数'''

'''如果有2行的内容完全相同,这样的行被称为重复行,
如果要保留2行重复的行中的第一行,可以直接使用drop_duplicates()函数,不需要其他参数'''
a=data.drop_duplicates()

'''如果要删除某一列的重复值,则为drop_duplicates()函数添加参数subset,并且设置该参数的值为要处理的列的标签
使用drop_duplicates()删除重复值时,默认保留第一个重复值所在的行,然后删除后面的重复值
可以使用drop_duplicates()函数的参数keep来自定义删除重复值时保留哪个重复值所在的行,
比如,将keep参数设为'first'则保留第一个重复值,要保留最后一个重复值则填写'last'
要死将keep参数设为False,则表示删除全部的重复值
'''
b=data.drop_duplicates('股票代码',keep='first')

'''unique()函数用于提取某一列中的唯一值'''
c=data['股票简称'].unique()
print(c)    #['创维数字' '广汇能源' '巨星科技' '爱施德' nan '裕同科技' '招商积余' '金诚信' '伟星新材' '建发股份']




print('--------------排序数据-------------------')
'''排序数据主要会用到sort_value()函数和rank()函数。
sort_value()是将数据按照大小进

行升序或降序排序
rank()函数则是获取数据的排名'''



'''sort_values()函数常用的参数有2个:
by用于指定要排序的列,
ascending指定要按照升序还是降序来进行排序,True是升序(从小到大),False是降序(从大到小)'''
data=pd.read_excel('1.xlsx')
a=data.sort_values(by='现价(元)',ascending=True)
print(a)
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)
3    2416   爱施德  10.44  -0.287
9  600153  建发股份  11.48   2.226
1  600256  广汇能源  12.50   7.852
6    1914  招商积余  17.50   1.449
8    2372  伟星新材  20.72   5.445
7  603979   金诚信  21.25   7.378
4  601155  新城控股  21.51   4.114
0     810  创维数字  25.21   1.941
2    2444  巨星科技  27.02  -0.111
5    2831  裕同科技  30.19   2.757'''

print('---')
'''rank()函数常用的参数有2个:method和ascending
method参数用于指定数据有重复值时的处理方式
将method参数的值设为'average'时,如果出现重复值,会将重复值的自然排名取平均值,也就是说假如第三行和第四行的数据是重复的 ,它们的自然排名是6和7,那么此时rank()函数为他们生成的结果是6.5,也就是(6+7)/2
如果将method参数的值设为first,则表示出现重复数据时,越先出现的数据排名越靠前

ascending用于指定排序方式是升序还是降序'''

c=data['涨跌幅(%)'].rank(method='average',ascending=False)
print(c)
'''
0     7.0
1     1.0
2     9.0
3    10.0
4     4.0
5     5.0
6     8.0
7     2.0
8     3.0
9     6.0
Name: 涨跌幅(%), dtype: float64'''


print('---------------------筛选数据----------------------')
#根据指定条件对数据进行筛选的演示代码
a=data[data['股票简称']=='创维数字']
'''筛选出[股票简称]这一列中,所有的值为[创维数字]的行'''
print(a)
'''   股票代码  股票简称  现价(元)  涨跌幅(%)
0   810  创维数字  25.21   1.941'''

print('---')
b=data[data['现价(元)']>20]    #筛选出现价这一列中,所有大于20的行
print(b)
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)
0     810  创维数字  25.21   1.941
2    2444  巨星科技  27.02  -0.111
4  601155  新城控股  21.51   4.114
5    2831  裕同科技  30.19   2.757
7  603979   金诚信  21.25   7.378
8    2372  伟星新材  20.72   5.445
'''


print('---')
'''如果要进行多条件筛选,并且这些条件之间是【逻辑与】的关系,可以用【&】符号连接多个筛选条件,每个条件要用括号括起来
如果条件之间是【or】的关系,可以使用【|】符号相连接'''

c=data[(data['现价(元)']>20) & (data['涨跌幅(%)']>2)]
print(c)
'''
4  601155  新城控股  21.51   4.114
5    2831  裕同科技  30.19   2.757
7  603979   金诚信  21.25   7.378
8    2372  伟星新材  20.72   5.445'''

print('---')
d=data[(data['现价(元)']>30) | (data['涨跌幅(%)']>7)]
print(d)
'''
1  600256  广汇能源  12.50   7.852
5    2831  裕同科技  30.19   2.757
7  603979   金诚信  21.25   7.378'''




print('---------------------数据表的处理-------------------------------')
'''数据表处理主要是指对数据表中的数据进行行列转置、将数据表转换为树形结构、对多个数据表进行拼接等操作'''

print('---转置数据表的行列---')
'''转置数据表的行列,就是将行转换成列,将列转换成行
在pandas模块中,可直接调用DataFrame的T属性来转置行列'''
data=pd.read_excel('1.xlsx')
t=data.T
print(t)
'''
            0       1      2      3  ...      6       7      8       9
股票代码      810  600256   2444   2416  ...   1914  603979   2372  600153
股票简称     创维数字    广汇能源   巨星科技    爱施德  ...   招商积余     金诚信   伟星新材    建发股份
现价(元)   25.21    12.5  27.02  10.44  ...   17.5   21.25  20.72   11.48
涨跌幅(%)  1.941   7.852 -0.111 -0.287  ...  1.449   7.378  5.445   2.226'''


print('---将数据表转换成树形结构---')
'''将数据表转换成树形结构,就是在维持二维表格的行标签不变的情况下,把列标签也变成行标签,
通俗来讲,就是为二维表格建立层次化的索引
可以使用stack()函数进行转换
会将每一行的行标签转换成列,另一列是行标签对应的数值'''

data=pd.read_excel('1.xlsx')
s=data.stack()
print(s)
'''
0  股票代码         810
   股票简称        创维数字
   现价(元)      25.21
   涨跌幅(%)     1.941
1  股票代码      600256
   股票简称        广汇能源
   现价(元)       12.5
   涨跌幅(%)     7.852
2  股票代码        2444
   股票简称        巨星科技
   现价(元)      27.02
   涨跌幅(%)    -0.111
3  股票代码        2416
   股票简称         爱施德
   现价(元)      10.44
   涨跌幅(%)    -0.287
4  股票代码      601155
   股票简称        新城控股
   现价(元)      21.51
   涨跌幅(%)     4.114
5  股票代码        2831
   股票简称        裕同科技
   现价(元)      30.19
   涨跌幅(%)     2.757
6  股票代码        1914
   股票简称        招商积余
   现价(元)       17.5
   涨跌幅(%)     1.449
7  股票代码      603979
   股票简称         金诚信
   现价(元)      21.25
   涨跌幅(%)     7.378
8  股票代码        2372
   股票简称        伟星新材
   现价(元)      20.72
   涨跌幅(%)     5.445
9  股票代码      600153
   股票简称        建发股份
   现价(元)      11.48
   涨跌幅(%)     2.226
dtype: object'''


print('------数据表的拼接----------')
'''数据表的拼接是指将多个数据表拼接成功一个数据表,会用到pandas模块中的merge()、concat()以及append()函数'''

'''merge()函数可以根据一个或多个相同的列,将不同数据表的行拼接起来

如果不设置参数how,默认的合并方式是取交集(inner)

整个merge的过程就是将信息一一对应匹配的过程
merge有4中类型,分别是inner、left、right、outer

Pandas教程 | Merge数据合并图文详解 - 知乎
https://zhuanlan.zhihu.com/p/102274476

inner的合并方式是取两张表的交集,意思好像是合并两张表之间,指定的同一组列标签下,具有相同行标签的内容,生成新表,如果一张表中有两个行标签是一样的,则会生成2行

left的方式是指,以左边的数据表为基准,两张表同一个列标签下,
如果有一个行标签,左边的表格没有,而右边的表格有,因为是以左边的为基准,因此生成的新数据表中,不会包含左边表格没有的那一行,
如果一行行标签,左边表格有,但右边表格没有,合并之后会有左边表格的行标签,此外右边表格缺失的数据会用缺失值NaN填充

right方式一left方式反之

outer方式在拼接过程中,会取两张表的键(key)的并集进行拼接,
也就是说生成的新表,会包含两张表所有的行标签,缺失的内容会用NaN填充



'''
data=pd.read_excel('1.xlsx',sheet_name=3)
'''
  人名   存款
0  A  100
1  B  666
2  C  233
3  D  769
4  E  369
5  F  999'''
data2=pd.read_excel('1.xlsx',sheet_name=4)
'''
  人名 性别
0  A  男
1  B  女
2  C  男
3  D  女
4  E  男'''

#print(data)
#print(data2)

print('---')

c=pd.merge(data,data2)
print(c)
''' 
  人名   存款 性别
0  A  100  男
1  B  666  女
2  C  233  男
3  D  769  女
4  E  369  男'''

'''
两张数据表并不是简单的组合,而是根据相同的列标签进行了合并,
也就是说,默认的合并方式是取交集'''

print('---')
'''如果想要合并两张数据表的所有数据,则需要为merge()函数添加参数how=outer'''
d=pd.merge(data,data2,how='outer')
print(d)
'''
  人名   存款   性别
0  A  100    男
1  B  666    女
2  C  233    男
3  D  769    女
4  E  369    男
5  F  999  NaN'''

print('---')
'''如果两张数据表中相同的列标签不止一个,可以利用参数on来指定依据哪一列进行合并'''
e=pd.merge(data,data2,on='人名')
#print(e)


print('-------------concat()函数---------------------')
'''concat()函数采用的是全连接数据的方式,它可以直接将两个或多个数据表合并,即不需要两张表之间的某些列或索引值相同,也可以将数据整合在一起

如果一个表中的列在另外一个表中不存在,则合并后的表会将该列数据填充为缺失值NaN。
此外,合并后的表中每一行的行标签仍然为原先两张表各自的行标签,
如果想要重置行标签,可以在concat()函数中设置参数ignore_index=True
'''

f=pd.concat([data,data2])
print(f)
'''
  人名     存款   性别
0  A  100.0  NaN
1  B  666.0  NaN
2  C  233.0  NaN
3  D  769.0  NaN
4  E  369.0  NaN
5  F  999.0  NaN
0  A    NaN    男
1  B    NaN    女
2  C    NaN    男
3  D    NaN    女
4  E    NaN    男'''

print('---') 
f=pd.concat([data,data2],ignore_index=True)
print(f)
'''
   人名     存款   性别
0   A  100.0  NaN
1   B  666.0  NaN
2   C  233.0  NaN
3   D  769.0  NaN
4   E  369.0  NaN
5   F  999.0  NaN
6   A    NaN    男
7   B    NaN    女
8   C    NaN    男
9   D    NaN    女
10  E    NaN    男'''


print('---append()函数---')
'''append()函数的用法比较简单,它可以直接将一个或多个数据表中的数据合并到其他数据表中'''
#使用时被告知被弃用,建议使用concat

#g=data.append(data2)
#print(g)
'''

  '''


print('-------------数据的运算-----------------')
'''常见的统计运算包括求和、求平均值、求最值,分别要用到sum()、mean()、max()和min()'''

'''sum()函数可以对数据表中的每一列数据分别进行求和
对于非数值数据,运算结果是将它们依次连接得到一个字符串
对于数值数据,运算结果是数值之和,也可以单独对某一列进行求和
'''
data=pd.read_excel('1.xlsx')
a=data.sum()
print(a)
'''
股票代码                                     2418330
股票简称      创维数字广汇能源巨星科技爱施德新城控股裕同科技招商积余金诚信伟星新材建发股份
现价(元)                                     197.82
涨跌幅(%)                                    32.764
dtype: object'''


print('---')
#单独对某一列进行求和
b=data['现价(元)'].sum()
print(b)    #197.82


print('----------求平均值-------------')
'''pandas模块中的mean()函数可以对数据表的所有数值数据列分别计算平均值,所有非数值的列会被跳过,也能单独对单列的数据计算平均值

此外对整张数据表计算平均值时会有提示,非数值的计算功能被弃用'''
c=data.mean()
print(c)
'''
股票代码      241833.0000
现价(元)         19.7820
涨跌幅(%)         3.2764
dtype: float64
750: FutureWarning: Dropping of nuisance columns in DataFrame reductions (with 'numeric_only=None') is deprecated; in a future version this will raise TypeError.  Select only valid columns before calling the reduction.
  c=data.mean()'''

print('---')
#计算单列的平均值
d=data['现价(元)'].mean()
print(d)    #19.782


print('--------求最值-----------')
e=data.max()
print(e)
'''
股票代码      603979
股票简称         金诚信
现价(元)      30.19
涨跌幅(%)     7.852
dtype: object
752: FutureWarning: Dropping of nuisance columns in DataFrame reductions (with 'numeric_only=None') is deprecated; in a future version this will raise TypeError.  Select only valid columns before calling the reduction.
  c=data.mean()'''

print('---')
'''求单列的最值与sum()和mean()函数的用法一样'''
f=data['现价(元)'].max()
print(f)    #30.19





print('---------------获取数值分布情况--------------------')
'''pandas模块中的describe()函数可以按列获取数据表中所有数值数据的分布情况,
包括数据的个数、均值、最值、方差、分位数等'''
data=pd.read_excel('1.xlsx')
a=data.describe()
print(a)
'''
                股票代码      现价(元)    涨跌幅(%)
count      10.000000  10.000000  10.00000
mean   241833.000000  19.782000   3.27640
std    309455.907316   6.754672   2.86418
min       810.000000  10.440000  -0.28700
25%      2383.000000  13.750000   1.57200
50%      2637.500000  20.985000   2.49150
75%    600230.250000  24.285000   5.11225
max    603979.000000  30.190000   7.85200'''
print('---')
#也可以单独查看某一列数据的分布情况
b=data['涨跌幅(%)'].describe()
print(b)
'''
count    10.00000
mean      3.27640
std       2.86418
min      -0.28700
25%       1.57200
50%       2.49150
75%       5.11225
max       7.85200
Name: 涨跌幅(%), dtype: float64'''


print('--------------计算相关系数---------------')
'''相关系数通常用来衡量两个或多个元素之间的相关程度,使用pandas模块中的corr()函数可以计算相关系数

计算列的成对相关性,不包括 NA 和 bull 值,返回相关系数矩阵。
相关系数的绝对值越大,相关性越强:相关系数越接近于1或-1,相关度越强,相关系数越接近于0,相关度越弱。

pearson:皮尔逊相关系数,也叫标准相关系数。 pearson相关系数衡量的是线性相关关系。若r=0,只能说x与y之间无线性相关关系,不能说无相关关系。
公式:    
 
kendall:kendall秩相关系数
spearman:spearman相关系数。斯皮尔曼相关系数被定义成等级变量之间的皮尔逊相关系数。对于样本容量为n的样本,n个原始数据被转换成等级数据。
公式:    
 
callable:自定义的计算函数
min_periods:int, optional


'''
data=pd.read_excel('1.xlsx')
a=data.corr()
print(a)
'''
            股票代码     现价(元)    涨跌幅(%)
股票代码    1.000000 -0.393423  0.636721
现价(元)  -0.393423  1.000000 -0.085054
涨跌幅(%)  0.636721 -0.085054  1.000000'''
'''
            股票代码     现价(元)    涨跌幅(%)
股票代码    1.000000 -0.393423  0.636721
现价(元)  -0.393423  1.000000 -0.085054
涨跌幅(%)  0.636721 -0.085054  1.000000'''

print('---')
#仅查看某一列与其他列的相关系数,可以使用列标签来指定列
b=data.corr()['现价(元)']
print(b)
'''
股票代码     -0.393423
现价(元)     1.000000
涨跌幅(%)   -0.085054
Name: 现价(元), dtype: float64'''


print('------------分组汇总数据----------------')
'''pandas中的groupby()函数可以对数据进行分组,
groupby()函数返回的是一个DataFrameGroupBy对象,
该对象包含分组后的数据,但不能直观的显示出来,还是需要通过求和、求平均值、求最值等特定的汇总计算,才能获得有意义的结果'''

a=data.groupby('股票简称')
print(a)
'''
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000202B5B51730>'''

#依据股票简称列对数据进行分组,再对分组后的数据进行最值运算
b=data.groupby('股票简称').max()
print(b)
'''
        股票代码  现价(元)  涨跌幅(%)
股票简称                       
伟星新材    2372  20.72   5.445
创维数字     810  25.21   1.941
巨星科技    2444  27.02  -0.111
广汇能源  600256  12.50   7.852
建发股份  600153  11.48   2.226
招商积余    1914  17.50   1.449
新城控股  601155  21.51   4.114
爱施德     2416  10.44  -0.287
裕同科技    2831  30.19   2.757
金诚信   603979  21.25   7.378'''


print('---')
'''如果只想在分组后对某一列进行汇总计算,可以用列标签来指定列'''
c=data.groupby('股票简称')['现价(元)'].sum()
print(c)
'''
股票简称
伟星新材    20.72
创维数字    25.21
巨星科技    27.02
广汇能源    12.50
建发股份    11.48
招商积余    17.50
新城控股    21.51
爱施德     10.44
裕同科技    30.19
金诚信     21.25
Name: 现价(元), dtype: float64'''


print('---')
'''也可以选取多列进行分组后的汇总计算'''
d=data.groupby('股票简称')['现价(元)','涨跌幅(%)'].sum()
'''
FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
  d=data.groupby('股票简称')['现价(元)','涨跌幅(%)'].sum()'''


print('-------------创建数据透视表----------------')
'''数据透视表可对数据表中的数据进行快速分株计算
pandas模块中的pivot_table()函数可以制作数据透视表'''
#data=pd.read_excel('1.xlsx')
a=pd.pivot_table(data,values='现价(元)',index='股票简称',aggfunc='sum') #aggfunc='sum'表示求和
print(a)
'''
      现价(元)
股票简称       
伟星新材  20.72
创维数字  25.21
巨星科技  27.02
广汇能源  12.50
建发股份  11.48
招商积余  17.50
新城控股  21.51
爱施德   10.44
裕同科技  30.19
金诚信   21.25'''

print('---')
'''如果要计算的列不止一个,可以为参数values传入一个列表'''
b=pd.pivot_table(data,values=['现价(元)','涨跌幅(%)'],index='股票简称',aggfunc='sum')
print(b)
'''
FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
  d=data.groupby('股票简称')['现价(元)','涨跌幅(%)'].sum()
      涨跌幅(%)  现价(元)
股票简称               
伟星新材   5.445  20.72
创维数字   1.941  25.21
巨星科技  -0.111  27.02
广汇能源   7.852  12.50
建发股份   2.226  11.48
招商积余   1.449  17.50
新城控股   4.114  21.51
爱施德   -0.287  10.44
裕同科技   2.757  30.19
金诚信    7.378  21.25

'''


print('------------------------获取并分析股票历史数据---------------------')
'''Python的第三方模块Tushare是一个免费且专业的财经数据接口,它能获取指定股票的历史数据,并生成DataFrame类型的数据表,便于我们使用pandas模块对数据进行处理和分析

需要先安装tushare库'''

#使用Tushare模块中的get_k_data()函数来获取中矿资源的股票历史数据
import tushare as ts
zkzy=ts.get_k_data(code='002738',start='2014-11-30')
'''
get_key_data()的code参数用于指定股票代码,start参数用于获取数据的开始时间,如果指定的开始时间比上市时间还早,那么获取数据的时间是从上市第一天开始的'''
print(zkzy)
'''
            date    open   close    high     low    volume    code
0     2014-12-30   3.919   4.786   4.786   3.919     293.0  002738
1     2014-12-31   5.305   5.305   5.305   5.305     100.0  002738
2     2015-01-05   5.876   5.876   5.876   5.876     149.0  002738
3     2015-01-06   6.505   6.505   6.505   6.505     281.0  002738
4     2015-01-07   7.195   7.195   7.195   7.195     552.0  002738
...          ...     ...     ...     ...     ...       ...     ...
1727  2022-08-15  93.420  94.110  96.000  92.800  179277.0  002738
1728  2022-08-16  94.550  93.560  95.500  92.480  136866.0  002738
1729  2022-08-17  92.720  92.420  93.300  90.060  152989.0  002738
1730  2022-08-18  91.760  90.740  92.780  89.380  146280.0  002738
1731  2022-08-19  90.760  89.010  91.630  88.010  126683.0  002738

[1732 rows x 7 columns]'''

#将获取的数据存储为csv文件
zkzy.to_csv('zkzy.csv')

'''读取csv文件,将date列作为行标签,并将该列数据转换为date(日期)类型,以便做数据分析'''
zkzy2=pd.read_csv('zkzy.csv',index_col='date',parse_dates=['date'])
print(zkzy2)


#对数据进行时间范围选择,这里只选择2020-2022年的数据
zkzy3=zkzy2['2020':'2022']  #使用行标签做切片获取2020-2022年的数据

#假设我们从2020年开始,每月第一天以开盘价买入1000股该股票,当月最后一天以收盘价全部卖出,计算2020-2022年的收益

'''resample()函数用于重新取样,参数值'M'代表按月分组,
first()函数用于获取每月第一天的数据,last()函数用于获取每月最后一天的数据'''
month_first=zkzy3.resample('M').first() #获取每月第一天的股价数据
month_first_money=month_first['open'].sum()*1000    #计算每月第一天以开盘价买入1000股该股票的总支出
month_max=zkzy3.resample('M').last()    #获取每月最后一天的股价数据
month_max_money=month_max['close'].sum()*1000   #计算每月最后一天以收盘价卖出的总收入
get_money=month_max_money-month_first_money #计算收益
print(get_money)

#72539.00000000023  #这个结果不知道正确与否

'''Tushare已升级至Tushare Pro,注册后可以获取自己的token,也就是调取金融数据的凭证'''

#tushare Pro的用法
import tushare as ts
ts.set_token('14032933191a2209fa389fc170257e1276630040501d68271f0e6636')
pro=ts.pro_api()    #初始化Tushare Pro的接口
df=pro.daily(trade_date='20220918') #获取2020年9月18日所有股票的数据
print(df)
'''
        ts_code trade_date    open  ...  pct_chg         vol       amount
0     688196.SH   20200918   56.99  ...   1.4485    22939.43   129644.533
1     605168.SH   20200918  198.45  ...   9.9990    21499.00   452986.594
2     605366.SH   20200918   15.04  ...  -1.9244    58388.32    86570.145
3     605166.SH   20200918   11.73  ...  -0.5098    20889.41    24524.581
4     688021.SH   20200918   62.30  ...   0.1273     3528.58    22182.069
...         ...        ...     ...  ...      ...         ...          ...
3980  300459.SZ   20200918    5.37  ...  -6.6914  3131145.73  1634304.062
3981  300460.SZ   20200918   13.28  ...   0.9023    60824.60    81328.813
3982  300461.SZ   20200918   21.77  ...  -1.0171    39573.41    84570.989
3983  300462.SZ   20200918   26.71  ...  -2.3551    68389.38   178302.586
3984  300463.SZ   20200918   49.08  ...   0.8230    17709.46    86657.682

[3985 rows x 11 columns]'''

发表回复