第一次综合练习

【任务一】企业收入的多样性

【题目描述】一个企业的产业收入多样性可以仿照信息熵的概念来定义收入熵指标:

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值