巴克的记录簿|自用,示例代码1
▪ 现实问题:该数据中有多少家企业?
▪ 操作问题:列Stkcd中有多少个不同的数值?
FS_Combas = pd.read_csv("FS_Combas.csv", low_memory=False)
FS_Combas.rename(columns = {'A001000000': 'asset', 'A002112000': 'payroll'}, inplace = True)
FS_Combas = FS_Combas[FS_Combas['Typrep'] == 'A']
A1 = FS_Combas['Stkcd'].nunique()
print(A1)
▪ 现实问题:该数据目前有多少个观测值?
▪ 操作问题:该数据目前有多少列?
FS_Combas = FS_Combas[FS_Combas['Accper'].str.endswith("12-31") == True]
A2 = FS_Combas.shape[0]
print(A2)
▪ 现实问题:2020年有多少家公司
▪ 操作问题:列year中数值为2020的行数有多少?
FS_Combas['year'] = FS_Combas['Accper'].str.slice(0,4).astype(int)
YearCount = FS_Combas['year'].value_counts()
A3 = YearCount.loc[2020]
print(A3)
▪ 现实问题:2020年有多少家企业退出?
▪ 操作问题:对于列Stkcd中的每个组,其对应列year的最大值为2020的个数有多少?
YearMax = FS_Combas['year'].groupby([FS_Combas['Stkcd']]).max()
A4= (YearMax == 2020).sum()
print(A4)
▪ 现实问题:2020年退出企业中,哪一家企业在退出时的资产(asset)最大?请输出其对应的股票代码;
▪ 操作问题:第一,找出列year的最大值为2020的列Stkcd中的组;第二,在该组中,选取列asset最大的,输出其对应的stkcd数值;
YearMax = YearMax.rename('YearMax')
#print(FS_Combas.shape)
#FS_Combas = pd.merge(FS_Combas, YearMax, on="Stkcd", how="outer")
data_a5 = pd.merge(FS_Combas, YearMax, on="Stkcd", how="outer") #什么情况下不用FS_Combas
#print(data_a5.shape)
data_a5.drop_duplicates(subset = ['Stkcd','year'], keep = 'last', inplace = True) #为什么要duplicates
#print(data_a5.shape)
FirmList = data_a5[(data_a5['YearMax'] == 2020) & (data_a5['year'] == 2020)]
#print(FirmList)
# FirmList.loc[FirmList['asset'].idxmax(), 'Stkcd'] #为什么这个会出错?
A5 = FirmList.loc[FirmList['asset'].astype(float).idxmax(), 'Stkcd']
print(A5)
▪ 现实问题:哪一家企业的平均资产(asset)是第二大的;
▪ 操作问题:对于列Stkcd先分组,找出asset平均值第二大的组;
FS_Combas['asset'] = FS_Combas['asset'].astype(float) #如果没有这步会怎么样:有一些数据处理的习惯要掌握
#FS_Combas['payroll'] = FS_Combas['payroll'].astype(float)
StkcdMean = FS_Combas["asset"].groupby([FS_Combas["Stkcd"]]).mean()
StkcdMean.sort_values(ascending = False, inplace = True)
#print(StkcdMean)
A6 = StkcdMean.index[1]
print(A6)
▪ 现实问题:在主数据内,部分企业变更了股票简称(Stkcd不变,但是ShortName发生变化),在数据中一家企业最多有几个不一样的股票简称?
▪ 操作问题:对于列Stkcd先分组,然后计算每组ShortName的值的个数,然后求出该个数的最大值
StkName = FS_Combas["ShortName"].groupby([FS_Combas["Stkcd"]]).nunique()
StkName.sort_values(ascending = False, inplace = True)
A7 = StkName.max()
print(A7)
▪ 现实问题:在主数据内,部分企业变更了股票简称(Stkcd不变,但是ShortName发生变化),一共有多少家企业发生了股票简称的变更?
▪ 操作问题:对于列Stkcd先分组,然后计算每组ShortName的值的个数,然后求出该个数大于1的组数
A8 = (StkName>1).sum()
print(A8)
▪ 现实问题:根据每年平均资产的数(当年所有公司的资产之和除以当年的公司数),请计算有多少年的平均资产数比前一年的平均资产数少?
▪ 操作问题:将列asset根据列year分组(即,分年),算出每一年asset的平均数,计算出asset平均数比前一年的少的年份
YearMean = FS_Combas["asset"].groupby([FS_Combas["year"]]).mean()
YearMean = pd.DataFrame(YearMean)
YearMean.sort_values('year')
YearMean['mark'] = YearMean['asset'] < YearMean['asset'].shift(1)
#print(YearMean)
A9 = YearMean['mark'].sum()
print(A9)
▪ 根据每年平均资产的数量(当年所有公司的资产之和除以当年的公司数),然后画出折线图
▪ 作图要求:折线为红色(1),y轴坐标的刻度显示为[500,550, 600, 650, 700, 750, 800],(3分),y轴的标题为“A股市场年平均资产(亿)”(1分),x轴为年份(2)
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
x = YearMean.index.tolist()
y = YearMean['asset'].tolist()
for i in range(len(y)):
y[i] = y[i] /100000000
ax.set_ylim(500,800)
ax.set_yticks([500,550,600,650,700,750,800])
ax.set_yticklabels(['500','550','600','650','700', '750', '800'])
ax.set_ylabel("average assets (unit: billion)")
l1 = ax.plot(x,y,'r-')
或
#import matplotlib
#font = {'family': 'SimHei', "size": 24}
#matplotlib.rc('font', **font)
plt.rcParams['font.family']=['SimHei']
x=pj.index.tolist()
y1=pj['asset'].tolist()
y=[n/100000000 for n in y1]
#new_list = [num * 2 for num in my_list]
plt.plot(x,y,'r-')
plt.yticks([500, 550, 600, 650, 700, 750, 800])
plt.ylabel('A股市场年平均资产(亿)')
plt.xlabel('年份')
plt.show()