综合练习

综合练习🔗:http://datawhale.club/t/topic/579

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

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

其中 p(xi) 是企业该年某产业收入额占该年所有产业总收入的比重。在company.csv中存有需要计算的企业和年份,在company_data.csv中存有企业、各类收入额和收入年份的信息。现请利用后一张表中的数据,在前一张表中增加一列表示该公司该年份的收入熵指标 I 。

【数据下载】链接:https://pan.baidu.com/s/1leZZctxMUSW55kZY5WwgIw 38 密码:u6fd

import numpy as np
import pandas as pd
df1 = pd.read_csv('company.csv')
df2 = pd.read_csv('company_data.csv')
df1.head()
证券代码日期
0#0000072014
1#0004032015
2#0004082016
3#0004082017
4#0004262015
df2.head()
证券代码日期收入类型收入额
012008/12/3111.084218e+10
112008/12/3121.259789e+10
212008/12/3131.451312e+10
312008/12/3141.063843e+09
412008/12/3158.513880e+08

检查数据后发现,df1中的证券代码、日期和df2中的证券代码、日期的数据类型差别较大,同时,df2中收入额存在负值和NaN值,这里在不修改df1的前提下进行处理:
1、删除df2中的空值、负值;2、将df2中的证券代码补0至6位,并加上#;3、提取df2中日期的年份并转为int

#删除空值及负值
df2.loc[df2['收入额']<0,'收入额'] = np.nan
df2.dropna(inplace=True)

# 将df2中的证券代码补0至六位,并在最前面加上#
df2['证券代码'] = df2['证券代码'].map(lambda x:'#' + str(x).zfill(6))

# 保留df2中日期的前四位,并将它转为int格式
df2['日期'] = df2['日期'].str[0:4].astype('int')

df2.head()
证券代码日期收入类型收入额
0#000001200811.084218e+10
1#000001200821.259789e+10
2#000001200831.451312e+10
3#000001200841.063843e+09
4#000001200858.513880e+08
# 定义entropy函数计算收入熵
def entropy(x):
    return -(x['p']*np.log2(x['p'] + 1e-5)).sum()

# 计算收入熵
df_entropy = df1.merge(df2, on=['证券代码','日期'], how='left')
df_entropy['p'] = df_entropy.groupby(['证券代码','日期'])['收入额'].apply(lambda x:x/x.sum())
res = df_entropy.groupby(['证券代码','日期']).apply(entropy).reset_index()
res.columns = ['证券代码','日期','收入额']
df1['收入熵指标'] = res['收入额']
df1.head()
证券代码日期收入熵指标
0#00000720144.429351
1#00040320154.025647
2#00040820164.065978
3#0004082017-0.000000
4#00042620154.448961

【任务二】组队学习信息表的变换

【题目描述】请把组队学习的队伍信息表变换为如下形态,其中“是否队长”一列取1表示队长,否则为0

	是否队长	队伍名称	    昵称    	编号
0	1	    你说的都对队	山枫叶纷飞	5
1	0	    你说的都对队	蔡	        6
2	0	    你说的都对队	安慕希	    7
3	0	    你说的都对队	信仰	    8
4	0	    你说的都对队	biubiu🙈🙈	20
...	...	    ...	        ...	        ...
141	0	    七星联盟	    Daisy	    63
142	0	    七星联盟    	One Better	131
143	0	    七星联盟    	rain	    112
144	1	    应如是	    思无邪	    54
145	0	    应如是	    Justzer0	58

【数据下载】链接:https://pan.baidu.com/s/1ses24cTwUCbMx3rvYXaz-Q 16 密码:iz57

team_csv = pd.read_excel('组队信息汇总表Pandas.xls')
# 所在群无用,删除
team_csv.drop(columns='所在群', inplace=True)

# 为了进行长宽表转换,需要先修改列名
# 因为之后“是否队长”一列取1表示队长,这里干脆把队长列的名称后缀全改为1,省去之后的转换
# 这里不知道怎么修改队员的列名,那只能用笨办法了
team_csv.columns = ['队伍名称','编号_1','昵称_1','编号_2','昵称_2','编号_3','昵称_3','编号_4','昵称_4','编号_5','昵称_5','编号_6','昵称_6','编号_7','昵称_7','编号_8','昵称_8','编号_9','昵称_9','编号_10','昵称_10','编号_11','昵称_11']
team = pd.wide_to_long(team_csv.reset_index(),
                       stubnames = ['昵称','编号'],
                       i = ['index','队伍名称'],
                       j = '是否队长',
                       sep='_',
                       suffix='.+').dropna().reset_index().drop(columns='index')
# 处理一下是否队长的数据,以及将编号转换为int
team['编号'] = team['编号'].astype(int)
team.loc[team['是否队长']>1,'是否队长']=0
team.head(7)
队伍名称是否队长昵称编号
0你说的都对队1山枫叶纷飞5
1你说的都对队06
2你说的都对队0安慕希7
3你说的都对队0信仰8
4你说的都对队0biubiu🙈🙈20
5熊猫人1鱼呲呲175
6熊猫人0Heaven44

【任务三】美国大选投票情况

【题目描述】两张数据表中分别给出了美国各县(county)的人口数以及大选的投票情况,请解决以下问题:

  • 有多少县满足总投票数超过县人口数的一半
  • 把州(state)作为行索引,把投票候选人作为列名,列名的顺序按照候选人在全美的总票数由高到低排序,行列对应的元素为该候选人在该州获得的总票数
  • 每一个州下设若干县,定义拜登在该县的得票率减去川普在该县的得票率为该县的BT指标,若某个州所有县BT指标的中位数大于0,则称该州为Biden State,请找出所有的Biden State

【数据下载】链接:https://pan.baidu.com/s/182rr3CpstVux2CFdFd_Pcg 16 提取码:q674

county = pd.read_csv('county_population.csv')
vote = pd.read_csv('president_county_candidate.csv')
county.head()
US CountyPopulation
0.Autauga County, Alabama55869
1.Baldwin County, Alabama223234
2.Barbour County, Alabama24686
3.Bibb County, Alabama22394
4.Blount County, Alabama57826
vote.head()
statecountycandidatepartytotal_voteswon
0DelawareKent CountyJoe BidenDEM44552True
1DelawareKent CountyDonald TrumpREP41009False
2DelawareKent CountyJo JorgensenLIB1044False
3DelawareKent CountyHowie HawkinsGRN420False
4DelawareNew Castle CountyJoe BidenDEM195034True
#Q1 有多少县满足总投票数超过县人口数的一半

# 首先进行数据格式转换,分隔的时候注意中间有一个几乎看不见的 hhhh
county[['county','state']]=county['US County'].str.split(', ',expand=True)
county['county'] = county['county'].str[1:]
county.drop(columns='US County',inplace=True)
# 大概看一下现在的数据
county.head()
Populationcountystate
055869Autauga CountyAlabama
1223234Baldwin CountyAlabama
224686Barbour CountyAlabama
322394Bibb CountyAlabama
457826Blount CountyAlabama
vote_count = vote.groupby(['county','state'])['total_votes'].sum().reset_index()
# 两个表之间的state和county并不能完全对上,而且还存在较多nan,因此用inner进行merge
# res = vote_count.merge(county,on=['county','state'],how='left')
res = vote_count.merge(county,on=['county','state'],how='inner')

# 超出一半的部分
res_over=res[res['total_votes']>(res['Population']/2)]
res_over.shape[0]
# 1434
# Q2 把州(state)作为行索引,把投票候选人作为列名,列名的顺序按照候选人在全美的总票数由高到低排序,行列对应的元素为该候选人在该州获得的总票数
vote_by_state = vote.pivot_table(index= 'state',
                                 columns = 'candidate',
                                 values = 'total_votes',
                                 aggfunc = 'sum')
vote_by_state.fillna(0,inplace=True)
# 先求全美的总和,然后降序排列
vote_by_state.loc['sum'] = vote_by_state.sum(0)
vote_by_state_sorted = vote_by_state.sort_values(by='sum',axis=1,ascending=False)
vote_by_state_sorted.head()
candidateJoe BidenDonald TrumpJo JorgensenHowie HawkinsWrite-insRocky De La FuenteGloria La RivaKanye WestDon BlankenshipBrock PierceTom HoeflingRicki Sue KingPrincess Jacob-FambroBlake HuberRichard DuncanJoseph KishoreJordan ScottGary SwingKeith McCormicZachary Scalf
state
Alabama849648.01441168.025176.00.07312.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
Alaska153405.0189892.08896.00.034210.0318.00.00.01127.0825.00.00.00.00.00.00.00.00.00.00.0
Arizona1672143.01661686.051465.00.02032.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
Arkansas423932.0760647.013133.02980.00.01321.01336.04099.02108.02141.00.00.00.00.00.00.00.00.00.00.0
California11109764.06005961.0187885.081025.080.060155.051036.00.00.00.00.00.00.00.00.00.00.00.00.00.0
# Q3 每一个州下设若干县,定义拜登在该县的得票率减去川普在该县的得票率为该县的BT指标,若某个州所有县BT指标的中位数大于0,则称该州为Biden State,请找出所有的Biden State
vote['pre'] = vote.groupby(['state','county'])['total_votes'].apply(lambda x:x/x.sum())
vote_by_county = vote.pivot(index= ['state','county'],
                            columns = 'candidate',
                            values = 'pre',
                            )
vote_by_county['BT'] = vote_by_county['Joe Biden'] - vote_by_county['Donald Trump']
BT_state = vote_by_county.groupby('state')['BT'].apply(lambda x:x.median()>0).reset_index()
BT_state[BT_state.BT == True]
# 这道题用了好多变形啊
stateBT
4CaliforniaTrue
6ConnecticutTrue
7DelawareTrue
8District of ColumbiaTrue
11HawaiiTrue
21MassachusettsTrue
30New JerseyTrue
39Rhode IslandTrue
45VermontTrue
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值