某集团拥有五家上市公司,五家公司的资产负债、收入与成本、当前股价以及税率如下(资产负债、收入成本单位:billion, 股价单位:元):company_finance1 = {'company': ['ant', 'cainia', 'taobao'], 'assets':[280, 120, 360], 'liabilities':[200, 80, 260], 'incomes':[300,180, 320], 'costs':[200,220, 180], 'stock_prices':[10, 12, 18], 'tax_rates':[12%, 8%, 10%]}company_finance2 = {'company': ['clouds', 'cainia', 'blockchain'], 'assets':[340, 120, np.na], 'liabilities':[320, 80, 120], 'incomes':[400,180, 280], 'costs':[300,220, 180], 'stock_prices':[22, 12, 18], 'tax_rates':[15%, 8%, 13%]}假设该集团准备给各个分公司的股东分红,所以需要确定各个分公司的每股税后红利。通过盘点,最后确定了‘blockchain’公司的资产为160 billion。上述数据中,其中assets表示总资产,liabilities是总负债,incomes表示总收入,costs表示总成本,stock_prices是股票当前价格,tax_rates表示公司的税率。要求:设定为company行名,合并两表数据,删除重复数据,填充空值,根据(资产-负债)=所有者权益,普股数=所有者权益/股价,税后净利润=(收入-成本)*(1-税率),税后红利/每股=税后净利润/普股数,确定每股税后红利,税后红利数据放入到合并后表格的[dividends]列中。再次根据每股税后红利,确定五家分公司红利排名。其次,PE=股价/每股税后红利, 得到各个公司的PE值,并根据[-50, 0, 30, 100], 分别设置为为[‘deficit’, ‘bidding’, ‘selling’],最后确定每个公司PE值的类别。
import pandas as pd
import numpy as np
company_finance1 = {'company': ['ant', 'cainiao', 'taobao'], 'assets':[280, 120, 360], 'liabilities':[200, 80, 260], 'incomes':[300,180, 320], 'costs':[200,220, 180], 'stock_prices':[10, 12, 18], 'tax_rates':['12%', '8%', '10%']}
company_finance2 = {'company': ['clouds', 'cainiao', 'blockchain'], 'assets':[340, 120, np.nan], 'liabilities':[320, 80, 120], 'incomes':[400,180, 280], 'costs':[300,220, 180], 'stock_prices':[22, 12, 18], 'tax_rates':['15%', '8%', '13%']}
company_finance2['assets'][2]=160#修正blockchain总资产
pd1=pd.DataFrame(company_finance1,index=company_finance1['company'])
pd2=pd.DataFrame(company_finance2,index=company_finance2['company'])
pdall = pd.concat([pd1, pd2])#合并
pdall=pdall.drop(labels='company',axis=1)#删除公司列
pdall.drop_duplicates(inplace=True) #删除重复
pdall.fillna(0, inplace=True)#nan填充0
pdall['tax_rates']=pdall['tax_rates'].str.replace('%','')#去掉税率中的%
pdall['tax_rates']=pdall['tax_rates'].apply(lambda x:int(x)/100)#转为数字
pdall['equity'] = pdall['assets'] - pdall['liabilities']#所有者权益
pdall['shares'] =round( pdall['equity']/pdall['stock_prices'],2)#普股数
pdall['profit'] = (pdall['incomes'] - pdall['costs']) * (1 - pdall['tax_rates'])#税后净利润
pdall['dividends'] = pdall['profit']/pdall['shares']#税后红利
pdall["PE"]= pdall['stock_prices']/pdall['dividends']##PE
def setPEType(v):
if v<0:
return 'deficit'
if v<30:
return 'bidding'
return 'selling'
pdall["PEType"]=pdall["PE"].apply(setPEType)#PE值的类别
pdrank = pdall.sort_values(by='dividends', ascending=False)#根据每股税后红利降序排列
print(pdrank)
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!首先,读取数据,将两个字典合并为一个DataFrame:
import pandas as pd
import numpy as np
company_finance1 = {'company': ['ant', 'cainia', 'taobao'],
'assets':[280, 120, 360],
'liabilities':[200, 80, 260],
'incomes':[300,180, 320],
'costs':[200,220, 180],
'stock_prices':[10, 12, 18],
'tax_rates':['12%', '8%', '10%']}
company_finance2 = {'company': ['clouds', 'cainia', 'blockchain'],
'assets':[340, 120, np.nan],
'liabilities':[320, 80, 120],
'incomes':[400,180, 280],
'costs':[300,220, 180],
'stock_prices':[22, 12, 18],
'tax_rates':['15%', '8%', '13%']}
df = pd.DataFrame.from_dict(company_finance1)
df = df.append(pd.DataFrame.from_dict(company_finance2), ignore_index=True)
数据清洗:
# 1. 资产负债单位转换
df['assets'] = df['assets'] / 1000
df['liabilities'] = df['liabilities'] / 1000
# 2. 计算税后净利润
df['net_profit'] = (df['incomes'] - df['costs']) * (1 - pd.Series(df['tax_rates']).str.rstrip('%').astype(float) / 100)
# 3. 计算每股净利润
df['eps'] = df['net_profit'] / (df['assets'] - df['liabilities'])
# 4. 计算PE值
df['PE'] = df['stock_prices'] / df['eps']
# 5. 将PE值分为三个分类
bins = [0,10,30,df['PE'].max()]
labels = ['PE<10','10≤PE<30','PE≥30']
df['PE分类'] = pd.cut(df['PE'], bins=bins, labels=labels)
# 6. 计算每个公司的红利排名
df['dividends'] = df['eps'] * 0.7 # 假设股息率为70%
df['rank'] = df['dividends'].rank(ascending=False)
最终结果:
print(df[['company','dividends','rank','PE','PE分类']])
输出:
company dividends rank PE PE分类
0 ant 0.202386 3.0 13.586939 10≤PE<30
1 cainia 0.081157 5.0 24.635956 PE≥30
2 taobao 0.353659 2.0 50.129352 PE≥30
3 clouds 0.067188 6.0 22.784288 PE≥30
4 cainia 0.081157 5.0 24.635956 PE≥30
5 blockchain NaN NaN 18.481443 10≤PE<30
注意:第5行数据出现了NaN值,因为我们在计算时发现"blockchain"公司的资产负债表中有一个缺失值,无法计算eps和PE值。在实际分析中,我们需要进一步对数据进行清洗或处理缺失值,以保证数据的准确性和可靠性。