任务一:企业收入的多样性
一个企业的产业收入多样性可以仿照信息熵的概念来定义收入熵指标:
I
=
−
∑
i
p
(
x
i
)
log
(
p
(
x
i
)
)
\rm I=-\sum_{i}p(x_i)\log(p(x_i))
I = − i ∑ p ( x i ) log ( p ( x i ) ) 其中
p
(
x
i
)
\rm p(x_i)
p ( x i ) 是企业该年某产业收入额占该年所有产业总收入的比重。在 company.csv 中存有需要计算的企业和年份,在 company_data.csv 中存有企业、各类收入额和收入年份的信息。现请利用后一张表中的数据,在前一张表中增加一列表示该公司该年份的收入熵指标。
df1 = pd. read_csv( 'G:/代码/joyful-pandas-master/lx/company.csv' )
df1. head( )
证券代码 日期 0 #000007 2014 1 #000403 2015 2 #000408 2016 3 #000408 2017 4 #000426 2015
df2 = pd. read_csv( 'G:/代码/joyful-pandas-master/lx/company_data.csv' )
df2. head( )
证券代码 日期 收入类型 收入额 0 1 2008/12/31 1 1.084218e+10 1 1 2008/12/31 2 1.259789e+10 2 1 2008/12/31 3 1.451312e+10 3 1 2008/12/31 4 1.063843e+09 4 1 2008/12/31 5 8.513880e+08
df1[ '证券代码' ] = df1[ '证券代码' ] . str [ 1 : ] . astype( 'int' )
df2[ '日期' ] = df2[ '日期' ] . str [ : 4 ] . astype( 'int' )
tep1 = df2. groupby( [ '证券代码' , '日期' ] ) . sum ( )
tep1 = tep1. reset_index( [ '证券代码' ] )
tep1. head( )
证券代码 收入类型 收入额 日期 2008 1 105 7.284498e+10 2009 1 36 4.771900e+10 2010 1 78 9.940944e+10 2011 1 741 2.762728e+11 2012 1 351 2.775925e+11
tep2 = df2[ [ '日期' , '收入额' ] ] . groupby( [ '日期' ] ) . sum ( )
tep2. head( )
收入额 日期 2008 8.254845e+13 2009 1.423517e+14 2010 1.893949e+14 2011 2.857002e+14 2012 3.888834e+14
tep = tep1. merge( tep2, on= [ '日期' ] , how= 'left' , suffixes= [ '' , '_总' ] )
tep[ 'P' ] = tep[ '收入额' ] / tep[ '收入额_总' ]
tep. head( )
证券代码 收入类型 收入额 收入额_总 P 日期 2008 1 105 7.284498e+10 8.254845e+13 0.000882 2009 1 36 4.771900e+10 1.423517e+14 0.000335 2010 1 78 9.940944e+10 1.893949e+14 0.000525 2011 1 741 2.762728e+11 2.857002e+14 0.000967 2012 1 351 2.775925e+11 3.888834e+14 0.000714
tep = tep[ [ '证券代码' , 'P' ] ] . groupby( [ '证券代码' , '日期' ] ) . agg( lambda x: - sum ( x* np. log2( abs ( x) ) ) )
tep. head( )
P 证券代码 日期 1 2008 0.008954 2009 0.003869 2010 0.005719 2011 0.009684 2012 0.007461
df1. merge( tep, on= [ '证券代码' , '日期' ] , how= 'left' ) . rename( columns = { 'P' : 'I' } ) . head( )
证券代码 日期 I 0 7 2014 0.000176 1 403 2015 0.000359 2 408 2016 0.001492 3 408 2017 NaN 4 426 2015 0.000676
任务二:组队学习信息表的变换
请把组队学习的队伍信息表变换为如下形态,其中“是否队长”一列取1表示队长,否则为0 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8oAVaXhf-1609603332854)(attachment:image.png)]
df = pd. read_excel( 'G:/代码/joyful-pandas-master/lx/Team_Pandas.xlsx' )
df. head( )
所在群 队伍名称 队长编号 队长_群昵称 队员1 编号 队员_群昵称 队员2 编号 队员_群昵称.1 队员3 编号 队员_群昵称.2 ... 队员6 编号 队员_群昵称.5 队员7 编号 队员_群昵称.6 队员8 编号 队员_群昵称.7 队员9 编号 队员_群昵称.8 队员10编号 队员_群昵称.9 0 Pandas数据分析 你说的都对队 5 山枫叶纷飞 6 蔡 7.0 安慕希 8.0 信仰 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 Pandas数据分析 熊猫人 175 鱼呲呲 44 Heaven 37.0 吕青 50.0 余柳成荫 ... 25.0 Never say never 55.0 K 120.0 Y. 28.0 X.Y.Q 151.0 swrong 2 Pandas数据分析 中国移不动 107 Y's 124 🥕 75.0 Vito 146.0 张小五 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3 Pandas数据分析 panda 11 太下真君 35 柚子 108.0 My 42.0 星星点灯 ... 157.0 Zys 158.0 不器 102.0 嘉平佑染 NaN NaN NaN NaN 4 Pandas数据分析 一路向北 13 黄元帅 15 化 16.0 未期 18.0 太陽光下 ... 23.0 🚀 169.0 听风 189.0 Cappuccino NaN NaN NaN NaN
5 rows × 24 columns
pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name=‘value’, col_level=None)
frame:要处理的数据集。
id_vars:不需要被转换的列名。
value_vars:需要转换的列名,如果剩下的列全部都要转换,就不用写了。
var_name和value_name是自定义设置对应的列名。
col_level :如果列是MultiIndex,则使用此级别。
tep1 = df. melt( id_vars = [ '所在群' , '队伍名称' ] ,
value_vars = [ '队长编号' , '队员1 编号' , '队员2 编号' , '队员3 编号' , '队员4 编号' , '队员5 编号' , '队员6 编号' , '队员7 编号' , '队员8 编号' , '队员9 编号' , '队员10编号' ] ,
var_name = '是否队长' ,
value_name = '编号' )
tep1[ '是否队长' ] = tep1[ '是否队长' ] . apply ( lambda x: 1 if x== '队长编号' else 0 )
tep1. head( )
所在群 队伍名称 是否队长 编号 0 Pandas数据分析 你说的都对队 1 5.0 1 Pandas数据分析 熊猫人 1 175.0 2 Pandas数据分析 中国移不动 1 107.0 3 Pandas数据分析 panda 1 11.0 4 Pandas数据分析 一路向北 1 13.0
tep2 = df. melt( id_vars = [ '所在群' , '队伍名称' ] ,
value_vars = [ '队长_群昵称' , '队员_群昵称' , '队员_群昵称.1' , '队员_群昵称.2' , '队员_群昵称.3' , '队员_群昵称.4' , '队员_群昵称.5' , '队员_群昵称.6' , '队员_群昵称.7' , '队员_群昵称.8' , '队员_群昵称.9' ] ,
var_name = '昵称类型' ,
value_name = '昵称' )
tep2. head( )
所在群 队伍名称 昵称类型 昵称 0 Pandas数据分析 你说的都对队 队长_群昵称 山枫叶纷飞 1 Pandas数据分析 熊猫人 队长_群昵称 鱼呲呲 2 Pandas数据分析 中国移不动 队长_群昵称 Y's 3 Pandas数据分析 panda 队长_群昵称 太下真君 4 Pandas数据分析 一路向北 队长_群昵称 黄元帅
df= pd. concat( [ tep1, tep2[ [ '昵称' ] ] ] , axis= 1 )
df. head( )
所在群 队伍名称 是否队长 编号 昵称 0 Pandas数据分析 你说的都对队 1 5.0 山枫叶纷飞 1 Pandas数据分析 熊猫人 1 175.0 鱼呲呲 2 Pandas数据分析 中国移不动 1 107.0 Y's 3 Pandas数据分析 panda 1 11.0 太下真君 4 Pandas数据分析 一路向北 1 13.0 黄元帅
df = df[ [ '是否队长' , '队伍名称' , '昵称' , '编号' ] ]
df. sort_values( by= [ '队伍名称' , '是否队长' ] , ascending= False , inplace= True )
df. dropna( inplace= True )
df[ '编号' ] = df[ '编号' ] . astype( int )
df. head( )
是否队长 队伍名称 昵称 编号 13 1 鲲鲲玩Python 木南居士 26 34 0 鲲鲲玩Python 冻草莓 187 55 0 鲲鲲玩Python Shawn 61 5 1 西部战车 老狼 149 26 0 西部战车 Robin or Michael 51
任务三:美国大选投票情况
两张数据表中分别给出了美国各县(county)的人口数以及大选的投票情况,请解决以下问题:
有多少县满足总投票数超过县人口数的一半 把州(state)作为行索引,把投票候选人作为列名,列名的顺序按照候选人在全美的总票数由高到低排序,行列对应的元素为该候选人在该州获得的总票数 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YehtvgCq-1609603332860)(attachment:image.png)] 每一个州下设若干县,定义拜登在该县的得票率减去川普在该县的得票率为该县的BT指标,若某个州所有县BT指标的中位数大于0,则称该州为Biden State,请找出所有的Biden State
df1 = pd. read_csv( 'G:/代码/joyful-pandas-master/lx/county_population.csv' )
df1. head( )
US County Population 0 .Autauga County, Alabama 55869 1 .Baldwin County, Alabama 223234 2 .Barbour County, Alabama 24686 3 .Bibb County, Alabama 22394 4 .Blount County, Alabama 57826
df2 = pd. read_csv( 'G:/代码/joyful-pandas-master/lx/president_county_candidate.csv' )
df2[ 'US County' ] = '.' + df2[ 'county' ] + ', ' + df2[ 'state' ]
df2. head( )
state county candidate party total_votes won US County 0 Delaware Kent County Joe Biden DEM 44552 True .Kent County, Delaware 1 Delaware Kent County Donald Trump REP 41009 False .Kent County, Delaware 2 Delaware Kent County Jo Jorgensen LIB 1044 False .Kent County, Delaware 3 Delaware Kent County Howie Hawkins GRN 420 False .Kent County, Delaware 4 Delaware New Castle County Joe Biden DEM 195034 True .New Castle County, Delaware
有多少县满足总投票数超过县人口数的一半
df1[ 'state' ] = df1[ 'US County' ] . str . split( "," ) . apply ( lambda x: x[ 1 ] )
df1[ 'county' ] = df1[ 'US County' ] . str . split( "," ) . apply ( lambda x: x[ 0 ] [ 1 : ] )
df1. head( )
US County Population state county 0 .Autauga County, Alabama 55869 Alabama Autauga County 1 .Baldwin County, Alabama 223234 Alabama Baldwin County 2 .Barbour County, Alabama 24686 Alabama Barbour County 3 .Bibb County, Alabama 22394 Alabama Bibb County 4 .Blount County, Alabama 57826 Alabama Blount County
tep = df2[ [ 'US County' , 'total_votes' ] ] . groupby( [ 'US County' ] ) . sum ( )
tep. head( )
total_votes US County .Abbeville County, South Carolina 12433 .Abbot, Maine 417 .Abington, Massachusetts 9660 .Acadia Parish, Louisiana 28425 .Accomack County, Virginia 16962
tep1 = df1. merge( tep, on= [ 'US County' ] , how= 'left' )
tep1. head( )
US County Population state county Joe Biden Donald Trump BT 0 .Autauga County, Alabama 55869 Alabama Autauga County 7503.0 19838.0 -12335.0 1 .Baldwin County, Alabama 223234 Alabama Baldwin County 24578.0 83544.0 -58966.0 2 .Barbour County, Alabama 24686 Alabama Barbour County 4816.0 5622.0 -806.0 3 .Bibb County, Alabama 22394 Alabama Bibb County 1986.0 7525.0 -5539.0 4 .Blount County, Alabama 57826 Alabama Blount County 2640.0 24711.0 -22071.0
tep1[ tep1[ 'total_votes' ] > 0.5 * tep1[ 'Population' ] ] . count( ) [ 0 ]
1434
重新排序
tep = df2. pivot_table( index= 'state' , columns= 'candidate' , values= 'total_votes' , aggfunc = 'sum' )
tep = tep. fillna( 0 )
tep. head( )
candidate None of these candidates Write-ins Alyson Kennedy Bill Hammons Blake Huber Brian Carroll Brock Pierce Brooke Paige Christopher LaFontaine Connie Gammon ... Mark Charles Phil Collins President Boddie Princess Jacob-Fambro Richard Duncan Ricki Sue King Rocky De La Fuente Sheila Samm Tittle Tom Hoefling Zachary Scalf state Alabama 0.0 7312.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 Alaska 0.0 34210.0 0.0 0.0 0.0 0.0 825.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 318.0 0.0 0.0 0.0 Arizona 0.0 2032.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 Arkansas 0.0 0.0 0.0 0.0 0.0 1713.0 2141.0 0.0 0.0 1475.0 ... 0.0 2812.0 0.0 0.0 0.0 0.0 1321.0 0.0 0.0 0.0 California 0.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 60155.0 0.0 0.0 0.0
5 rows × 38 columns
L = df2. groupby( 'candidate' ) . sum ( ) . sort_values( by= 'total_votes' , ascending= False ) . index
L
Index(['Joe Biden', 'Donald Trump', 'Jo Jorgensen', 'Howie Hawkins',
' Write-ins', 'Rocky De La Fuente', 'Gloria La Riva', 'Kanye West',
'Don Blankenship', 'Brock Pierce', 'Brian Carroll',
' None of these candidates', 'Alyson Kennedy', 'Bill Hammons',
'Jerome Segal', 'Dario Hunter', 'Jade Simmons', 'Phil Collins',
'Joe McHugh', 'Jesse Ventura', 'Mark Charles', 'Sheila Samm Tittle',
'Connie Gammon', 'John Richard Myers', 'Brooke Paige',
'President Boddie', 'Christopher LaFontaine', 'Kyle Kopitke',
'Tom Hoefling', 'Ricki Sue King', 'Princess Jacob-Fambro',
'Blake Huber', 'Richard Duncan', 'Joseph Kishore', 'Jordan Scott',
'Gary Swing', 'Keith McCormic', 'Zachary Scalf'],
dtype='object', name='candidate')
tep. reindex( columns= L) . head( )
candidate Joe Biden Donald Trump Jo Jorgensen Howie Hawkins Write-ins Rocky De La Fuente Gloria La Riva Kanye West Don Blankenship Brock Pierce ... Tom Hoefling Ricki Sue King Princess Jacob-Fambro Blake Huber Richard Duncan Joseph Kishore Jordan Scott Gary Swing Keith McCormic Zachary Scalf state Alabama 849648.0 1441168.0 25176.0 0.0 7312.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 Alaska 153405.0 189892.0 8896.0 0.0 34210.0 318.0 0.0 0.0 1127.0 825.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 Arizona 1672143.0 1661686.0 51465.0 0.0 2032.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 Arkansas 423932.0 760647.0 13133.0 2980.0 0.0 1321.0 1336.0 4099.0 2108.0 2141.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 California 11109764.0 6005961.0 187885.0 81025.0 80.0 60155.0 51036.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
5 rows × 38 columns
找出所有的Biden State
tep = df2. pivot_table( index= 'US County' , columns= 'candidate' , values= 'total_votes' , aggfunc = 'sum' ) [ [ 'Joe Biden' , 'Donald Trump' ] ]
tep = tep. fillna( 0 )
tep. head( )
candidate Joe Biden Donald Trump US County .Abbeville County, South Carolina 4101.0 8215.0 .Abbot, Maine 121.0 288.0 .Abington, Massachusetts 5209.0 4236.0 .Acadia Parish, Louisiana 5443.0 22596.0 .Accomack County, Virginia 7578.0 9172.0
tep[ 'BT' ] = tep[ 'Joe Biden' ] - tep[ 'Donald Trump' ]
tep
tep. head( )
candidate Joe Biden Donald Trump BT US County .Abbeville County, South Carolina 4101.0 8215.0 -4114.0 .Abbot, Maine 121.0 288.0 -167.0 .Abington, Massachusetts 5209.0 4236.0 973.0 .Acadia Parish, Louisiana 5443.0 22596.0 -17153.0 .Accomack County, Virginia 7578.0 9172.0 -1594.0
tep = tep. reset_index( [ 'US County' ] )
tep[ 'state' ] = tep[ 'US County' ] . str . split( "," ) . apply ( lambda x: x[ 1 ] )
tep. head( )
candidate US County Joe Biden Donald Trump BT state 0 .Abbeville County, South Carolina 4101.0 8215.0 -4114.0 South Carolina 1 .Abbot, Maine 121.0 288.0 -167.0 Maine 2 .Abington, Massachusetts 5209.0 4236.0 973.0 Massachusetts 3 .Acadia Parish, Louisiana 5443.0 22596.0 -17153.0 Louisiana 4 .Accomack County, Virginia 7578.0 9172.0 -1594.0 Virginia
sum ( tep. groupby( 'state' ) . agg( 'median' ) [ 'BT' ] > 0 )
9