【任务一】企业收入的多样性
【题目描述】一个企业的产业收入多样性可以仿照信息熵的概念来定义收入熵指标:
I = − ∑ i p ( x i ) l o g ( p ( x i ) ) I=-\sum _{i}p(x_{i})log(p(x_{i})) I=−∑ip(xi)log(p(xi))
其中 p(xi) 是企业该年某产业收入额占该年所有产业总收入的比重。在company.csv
中存有需要计算的企业和年份,在company_data.csv
中存有企业、各类收入额和收入年份的信息。现请利用后一张表中的数据,在前一张表中增加一列表示该公司该年份的收入熵指标 I 。
df1 = pd.read_csv('company.csv')
df2 = pd.read_csv('company_data.csv')
s1=df2.groupby(['证券代码','日期'])['收入额'].transform(lambda x :x /x.sum())
df2=df2.assign(占比=s1)
df2['对数占比']=df2.groupby(['证券代码','日期'])['占比'].transform(lambda x : np.log(x))
s2=df2['占比']*df2['对数占比']
df2['信息熵']=s2.replace({np.NaN:0})
s=df2.groupby(['证券代码','日期'])['信息熵'].sum()*(-1)
df1['证券代码']=df1['证券代码'].apply(lambda x : int(str(x).split('#')[1]))
df=s.reset_index()
df['年份']=df['日期'].apply(lambda x :int(str(x).split('/')[0]))
#调整年份的位置
df=df.set_index('年份').reset_index()
df1 = df1.rename(columns={'日期':'年份'})
df1.merge(df,on=['年份','证券代码'],how='left')
证券代码 年份 日期 信息熵
0 7 2014 2014/12/31 3.070462
1 403 2015 2015/12/31 2.790585
2 408 2016 2016/12/31 2.818541
3 408 2017 NaN NaN
4 426 2015 2015/12/31 3.084266
... ... ... ... ...
1043 600978 2011 2011/12/31 3.319059
1044 600978 2014 2014/12/31 2.788100
1045 600978 2015 2015/12/31 3.012628
1046 600978 2016 2016/12/31 3.021157
1047 600978 2017 NaN NaN
1048 rows × 4 columns
【任务二】组队学习信息表的变换
【题目描述】请把组队学习的队伍信息表变换为如下形态,其中“是否队长”一列取1表示队长,否则为0
data1=pd.wide_to_long(data,stubnames=['队长','队员'],i=['所在群','队伍名称'],
j='成员类型',suffix='.+').dropna(axis=0,how='all')
data1=data1.droplevel(0,axis=0)
df1=data1['队长'].dropna().to_frame().reset_index().pivot(index='队伍名称',
columns='成员类型',values='队长').rename(columns={'_群昵称':'群昵称'})
data_2=data.drop(['队长编号','队长_群昵称'],axis=1)
data_22=pd.wide_to_long(data_2,stubnames='队员',i=['所在群','队伍名称'],
j='成员类型',suffix='.+').dropna(axis=0,how='all')
data_22=data_22.reset_index(2).droplevel(0)
def func(x):
if '编号' in str(x):
if len(str(x).split(' ')) == 1:
return str(x)[:2]
return str(x).split(' ')[0]
if '群昵称' in str(x):
if len(str(x).split('.')) == 1:
return 1
return int(str(x).split('.')[1])+1
cond1=data_22['成员类型'].apply(func)
def func_1(x):
if type(x)==str:
return '编号'
if type(x)==int:
return '群昵称'
cond2=cond1.apply(func_1)
data_22['成员类型']=cond2
data_22['序号']=cond1.apply(lambda x : int(x))
df2=data_22.reset_index().pivot(index=['队伍名称','序号'],columns='成员类型',values='队员')
df2['是否队长']=0
df1['是否队长']=1
df2=df2.droplevel(1)
pd.concat([df1,df2]).reset_index()
以后再优化吧 目前是把队长和队员分开来处理,再拼起来。很繁琐
【任务三】美国大选投票情况
【题目描述】两张数据表中分别给出了美国各县(county
)的人口数以及大选的投票情况,请解决以下问题:
- 有多少县满足总投票数超过县人口数的一半
- 把州(
state
)作为行索引,把投票候选人作为列名,列名的顺序按照候选人在全美的总票数由高到低排序,行列对应的元素为该候选人在该州获得的总票数
# 此处是一个样例,实际的州或人名用原表的英语代替
拜登 川普
威斯康星州 2 1
德克萨斯州 3 4
- 每一个州下设若干县,定义拜登在该县的得票率减去川普在该县的得票率为该县的
BT
指标,若某个州所有县BT
指标的中位数大于0,则称该州为Biden State
,请找出所有的Biden State
# 3.1
df1=pd.read_csv('president_county_candidate.csv')
df2=pd.read_csv('county_population.csv')
sum_vote=df1.groupby(['county','state'])['total_votes'].sum()
sum_vote=sum_vote.to_frame().reset_index()
US_county='.'+sum_vote['county']+', '+sum_vote['state']
df3=sum_vote.copy()
df4=df3.drop(['county','state'],axis=1).copy()
df4['US County']=US_county
df_12=df2.merge(df4,on='US County',how='left')
df_12[df_12['total_votes']/df_12['Population']>0.5].count(0)
1434个
# 3.2
columns=df1.groupby('candidate')['total_votes'].sum().sort_values(ascending = False).index
result=df1.pivot_table(index='state',columns='candidate',values='total_votes')
result.reindex(columns=columns)
# 3.3
df1.groupby(['state','county'])['total_votes'].transform('sum')
df1['县总票数']=df1.groupby(['state','county'])['total_votes'].transform('sum')
df1['县得票率']=df1['total_votes']/df1['县总票数']
df_bt=df1.pivot(index=['state','county'],columns='candidate',values='县得票率')
s_bt=df_bt['Joe Biden']-df_bt['Donald Trump']
df3=s_bt.to_frame()
result3=df3.rename(columns={0:'BT指标'}).reset_index()
def myfunc2(x):
if x.median()>0:
return 'Biden State'
else:
return 'Not Biden State'
result=result3.groupby('state')['BT指标'].transform(myfunc2)
result3[result=='Biden State']['state'].drop_duplicates().reset_index(drop=True)
0 California
1 Connecticut
2 Delaware
3 District of Columbia
4 Hawaii
5 Massachusetts
6 New Jersey
7 Rhode Island
8 Vermont
Name: state, dtype: object