学习笔记

pandas数据筛选、缺失值处理、数据整理、字符串处理、时间处理、滚动操作



print('----------------------------数据筛选-----------------------------------')

import pandas as pd

pd.set_option('expand_frame_repr', False)  # 当列太多时清楚展示

# =====导入数据

df=pd.read_excel('1.xlsx')
print(df)
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)
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('---')
df['test']=df['股票简称']=='广汇能源'
print(df)

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

print('---')
#筛选出指定结果的行后,输出他们的index
print(df[df['现价(元)']>20].index) #Int64Index([0, 2, 4, 5, 7, 8], dtype='int64')


print('---')
#筛选多个符合条件的行
print(df[df['股票简称'].isin(['创维数字','巨星科技','信'])])
'''
   股票代码  股票简称  现价(元)  涨跌幅(%)   test
0   810  创维数字  25.21   1.941  False
2  2444  巨星科技  27.02  -0.111  False'''

print('---')
#根据多个条件筛选行,每个单独的条件需要放在小括号()内,and&,or|
print(df[(df['现价(元)']>20) & (df['涨跌幅(%)']>3)])
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)   test
4  601155  新城控股  21.51   4.114  False
7  603979   金诚信  21.25   7.378  False
8    2372  伟星新材  20.72   5.445  False'''


# =====数据筛选,根据指定的条件,筛选出相关的数据。
# print(df['股票代码'] == 'sh600000')  # 判断交易股票代码是否等于sh600000
# print(df[df['股票代码'] == 'sh600000'])  # 将判断为True的输出:选取股票代码等于sh600000的行
# print(df[df['股票代码'] == 'sh600000'].index)  # 输出判断为True的行的index
# print(df[df['股票代码'].isin(['sh600000', 'sh600004', 'sz000001'])])  # 选取股票代码等于'sh600000'或'sh600004'或'sz000001'的都行
# print(df[df['收盘价'] < 10.0])  # 选取收盘价小于10的行
# print(df[(df['收盘价'] < 10.0) & (df['股票代码'] == 'AIDUSD')])  # 两个条件,或者的话就是|
print('---------------------------缺失值处理----------------------------------')
import pandas as pd  # 将pandas作为第三方库导入,我们一般为pandas取一个别名叫做pd

pd.set_option('expand_frame_repr', False)  # 当列太多时清楚展示

# =====导入数据
df = pd.read_csv(
    'sh600000.csv',
    encoding='gbk',
    skiprows=1
)

print(df)
'''
          股票代码  股票名称        交易日期    开盘价    最高价    最低价    收盘价   前收盘价          成交量           成交额
0     sh600000  浦发银行  1999-11-10  29.50  29.80  27.00  27.75  10.00  174085100.0  4.859102e+09
1     sh600000  浦发银行  1999-11-11  27.58  28.38  27.53  27.71  27.75   29403500.0  8.215822e+08
2     sh600000  浦发银行  1999-11-12  27.86  28.30  27.77  28.05  27.71   15008000.0  4.215916e+08
3     sh600000  浦发银行  1999-11-15  28.20  28.25  27.70  27.75  28.05   11921100.0  3.329528e+08
4     sh600000  浦发银行  1999-11-16  27.88  27.97  26.48  26.55  27.75   23223100.0  6.289083e+08
...        ...   ...         ...    ...    ...    ...    ...    ...          ...           ...
4577  sh600000  浦发银行  2019-03-29  10.98  11.30  10.98  11.28  11.03   60526266.0  6.784365e+08
4578  sh600000  浦发银行  2019-04-01  11.36  11.52  11.29  11.44  11.28   70637405.0  8.086575e+08
4579  sh600000  浦发银行  2019-04-02  11.50  11.52  11.41  11.44  11.44   46714710.0  5.348968e+08
4580  sh600000  浦发银行  2019-04-03  11.37  11.54  11.34  11.50  11.44   50271029.0  5.757994e+08
4581  sh600000  浦发银行  2019-04-04  11.55  11.71  11.54  11.71  11.50   75232527.0  8.760995e+08

[4582 rows x 10 columns]'''

print('---')
#创建缺失值
index=df[df['交易日期'].isin(['2019-03-01','2019-04-01'])].index
print(index)    #得到了交易日期这一列中,指定数值列的索引
#Int64Index([4557, 4578], dtype='int64')

df.loc[index,'月头']=df['交易日期']   #loc的两个参数分别是行索引和列名
# 新增名为月头的一列,指定index的行和名为月头的这一列的数值等于对应的交易日期

#print(df)  新增了名为月头的一列,这一列中不符合条件的单元格都被填充为NaN
#Nan的意思是Not a Number,表示这不是一个数值
#个人理解是由于这一列中其他单元格没有被填充,所以才是NaN



print('--------------删除缺失值---------------------')
'''dropna可以删除带有空值的行,
参数how='any'的意思是这一行只要存在空值就删除
subset参数可以设定只有在指定的列当中,存在空值才会将列删除,
如果设置了how='any',那么任意一列存在空值才会将这一行删除
如果设置了how='all',那么只有指定的两列均为空值才会将列删除
'''



print(df.dropna(how='any'))
'''
          股票代码  股票名称        交易日期    开盘价    最高价    最低价    收盘价   前收盘价         成交量          成交额          月头
4557  sh600000  浦发银行  2019-03-01  11.81  12.06  11.60  12.02  11.74  63254621.0  747753342.0  2019-03-01
4578  sh600000  浦发银行  2019-04-01  11.36  11.52  11.29  11.44  11.28  70637405.0  808657530.0  2019-04-01'''


print('---')
print(df.dropna(subset=['月头','收盘价'],how='any'))
#print(df.dropna(subset=['月头', '收盘价'], how='all'))





print('-----------------------补全缺失值-----------------------')
''''.fillna(value=指定填充的值)可以在有缺失值的位置填充指定的值,但好像不能直接作用于源数据?
不指定value参数,设置参数method='ffill',如果发现空值,会使用同一列中,该空值前一个非空值的单元格的内容进行填充
设置参数method='bfill',如果发现空值,会使用同一列中,下面的第一个非空值的单元格的内容填充空值的位置
'''



#print(df.fillna(value=666))
'''
4577  sh600000  浦发银行  2019-03-29  10.98  11.30  10.98  11.28  11.03   60526266.0  6.784365e+08         666
4578  sh600000  浦发银行  2019-04-01  11.36  11.52  11.29  11.44  11.28   70637405.0  8.086575e+08  2019-04-01
4579  sh600000  浦发银行  2019-04-02  11.50  11.52  11.41  11.44  11.44   46714710.0  5.348968e+08         666
4580  sh600000  浦发银行  2019-04-03  11.37  11.54  11.34  11.50  11.44   50271029.0  5.757994e+08         666
4581  sh600000  浦发银行  2019-04-04  11.55  11.71  11.54  11.71  11.50   75232527.0  8.760995e+08         666'''
#print(df)


print('---')
#将存在缺失值的那一列的数据,用同一行内其他列的数据进行填充
#df['存在空值并需要填充的列'].fillna(value=df['用同一行哪一列的数据进行填充',inplace=True])
#df['月头'].fillna(value=df['收盘价'],inplace=True)
#print(df)



print('-----------------寻找缺失值-------------------')
#.notnull()可以判断是否不是空值,如果不是空值返回True,否则(是空值)返回False
#.isnull()与.notnull()相反
print(df.notnull())
'''
      股票代码  股票名称  交易日期   开盘价   最高价   最低价   收盘价  前收盘价   成交量   成交额     月头
0     True  True  True  True  True  True  True  True  True  True  False
1     True  True  True  True  True  True  True  True  True  True  False
2     True  True  True  True  True  True  True  True  True  True  False
3     True  True  True  True  True  True  True  True  True  True  False
4     True  True  True  True  True  True  True  True  True  True  False
...    ...   ...   ...   ...   ...   ...   ...   ...   ...   ...    ...
4577  True  True  True  True  True  True  True  True  True  True  False
4578  True  True  True  True  True  True  True  True  True  True   True
4579  True  True  True  True  True  True  True  True  True  True  False
4580  True  True  True  True  True  True  True  True  True  True  False
4581  True  True  True  True  True  True  True  True  True  True  False

[4582 rows x 11 columns]'''


print('---')
#输出某一列中不是空值的行
print(df[df['月头'].notnull()])   #输出【月头】这一列不是空值的行
'''
          股票代码  股票名称        交易日期    开盘价    最高价    最低价    收盘价   前收盘价         成交量          成交额          月头
4557  sh600000  浦发银行  2019-03-01  11.81  12.06  11.60  12.02  11.74  63254621.0  747753342.0  2019-03-01
4578  sh600000  浦发银行  2019-04-01  11.36  11.52  11.29  11.44  11.28  70637405.0  808657530.0  2019-04-01'''




# ===== 缺失值处理:原始数据中存在缺失值,如何处理?
# 0.创建缺失值
# index = df[df['交易日期'].isin(['2019-03-01', '2019-03-15'])].index
# df.loc[index, '月头'] = df['交易日期']

# 1.删除缺失值
# print(df.dropna(how='any'))  # 将带有空值的行删除。how='any'意味着,该行中只要有一个空值,就会删除,可以改成all。
# print(df.dropna(subset=['月头', '收盘价'], how='all'))  # subset参数指定在特定的列中判断空值。
# all代表全部为空,才会删除该行;any只要一个为空,就删除该行。

# 2.补全缺失值
# print(df.fillna(value='N'))  # 直接将缺失值赋值为固定的值
# df['月头'].fillna(value=df['收盘价'], inplace=True)  # 直接将缺失值赋值其他列的数据
# print(df.fillna(method='ffill'))  # 向上寻找最近的一个非空值,以该值来填充缺失的位置,全称forward fill,非常有用
# print(df.fillna(method='bfill'))  # 向下寻找最近的一个非空值,以该值来填充确实的位置,全称backward fill

# 3.找出缺失值
# print(df.notnull())  # 判断是否为空值,反向函数为isnull()
# print(df[df['月头'].notnull()])  # 将'月头'列为空的行输出
print('----------------------------数据整理-----------------------------------')
import pandas as pd  # 将pandas作为第三方库导入,我们一般为pandas取一个别名叫做pd

pd.set_option('expand_frame_repr', False)  # 当列太多时清楚展示

# =====导入数据
df=pd.read_excel('1.xlsx')
print(df)
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)
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('-------------pandas中的排序函数----------------')
#.sort_values(by=['根据哪一列排序','如果上一列相同,再根据哪一列排序'],ascending=1(从小到大)0(从大到小)
#根据单列排序
print(df.sort_values(by=['涨跌幅(%)'],ascending=1))
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)
3    2416   爱施德  10.44  -0.287
2    2444  巨星科技  27.02  -0.111
6    1914  招商积余  17.50   1.449
0     810  创维数字  25.21   1.941
9  600153  建发股份  11.48   2.226
5    2831  裕同科技  30.19   2.757
4  601155  新城控股  21.51   4.114
8    2372  伟星新材  20.72   5.445
7  603979   金诚信  21.25   7.378
1  600256  广汇能源  12.50   7.852'''
print('---')
#根据多列排序
print(df.sort_values(by=['涨跌幅(%)','现价(元)'],ascending=[0,0]))
#先根据涨跌幅从大到小排序,如果涨跌幅一样,再根据现价从大到小排序,因为指定了两列,所以后面的ascending参数有2个值
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)
1  600256  广汇能源  12.50   7.852
7  603979   金诚信  21.25   7.378
8    2372  伟星新材  20.72   5.445
4  601155  新城控股  21.51   4.114
5    2831  裕同科技  30.19   2.757
9  600153  建发股份  11.48   2.226
0     810  创维数字  25.21   1.941
6    1914  招商积余  17.50   1.449
2    2444  巨星科技  27.02  -0.111
3    2416   爱施德  10.44  -0.287'''




print('--------------数据表之间的合并------------')
df1=df.iloc[0:4][['股票代码','股票简称']]   #取源数据表的第一行到第三行的股票代码与股票简称这2列生成新的数据表
print(df1)
'''
     股票代码  股票简称
0     810  创维数字
1  600256  广汇能源
2    2444  巨星科技
3    2416   爱施德'''
print('---')
df2=df.iloc[-3:][['股票代码','股票简称','涨跌幅(%)']]
print(df2)
'''
     股票代码  股票简称  涨跌幅(%)
0     810  创维数字     NaN
1  600256  广汇能源     NaN
2    2444  巨星科技     NaN
3    2416   爱施德     NaN
4  603979   金诚信   7.378
5    2372  伟星新材   5.445
6  600153  建发股份   2.226'''

print('---')
'''使用append()合并2张数据表,如果2张数据表之间的列不相同,那么缺失的列的值会用NaN填充
拼接数据表时默认会复制原来的index而不是创建新的
如果要忽略原数据表的index,合并后创建新的index,可以加入参数ignore_index=True
'''
print(df1.append(df2,ignore_index=True))
'''
     股票代码  股票简称
0     810  创维数字
1  600256  广汇能源
2    2444  巨星科技
3    2416   爱施德
4  603979   金诚信
5    2372  伟星新材
6  600153  建发股份'''



print('-----------移除重复值----------------')
'''
drop_duplicates()可以针对数据表进行移除重复值的操作
subset=['列1','列2']可以指定根据哪些列来移除重复值,若不指定则移除所有出现重复的列
keep参数可以设置,出现重复的时候,保留第一行、保留最后一行还是全都不保留,参数分别是first、last以及False
inplace=True或者False,True表示直接对原始对象进行修改,False则表示不修改原始对象,返回被修改后的值,默认是False

'''



print('-------------------其他修改数据表的函数-----------------------')
'''
.reset_index(inplace=True,drop=True)    可以重置数据表的index,
如果设置drop=True,重置后会删除原数据表的index,
如果drop为False,原数据表的index会作为一列保留,默认为False

.rename可以用于修改列表的列标签
.rename(columns={'原始列名':'修改后的列名','':''})

.empty  判断一个数据表对象是否为空,后面不需要加括号

.T   可以进行数据表转置,即行变成列,列变成行



'''
df3=df.rename(columns={'现价(元)':'股票价格'})     #修改列标签
print(df3)
'''     股票代码  股票简称   股票价格  涨跌幅(%)
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('---')
空数据表=pd.DataFrame()     #创建一个空的数据表
print(空数据表.empty)   #True   #判断数据表是否为空


print('---')
print(df.T)
'''
            0       1      2      3       4      5      6       7      8       9
股票代码      810  600256   2444   2416  601155   2831   1914  603979   2372  600153
股票简称     创维数字    广汇能源   巨星科技    爱施德    新城控股   裕同科技   招商积余     金诚信   伟星新材    建发股份
现价(元)   25.21    12.5  27.02  10.44   21.51  30.19   17.5   21.25  20.72   11.48
涨跌幅(%)  1.941   7.852 -0.111 -0.287   4.114  2.757  1.449   7.378  5.445   2.226'''
# =====排序函数
# print(df.sort_values(by=['交易日期'], ascending=1))  # by参数指定按照什么进行排序,acsending参数指定是顺序还是逆序,1顺序,0逆序
# print(df.sort_values(by=['股票代码', '交易日期'], ascending=[1, 0]))  # 按照多列进行排序


# =====两个df上下合并操作,append操作
# df1 = df.iloc[0:10][['交易日期', '股票代码', '收盘价', '成交量']]
# print(df1)
# df2 = df.iloc[5:15][['交易日期', '股票代码', '收盘价', '成交量']]
# print(df2)
# print(df1.append(df2))  # append操作,将df1和df2上下拼接起来。注意观察拼接之后的index。index可以重复
# df3 = df1.append(df2, ignore_index=True)  # ignore_index参数,用户重新确定index
# print(df3)


# =====对数据进行去重
# df3中有重复的行数,我们如何将重复的行数去除?
# print(df3)
# df3.drop_duplicates(
#     subset=['交易日期', '股票代码'],  # subset参数用来指定根据哪类类数据来判断是否重复。若不指定,则用全部列的数据来判断是否重复
#     keep='first',  # 在去除重复值的时候,我们是保留上面一行还是下面一行?first保留上面一行,last保留下面一行,False就是一行都不保留
#     inplace=True
# )
# print(df3)


# =====其他常用重要函数
# df.reset_index(inplace=True, drop=True)  # 重置index
# df.rename(columns={
#     '收盘价': 'close',
#     '开盘价': 'open',
#     '股票代码': 'code',
#     '股票名称': 'name',
#     '交易日期': 'date',
#     '最高价': 'high',
#     '最低价': 'low',
#     '前收盘价': 'prev_close',
#     '成交量': 'volume',
#     '成交额': 'money'}, inplace=True)  # rename函数给变量修改名字。使用dict将要修改的名字传给columns参数
# print(df.empty)  # 判断一个df是不是为空,此处输出不为空
# print(pd.DataFrame().empty)  # pd.DataFrame()创建一个空的DataFrame,此处输出为空
# print(df.T)  # 将数据转置,行变成列,很有用
print('---------------------------字符串处理---------------------------------')


import pandas as pd  # 将pandas作为第三方库导入,我们一般为pandas取一个别名叫做pd


print('----------可以将数据表中的字符串类型的列进行类似字符串的相关操作----------------------------')

pd.set_option('expand_frame_repr', False)  # 当列太多时清楚展示

# =====导入数据
df = pd.read_excel('1.xlsx')
print(df)
'''
     股票代码  股票简称  现价(元)  涨跌幅(%)
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('---')
#只取某一列中前几个字符
print(df['股票简称'].str[:1])
'''
0    创
1    广
2    巨
3    爱
4    新
5    裕
6    招
7    金
8    伟
9    建
Name: 股票简称, dtype: object'''

print('---')
print(df['股票简称'].str.len())    #获取字符串的长度
print('---')
print(df['股票简称'].str.contains('科技'))    #判断内容中是否包含指定的字符串
'''
0    False
1    False
2     True
3    False
4    False
5     True
6    False
7    False
8    False
9    False'''

print('---')
print(df['股票简称'].str.replace('科技','技术'))    #将指定的列中将指定的字符串替换成另一个指定的字符串
'''
0    创维数字
1    广汇能源
2    巨星技术
3     爱施德
4    新城控股
5    裕同技术
6    招商积余
7     金诚信
8    伟星新材
9    建发股份
Name: 股票简称, dtype: object'''


# =====字符串处理
# print(df['股票代码'])
# print('sh600000'[:2])
# print(df['股票代码'].str[:2])
# print(df['股票代码'].str.upper())  # 加上str之后可以使用常见的字符串函数对整列进行操作
# print(df['股票代码'].str.lower())
# print(df['股票代码'].str.len())  # 计算字符串的长度,length
# df['股票代码'].str.strip()  # strip操作,把字符串两边的空格去掉
# print(df['股票代码'])
# print(df['股票代码'].str.contains('767'))  # 判断字符串中是否包含某些特定字符
# print(df['股票代码'].str.replace('sz', 'sh'))  # 进行替换,将sz替换成sh
# 更多字符串函数请见:http://pandas.pydata.org/pandas-docs/stable/text.html#method-summary
print('----------------------------时间处理-----------------------------------')
import pandas as pd  # 将pandas作为第三方库导入,我们一般为pandas取一个别名叫做pd

pd.set_option('expand_frame_repr', False)  # 当列太多时清楚展示

# =====导入数据
df = pd.read_csv(
    'sh600000.csv',
    encoding='gbk',
    skiprows=1
)

print(df.at[0,'交易日期'])  #取索引值为0的行,交易日期那一列的内容
print(type(df.at[0,'交易日期']))        #<class 'str'>  #查看指定行指定列的内容的属性

'''将指定列的数据类型从字符串转换为日期类型,可以使用pd.to_datetime()
pd.to_datetime()可以识别的格式包括:1970-01-01    |   1970/01/01  |   19700101'''
df['交易日期']=pd.to_datetime(df['交易日期'])   #将交易日期这一类的数据类型转换为日期类型,然后返回给自身
print(df.at[0,'交易日期'])  #1999-11-10 00:00:00
# #转换成日期类型后,单独取出某个单元格,还会发现日期后面多了时间信息,通常是00:00:00但打印整张数据表时,时间并不会出现
print(type(df.at[0,'交易日期']))    #<class 'pandas._libs.tslibs.timestamps.Timestamp'>

'''日期类型的单元格可以查看:
该列数据的年/月/日 .dt.year/  .dt.month/    .dt.day/ .dt.hour   /.dt.minute/    .dt.second
哪一月该年中第几周   .dt.isocalendar().week      /旧版本用的是.dt.week但会提出警告
一年中的第几天 .dt.dayofyear
一周中的第几天(0代表星期一).dt.dayofweek        或者 .dt.weekday
星期几的英文单词       .dt.day_name()            旧版是.dt.weekday_name
这一天所在的月份有多少天         .dt.days_in_month       
这一天是否是该月的第一天         .dt.is_month_start
这一天是否是该月的最后一天       .dt.is_month_end
增加天数/小时/分钟          +pd.timedelta(days/hours/seconds=增加的数值)


'''


#提取日期列年/月/日
print(df['交易日期'].dt.year)
#print(df.at[0,'交易日期'].dt.year)
print('-------------')

print(df['交易日期'].dt.week)
'''
FutureWarning: Series.dt.weekofyear and Series.dt.week have been deprecated.  Please use Series.dt.isocalendar().week instead.
  print(df['交易日期'].dt.week)'''

print('---')
print(df['交易日期'].dt.isocalendar().week)



print('---')
print(df['交易日期'].dt.dayofweek)  #一年中的第几天
print('---')
#print(df['交易日期'].dt.weekday_name)    #一星期中的第几天,周一代表0
print(df['交易日期'].dt.day_name())

# ===== 时间处理
# print(df['交易日期'])
# print(df.at[0, '交易日期'])
# print(type(df.at[0, '交易日期']))
# df['交易日期'] = pd.to_datetime(df['交易日期'])  # 将交易日期由字符串改为时间变量
# print(df.at[0, '交易日期'])
# print(type(df.at[0, '交易日期']))

# print(pd.to_datetime('1999年1月11日'))  # pd.to_datetime函数:将字符串转变为时间变量

# print(df['交易日期'])
# print(df['交易日期'].dt.year)  # 输出这个日期的年份。相应的month是月份,day是天数,还有hour, minute, second
# print(df['交易日期'].dt.week)  # 这一天是一年当中的第几周
# print(df['交易日期'].dt.dayofyear)  # 这一天是一年当中的第几天
# print(df['交易日期'].dt.dayofweek)  # 这一天是这一周当中的第几天,0代表星期一
# print(df['交易日期'].dt.weekday)  # 和上面函数相同,更加常用
# print(df['交易日期'].dt.weekday_name)  # 和上面函数相同,返回的是星期几的英文,用于报表的制作。
# print(df['交易日期'].dt.days_in_month)  # 这一天所在月份有多少天
# print(df['交易日期'].dt.is_month_end)  # 这一天是否是该月的开头,是否存在is_month_end?
# print(df['交易日期'] + pd.Timedelta(days=1))  # 增加一天,Timedelta用于表示时间差数据,[weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds]
# print((df['交易日期'] + pd.Timedelta(days=1)) - df['交易日期'])  # 增加一天然后再减去今天的日期
print('----------------------------滚动操作-----------------------------------')
import pandas as pd  # 将pandas作为第三方库导入,我们一般为pandas取一个别名叫做pd

pd.set_option('expand_frame_repr', False)  # 当列太多时清楚展示

# =====导入数据
df = pd.read_csv(
    'sh600000.csv',
    encoding='gbk',
    skiprows=1
)




'''
rolling(n)可以取得最近n行的数据,
与.mean()取平均值、.max()、.min()、.sum()、.std()标准差等配合,可以取得近几日的平均值、最大值、最小值、和、标准差等
rolling()操作会在前几行留下空值,即NaN
'''

df['ma3']=df['收盘价'].rolling(3).mean()   #生成新的一列,标签为ma3,以收盘价这一列的数据的最近3行的值,计算平均值,相当于计算3日均线
#print(df)


'''
expanding()与rolling类似,但它计算的范围是从数据的第一行到当前的行'''


df['累计成交额']=df['成交额'].expanding().sum()
df['历史至今最高收盘价']=df['收盘价'].expanding().max()
print(df)


print('----------------------输出本地文件----------------------')
df.to_csv('output.csv',index=False,encoding='gbk')
#index=False表示输出到本地文件时,忽略index这一列

# =====rolling、expanding操作
# 计算'收盘价'这一列的均值
# print(df['收盘价'])
# 如何得到每一天的最近3天close的均值呢?即如何计算常用的移动平均线?
# 使用rolling函数
# df['收盘价_3天均值'] = df['收盘价'].rolling(3).mean()
# print(df[['收盘价', '收盘价_3天均值']])
# rolling(n)即为取最近n行数据的意思,只计算这n行数据。后面可以接各类计算函数,例如max、min、std等
# print(df['收盘价'].rolling(3).max())
# print(df['收盘价'].rolling(3).min())
# print(df['收盘价'].rolling(3).std())

# rolling可以计算每天的最近3天的均值,如果想计算每天的从一开始至今的均值,应该如何计算?
# 使用expanding操作
# df['收盘价_至今均值'] = df['收盘价'].expanding().mean()
# print(df[['收盘价', '收盘价_至今均值']])

# expanding即为取从头至今的数据。后面可以接各类计算函数
# print(df['收盘价'].expanding().max())
# print(df['收盘价'].expanding().min())
# print(df['收盘价'].expanding().std())

# rolling和expanding简直是为量化领域量身定制的方法,经常会用到。


# =====输出到本地文件
# print(df)
# df.to_csv('output.csv', encoding='gbk', index=False)


发表回复