Day8-綜合作業1(DataWhale)
import numpy as np
import pandas as pd
import math
任務1:企業收入的多樣性
一個企業的產業收入多樣性可以仿照資訊熵的概念來定義收入熵指標:
其中 p(x)是企業該年某產業收入額佔該年所有產業總收入的比重。在company.csv中存有需要計算的企業和年份,在company_data.csv中存有企業、各類收入額和收入年份的資訊。現請利用後一張表中的資料,在前一張表中增加一列表示該公司該年份的收入熵指標I
思路:
1.將company_data錶轉換位包含證券程式碼(需轉換)、日期(年)、熵值的表
2.證券編碼需要去除"#"後轉換為INT型
3.日期取年
4.按照年分組彙總資料,求出總計,再將彙總資料與分類資料進行求值
一定要注意將小於0的資料排除乾淨
df_com = pd.read_csv('練習題資料/Company.csv')
print(df_com.dtypes)
df_com.head(2)
證券程式碼 object
日期 int64
dtype: object
證券程式碼 | 日期 | |
---|---|---|
0 | #000007 | 2014 |
1 | #000403 | 2015 |
df_com_data = pd.read_csv('練習題資料/Company_data.csv')
df_com_data.head(2)
證券程式碼 | 日期 | 收入型別 | 收入額 | |
---|---|---|---|---|
0 | 1 | 2008/12/31 | 1 | 1.084218e+10 |
1 | 1 | 2008/12/31 | 2 | 1.259789e+10 |
1.首先將資料的日期轉換為年,之前檢視的時候以為日期列儲存的是日期型別,後來發現儲存的是字串,只需要擷取前四位即可。
A = list(df_com_data['日期'])
A = [i[:4] for i in A]
df_com_data['日期'] = A
df_com_data.head(2)
證券程式碼 | 日期 | 收入型別 | 收入額 | |
---|---|---|---|---|
0 | 1 | 2008 | 1 | 1.084218e+10 |
1 | 1 | 2008 | 2 | 1.259789e+10 |
2.將證券程式碼向前補0並加上"#",由於我們儲存的證券程式碼是INT型,需要轉為str之後再使用zfill填充0
B = df_com_data['證券程式碼']
B = ["#"+str(i).zfill(6) for i in B]
df_com_data['證券程式碼'] = B
df_com_data = df_com_data[df_com_data['收入額']>0]
df_com_data.head(2)
證券程式碼 | 日期 | 收入型別 | 收入額 | |
---|---|---|---|---|
0 | #000001 | 2008 | 1 | 1.084218e+10 |
1 | #000001 | 2008 | 2 | 1.259789e+10 |
3.求出依據證券程式碼,日期分組後的收入額的總和,並且需要檢視是否有負值的收入額,作為異常值清除掉。此處因為在groupby的時候會將列名作為索引,因此使用了ax_index=False,方便之後排除異常值
gb_data = df_com_data.groupby(['證券程式碼','日期'],as_index=False)['收入額'].sum()
gb_data = gb_data.rename(columns={"收入額":"收入總額"})
gb_data.head(2)
證券程式碼 | 日期 | 收入總額 | |
---|---|---|---|
0 | #000001 | 2008 | 7.402176e+10 |
1 | #000001 | 2009 | 4.771900e+10 |
4.現在我們將得到的最終聚合資料與company_data進行拼接,之後求得p(i)的值
def Pi(x):
Income = x['收入額']
Income_ALL = x['收入總額']
Pi_value = Income/Income_ALL
return Pi_value.sum()
merge_data = df_com_data.merge(gb_data, left_on=['證券程式碼','日期'], right_on=['證券程式碼','日期'], how='left')
com_gb = merge_data.groupby(['證券程式碼','日期','收入型別'])[['收入額','收入總額']]
com_gb.apply(Pi)
com_gb = pd.DataFrame(com_gb.apply(Pi))
com_gb1 = com_gb.reset_index()
com_gb1 = com_gb.rename(columns = {0:'P'})
com_gb1['logP'] = com_gb1.apply(lambda x : math.log(x['P'],2) ,axis=1)
com_gb1['P*logP'] = com_gb1.apply(lambda x : x['P']*x['logP'] ,axis=1)
5.將com_gb中去掉型別,按照證券編號、日期,求得我們想要的I值,最後用merge將值拼入df_com中
com_gb2 = com_gb1.groupby(['證券程式碼','日期'])['P*logP'].sum()
com_gb3 = pd.DataFrame(com_gb2)
com_gb3 = com_gb3.reset_index()
com_gb3 = com_gb3.rename(columns = {'P*logP':'I'})
com_gb3['日期'] = com_gb3['日期'].astype(int) #一定要賦值
com_gb3.head()
com_gb3.dtypes
證券程式碼 object
日期 int32
I float64
dtype: object
注意:此處我遇到了一個問題:兩張表中的日期的型別不一致,所以需要將日期型別轉換為一致才能使用merge
com_data = df_com.merge(com_gb3, on = ['證券程式碼','日期'], how='left')
com_data.head()
證券程式碼 | 日期 | I | |
---|---|---|---|
0 | #000007 | 2014 | -4.429740 |
1 | #000403 | 2015 | -4.025963 |
2 | #000408 | 2016 | -4.066295 |
3 | #000408 | 2017 | NaN |
4 | #000426 | 2015 | -4.449655 |
任務2:組隊學習資訊表的變換
請把組隊學習的隊伍資訊表變換為如下形態,其中“是否隊長”一列取1表示隊長,否則為0
1.通過read_excel讀取資料,並觀察資料與目標資料的差異,發現我們源資料擁有多列的編號和名稱,我們需要將編號和名稱轉換位列,保留隊伍名稱,對於沒有存值的編號和暱稱,我們需要將他們去除
df = pd.read_excel('練習題資料/組隊資訊彙總表(Pandas).xlsx')
df.head(2)
所在群 | 隊伍名稱 | 隊長編號 | 隊長_群暱稱 | 隊員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 rows × 24 columns
colum = ['所在群','隊伍名稱','編號-0','暱稱-0','編號-1','暱稱-1','編號-2','暱稱-2','編號-3','暱稱-3','編號-4','暱稱-4','編號-5','暱稱-5','編號-6','暱稱-6','編號-7','暱稱-7','編號-8','暱稱-8','編號-9','暱稱-9','編號-10','暱稱-10']
df.columns=colum
df.head(2)
所在群 | 隊伍名稱 | 編號-0 | 暱稱-0 | 編號-1 | 暱稱-1 | 編號-2 | 暱稱-2 | 編號-3 | 暱稱-3 | ... | 編號-6 | 暱稱-6 | 編號-7 | 暱稱-7 | 編號-8 | 暱稱-8 | 編號-9 | 暱稱-9 | 編號-10 | 暱稱-10 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 rows × 24 columns
2.多列轉行,我們考慮使用wide_to_long,先對列名進行整理,最後再將多餘資料進行刪除處理。這個過程中編號第一次轉換的是float型,需要將他轉換為Int型,這裡使用astype; 在進行是否為隊長的匹配的時候,注意一定要將取出來的值轉換為list
df1 = pd.wide_to_long(df,
stubnames=['編號','暱稱'],
i = ['所在群','隊伍名稱'],
j = '編碼',
sep='-',
suffix='.+')
df2 = df1[df1['編號'].notnull()]
df2 = df2.reset_index()
df2 = df2[['隊伍名稱','編號','暱稱']]
df2['編號'] = df2['編號'].astype(int)
df2.head()
隊伍名稱 | 編號 | 暱稱 | |
---|---|---|---|
0 | 你說的都對隊 | 5 | 山楓葉紛飛 |
1 | 你說的都對隊 | 6 | 蔡 |
2 | 你說的都對隊 | 7 | 安慕希 |
3 | 你說的都對隊 | 8 | 信仰 |
4 | 你說的都對隊 | 20 | biubiu?? |
list1 = list(df['編號-0'].astype(int)) ## 此處一定要轉換為列表
df2['是否隊長'] = df2.apply(lambda x: 1 if x['編號'] in list1 else 0 ,axis=1) #axis=1按行
df2.head()
隊伍名稱 | 編號 | 暱稱 | 是否隊長 | |
---|---|---|---|---|
0 | 你說的都對隊 | 5 | 山楓葉紛飛 | 1 |
1 | 你說的都對隊 | 6 | 蔡 | 0 |
2 | 你說的都對隊 | 7 | 安慕希 | 0 |
3 | 你說的都對隊 | 8 | 信仰 | 0 |
4 | 你說的都對隊 | 20 | biubiu?? | 0 |
3.將列名的順序與原表保持一致
(此處call一下我們組的小可愛們~)
cols = ['是否隊長','隊伍名稱','暱稱','編號']
df_data = df2.loc[:,cols]
df_data[df_data['隊伍名稱'] == '不急不躁我最棒✌️']
是否隊長 | 隊伍名稱 | 暱稱 | 編號 | |
---|---|---|---|---|
82 | 1 | 不急不躁我最棒✌️ | Lyndsey | 2 |
83 | 0 | 不急不躁我最棒✌️ | Roman. | 90 |
84 | 0 | 不急不躁我最棒✌️ | 李鬆澤 Orwell | 91 |
85 | 0 | 不急不躁我最棒✌️ | L. | 115 |
86 | 0 | 不急不躁我最棒✌️ | 阿塗 | 163 |
87 | 0 | 不急不躁我最棒✌️ | YHY | 68 |
88 | 0 | 不急不躁我最棒✌️ | 佬仔 | 62 |
89 | 0 | 不急不躁我最棒✌️ | JWJ | 30 |
90 | 0 | 不急不躁我最棒✌️ | ? | 154 |
任務3:美國大選投票情況
兩張資料表中分別給出了美國各縣(county)的人口數以及大選的投票情況,請解決以下問題:
county = pd.read_csv('練習題資料/county_population.csv')
county.head(2)
US County | Population | |
---|---|---|
0 | .Autauga County, Alabama | 55869 |
1 | .Baldwin County, Alabama | 223234 |
vote = pd.read_csv('練習題資料/president_county_candidate.csv')
vote.head(2)
state | county | candidate | party | total_votes | won | |
---|---|---|---|---|---|---|
0 | Delaware | Kent County | Joe Biden | DEM | 44552 | True |
1 | Delaware | Kent County | Donald Trump | REP | 41009 | False |
問題1:有多少縣滿足總投票數超過縣人口數的一半
1.觀察資料,發現county的US County包含了vote中的county和state欄位,因此要先對資料進行處理,得到一個主鍵,之後再將滿足條件的值選擇出來
vote['US County'] = vote.apply(lambda x :'.'+x['county']+', '+x['state'],axis=1)
vote.head(2)
state | county | candidate | party | total_votes | won | t | US County | |
---|---|---|---|---|---|---|---|---|
0 | Delaware | Kent County | Joe Biden | DEM | 44552 | True | NaN | .Kent County, Delaware |
1 | Delaware | Kent County | Donald Trump | REP | 41009 | False | NaN | .Kent County, Delaware |
vote_sum = vote.groupby(['US County'])['total_votes'].sum()
vote_sum = vote_sum.to_frame()
vote_sum.reset_index()
vote_sum.head()
total_votes | |
---|---|
US County | |
.Abbeville County, South Carolina | 12433 |
.Abbot, Maine | 417 |
.Abington, Massachusetts | 9660 |
.Acadia Parish, Louisiana | 28425 |
.Accomack County, Virginia | 16962 |
county_vote_sum = county.merge(vote_sum, on=['US County'], how='left')
county_1 = county_vote_sum[county_vote_sum['total_votes']/county_vote_sum['Population']>0.5]
county_1['US County'].head()
11 .Choctaw County, Alabama
12 .Clarke County, Alabama
13 .Clay County, Alabama
16 .Colbert County, Alabama
17 .Conecuh County, Alabama
Name: US County, dtype: object
問題2:把州(state)作為行索引,把投票候選人作為列名,列名的順序按照候選人在全美的總票數由高到低排序,行列對應的元素為該候選人在該州獲得的總票數
1.根據問題的理解,也就是要將候選人轉換為列
vote2 = vote[['state','candidate','total_votes']]
vote2.head(2)
state | candidate | total_votes | |
---|---|---|---|
0 | Delaware | Joe Biden | 44552 |
1 | Delaware | Donald Trump | 41009 |
pivot_vote = vote2.pivot_table(index = 'state',
columns = 'candidate',
values = 'total_votes',
aggfunc='sum')
pivot_vote.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 | NaN | 7312.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Alaska | NaN | 34210.0 | NaN | NaN | NaN | NaN | 825.0 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | 318.0 | NaN | NaN | NaN |
Arizona | NaN | 2032.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Arkansas | NaN | NaN | NaN | NaN | NaN | 1713.0 | 2141.0 | NaN | NaN | 1475.0 | ... | NaN | 2812.0 | NaN | NaN | NaN | NaN | 1321.0 | NaN | NaN | NaN |
California | NaN | 80.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | 60155.0 | NaN | NaN | NaN |
5 rows × 38 columns
2.將列的順序按照總票數進行調整,這裡先找到候選人和總票數,之後再進行排序,最後再進行列調整。
注意:做了reset_index()之後一定要賦值到原來的表,否則原表再次使用的時候依然不會變
rank = vote2.groupby('candidate')['total_votes'].sum()
rank = rank.to_frame()
rank2 = rank.sort_values('total_votes', ascending = False)
rank2 = rank2.reset_index()
new_rank = list(rank2['candidate'])
state_vote = pivot_vote.loc[:,new_rank]
state_vote.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 | NaN | 7312.0 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Alaska | 153405.0 | 189892.0 | 8896.0 | NaN | 34210.0 | 318.0 | NaN | NaN | 1127.0 | 825.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Arizona | 1672143.0 | 1661686.0 | 51465.0 | NaN | 2032.0 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Arkansas | 423932.0 | 760647.0 | 13133.0 | 2980.0 | NaN | 1321.0 | 1336.0 | 4099.0 | 2108.0 | 2141.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
California | 11109764.0 | 6005961.0 | 187885.0 | 81025.0 | 80.0 | 60155.0 | 51036.0 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
5 rows × 38 columns
問題3:每一個州下設若干縣,定義拜登在該縣的得票率減去川普在該縣的得票率為該縣的BT指標,若某個州所有縣BT指標的中位數大於0,則稱該州為Biden State,請找出所有的Biden State
1.首先我們將資料篩選出僅有拜登和川普的資料,此處使用isin,接著將拜登和川普放置到列,方便我們之後拼接總的的票數和BT指標的中位數
df_vote = vote[vote['candidate'].isin(['Joe Biden','Donald Trump'])]
df_vote1 = df_vote[['state','county','candidate','total_votes']]
df_vote2 = df_vote1.pivot_table(index = ['state','county'],
columns = 'candidate',
values = 'total_votes',
aggfunc='sum')
df_vote2.head()
candidate | Donald Trump | Joe Biden | |
---|---|---|---|
state | county | ||
Alabama | Autauga County | 19838 | 7503 |
Baldwin County | 83544 | 24578 | |
Barbour County | 5622 | 4816 | |
Bibb County | 7525 | 1986 | |
Blount County | 24711 | 2640 |
2.開始計算得票率,首先找到縣的總投票數,然後將他拼入上面的表中,計算出得票率,再計算出該縣的BT指標
county_vote = vote.groupby(['state','county'])['total_votes'].sum()
county_rate = df_vote2.merge(county_vote, on=['state','county'] ,how='left')
county_rate['Donald Trump'] =county_rate['Donald Trump']/county_rate['total_votes']
county_rate['Joe Biden'] =county_rate['Joe Biden']/county_rate['total_votes']
county_rate['BT'] = county_rate['Joe Biden'] - county_rate['Donald Trump']
county_rate.head()
Donald Trump | Joe Biden | total_votes | BT | ||
---|---|---|---|---|---|
state | county | ||||
Alabama | Autauga County | 0.714368 | 0.270184 | 27770 | -0.444184 |
Baldwin County | 0.761714 | 0.224090 | 109679 | -0.537623 | |
Barbour County | 0.534512 | 0.457882 | 10518 | -0.076631 | |
Bibb County | 0.784263 | 0.206983 | 9595 | -0.577280 | |
Blount County | 0.895716 | 0.095694 | 27588 | -0.800022 |
3.計算該縣的BT指標的中位數
rate_date = county_rate.groupby('state')['BT'].median()
rate_date = rate_date.reset_index()
BidenState = rate_date[rate_date['BT']>0]
BidenState
state | BT | |
---|---|---|
4 | California | 0.084957 |
6 | Connecticut | 0.082626 |
7 | Delaware | 0.040712 |
8 | District of Columbia | 0.895536 |
11 | Hawaii | 0.321145 |
21 | Massachusetts | 0.251015 |
30 | New Jersey | 0.066718 |
39 | Rhode Island | 0.136207 |
45 | Vermont | 0.242156 |
相關文章
- Day5-SQL綜合練習(Datawhale)SQL
- 推薦系統 task 1 @datawhale
- Datawhale DRL task1 隨筆
- Datawhale
- 教資 - 綜合(1)
- [Datawhale AI 夏令營] Task1: 跑通YOLO方案baselineAIYOLO
- Datawhale X 魔搭 AI夏令營 AIGC方向 Task1AIGC
- Datawhale 第20期 資料視覺化Task1視覺化
- Datawhale中期考核
- JVM篇1:[-結構綜述-]JVM
- Datawhale-爬蟲-Task1(學習get與post請求)爬蟲
- 加法、乘法、除法:綜合謎題(1)
- Datawhale X 李宏毅蘋果書 AI夏令營task1筆記蘋果AI筆記
- Datawhale-MySQL-任務三MySql
- Datawhale-MySQL-任務二MySql
- Datawhale-MySQL-任務五MySql
- 【Datawhale】動手學資料分析
- DataWhale17期-task5
- Day5-Python變形(DataWhale)Python
- 程式設計實踐(Pandas)綜合練習1程式設計
- 2020年最全前端業務安全綜述前端
- Datawhale X 魔搭 AI夏令營(三)AI
- Datawhale-爬蟲-Task3(beautifulsoup)爬蟲
- 【Datawhale】推薦系統-協同過濾
- [SQL] Datawhale 學習筆記 Task04SQL筆記
- Datawhale-MySQL-任務四(表聯結)MySql
- 共享辦公室,推送企業緊密合作
- Yotta企業雲盤,提升各大行業跨部門合作效率行業
- Datawhale學資料分析第一章
- datawhale_Day4_task09_線性代數
- Datawhale-爬蟲-Task5(selenium學習)爬蟲
- Datawhale-MySQL-任務六(複雜專案)MySql
- Datawhale-爬蟲-Task4(學習xpath)爬蟲
- 2019年1月份京城汽車市場綜合分析
- 亞馬遜雲科技升級“3+1”合作伙伴戰略 與合作伙伴共赴新徵程亞馬遜
- 深度合作資源共享,中手遊與華為達成遊戲業務戰略合作遊戲
- 資料採集與技術融合作業3
- 雲桌面解決方案 企業最佳合作伙伴