主頁 > 後端開發 > Pandas 11-綜合練習

Pandas 11-綜合練習

2021-01-03 10:19:51 後端開發

Pandas 11-綜合練習

import pandas as pd
import numpy as np
np.seterr(all = 'ignore')
{'divide': 'ignore', 'over': 'ignore', 'under': 'ignore', 'invalid': 'ignore'}

【任務一】企業收入的多樣性

【題目描述】一個企業的產業收入多樣性可以仿照資訊熵的概念來定義收入熵指標 :
I = ? ∑ i p ( x i ) l o g ( p ( x i ) ) I=-\sum_i{p(x_i)log(p(x_i))} I=?i?p(xi?)log(p(xi?))
其中 p ( x i ) p(x_i) p(xi?)是企業該年某產業收入額占該年所有產業總收入的比重,
company.csv中存有需要計算的企業和年份 , 在company_data.csv中存有企業、各類收入額和收入年份的資訊,現請利用后一張表中的資料 , 在前一張表中增加一串列示該公司該年份的收入熵指標I
【資料下載】鏈接:https://pan.baidu.com/s/1leZZctxMUSW55kZY5WwgIw 53 密碼:u6fd

My solution :

  • 讀取兩表資料
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表中證券代碼列里的#去掉轉為int
  • df2日期列取前四位year轉為int
df1_ = df1.copy()
df1_['證券代碼'] = df1_['證券代碼'].str[1:].astype('int64')
df2['日期'] = df2['日期'].str[:4].astype('int64')
  • 定義entropy函式計算資訊熵 , 并跳過NaN
  • df1表左連接df2表 , 連接列為證券代碼和日期 , 再繼續對這兩列分組 , 取出收入額列用apply呼叫資訊熵函式 , 重置索引
def entropy(x):
    if x.any():
        p = x/x.sum()
        return -(p*np.log2(p)).sum()
    return np.nan
res = df1_.merge(df2, on=['證券代碼','日期'], how='left').groupby(['證券代碼','日期'])['收入額'].apply(entropy).reset_index()
res.head()
證券代碼日期收入額
0720144.429740
140320154.025963
240820164.066295
34082017NaN
442620154.449655
  • df1表新增一列收入熵指標 , 值為結果表中的收入額
df1['收入熵指標'] = res['收入額']
df1
證券代碼日期收入熵指標
0#00000720144.429740
1#00040320154.025963
2#00040820164.066295
3#0004082017NaN
4#00042620154.449655
............
1043#60097820114.788391
1044#60097820144.022378
1045#60097820154.346303
1046#60097820164.358608
1047#6009782017NaN

1048 rows × 3 columns

  • 將上述所有程序封裝為函式 , 并測驗性能
def information_entropy():
    df1 = pd.read_csv('company.csv')
    df2 = pd.read_csv('company_data.csv')
    df1_ = df1.copy()
    df1_['證券代碼'] = df1_['證券代碼'].str[1:].astype('int64')
    df2['日期'] = df2['日期'].str[:4].astype('int64')
    res = df1_.merge(df2, on=['證券代碼','日期'], how='left').groupby(['證券代碼','日期'])['收入額'].apply(entropy).reset_index()
    df1['收入熵指標'] = res['收入額']
    return df1
%timeit -n 5 information_entropy()
1.62 s ± 44.5 ms per loop (mean ± std. dev. of 7 runs, 5 loops each)

【任務二】組隊學習資訊表的變換

【題目描述】請把組隊學習的隊伍資訊表變換為如下形態,其中'是否隊長'一列取1表示隊長,否則為0
在這里插入圖片描述
【資料下載】鏈接:https://pan.baidu.com/s/1ses24cTwUCbMx3rvYXaz-Q 34 密碼:iz57

My solution :

  • 讀取資料
df = pd.read_excel('組隊資訊匯總表_Pandas.xlsx')
  • 所在群列沒有用到 , drop
df.drop(columns='所在群', inplace=True)
df.head(2)
隊伍名稱隊長編號隊長_群昵稱隊員1 編號隊員_群昵稱隊員2 編號隊員_群昵稱.1隊員3 編號隊員_群昵稱.2隊員4 編號...隊員6 編號隊員_群昵稱.5隊員7 編號隊員_群昵稱.6隊員8 編號隊員_群昵稱.7隊員9 編號隊員_群昵稱.8隊員10編號隊員_群昵稱.9
0你說的都對隊5山楓葉紛飛67.0安慕希8.0信仰20.0...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1熊貓人175魚呲呲44Heaven37.0呂青50.0余柳成蔭82.0...25.0Never say never55.0K120.0Y.28.0X.Y.Q151.0swrong

2 rows × 23 columns

  • 為了使用wide_to_long將寬表轉長表 ,需要先對表columns進行重命名
  • 對照結果表中的名字 , 分別將隊長和隊員用leadermember區分 , 結果表中隊長和隊員分別用10分類 , 不妨在重命名時就先分好類 , 在重命名的末尾追加10,最后直接取出字串最后一位即可
col_1 = np.array(['隊伍名稱','編號_leader01','昵稱_leader01'])
col_2 = np.array([[f'編號_member{i}0', f'昵稱_member{i}0']for i in range(1,11)]).flatten()
df.columns = np.r_[col_1,col_2]
df.head(2)
隊伍名稱編號_leader01昵稱_leader01編號_member10昵稱_member10編號_member20昵稱_member20編號_member30昵稱_member30編號_member40...編號_member60昵稱_member60編號_member70昵稱_member70編號_member80昵稱_member80編號_member90昵稱_member90編號_member100昵稱_member100
0你說的都對隊5山楓葉紛飛67.0安慕希8.0信仰20.0...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1熊貓人175魚呲呲44Heaven37.0呂青50.0余柳成蔭82.0...25.0Never say never55.0K120.0Y.28.0X.Y.Q151.0swrong

2 rows × 23 columns

  • 將重命名好的表用wide_to_long轉換為長表 , 命名對照結果表 , 省的還要再重命名
  • 轉換后dropna洗掉NaN值 , 恢復索引
res = pd.wide_to_long(  df.reset_index(),
                        stubnames = ['昵稱','編號'],
                        i = ['index','隊伍名稱'],
                        j = '是否隊長',
                        sep = '_',
                        suffix = '.+').dropna().reset_index().drop(columns='index')
res
隊伍名稱是否隊長昵稱編號
0你說的都對隊leader01山楓葉紛飛5.0
1你說的都對隊member106.0
2你說的都對隊member20安慕希7.0
3你說的都對隊member30信仰8.0
4你說的都對隊member40biubiu🙈🙈20.0
...............
141七星聯盟member40Daisy63.0
142七星聯盟member50One Better131.0
143七星聯盟member60rain112.0
144應如是leader01思無邪54.0
145應如是member10Justzer058.0

146 rows × 4 columns

  • 到這里已經接近結果了 , 把是否隊長一列的值最后一個取出最為該列的分類
  • 編號列的型別為float轉為int
  • 是否隊長和隊伍名稱兩列順序倒了 , 恢復一下即可
res['是否隊長'],res['編號'] = res['是否隊長'].str[-1],res['編號'].astype('int64')
res.reindex(columns=['是否隊長','隊伍名稱','昵稱','編號'])
是否隊長隊伍名稱昵稱編號
01你說的都對隊山楓葉紛飛5
10你說的都對隊6
20你說的都對隊安慕希7
30你說的都對隊信仰8
40你說的都對隊biubiu🙈🙈20
...............
1410七星聯盟Daisy63
1420七星聯盟One Better131
1430七星聯盟rain112
1441應如是思無邪54
1450應如是Justzer058

146 rows × 4 columns

  • 將上述所有程序封裝為函式 , 并測驗性能
def transform_table():
    df = pd.read_excel('組隊資訊匯總表_Pandas.xlsx')
    df.drop(columns='所在群', inplace=True)
    col_1 = np.array(['隊伍名稱','編號_leader01','昵稱_leader01'])
    col_2 = np.array([[f'編號_member{i}0', f'昵稱_member{i}0']for i in range(1,11)]).flatten()
    df.columns = np.r_[col_1,col_2]
    res = pd.wide_to_long(  df.reset_index(),
                            stubnames = ['昵稱','編號'],
                            i = ['index','隊伍名稱'],
                            j = '是否隊長',
                            sep = '_',
                            suffix = '.+').dropna().reset_index().drop(columns='index')
    res['是否隊長'], res['編號'] = res['是否隊長'].str[-1], res['編號'].astype('int64')
    res.reindex(columns=['是否隊長','隊伍名稱','昵稱','編號'])
%timeit -n 50 transform_table()
45.7 ms ± 3 ms per loop (mean ± std. dev. of 7 runs, 50 loops each)

【任務三】美國大選投票情況

【題目描述】兩張資料表中分別給出了美國各縣(county)的人口數以及大選的投票情況 , 請解決以下問題 :

  1. 有多少縣滿足總投票數超過縣人口數的一半
  2. 把州(state)作為行索引 , 把投票候選人作為列名 , 列名的順序按照候選人在全美的總票數由高到低排序 , 行列對應的元素為該候選人在該州獲得的總票數
此處是一個樣例,實際的州或人名用原表的英語代替
		                拜登   川普
			  威斯康星州   2      1
			  德克薩斯州   3      4
  1. 每一個州下設若干縣 , 定義拜登在該縣的得票率減去川普在該縣的得票率為該縣的BT指標 , 若某個州所有縣BT指標的中位數大于0 , 則稱該州為Biden State , 請找出所有的Biden State

【資料下載】鏈接:https://pan.baidu.com/s/182rr3CpstVux2CFdFd_Pcg 32 提取碼:q674

My solution :

  • 讀取兩表資料
df1 = pd.read_csv('president_county_candidate.csv')
df2 = pd.read_csv('county_population.csv')
df1.head()
statecountycandidatepartytotal_voteswon
0DelawareKent CountyJoe BidenDEM44552True
1DelawareKent CountyDonald TrumpREP41009False
2DelawareKent CountyJo JorgensenLIB1044False
3DelawareKent CountyHowie HawkinsGRN420False
4DelawareNew Castle CountyJoe BidenDEM195034True
df2.head()
US CountyPopulation
0.Autauga County, Alabama55869
1.Baldwin County, Alabama223234
2.Barbour County, Alabama24686
3.Bibb County, Alabama22394
4.Blount County, Alabama57826
  • 為了后續分組或合并操作 , 先統一statecounty列名和值
  • df2US County,拆分 , 注意逗號后還有個空格 , 否則拆分后值并不相同
df2[['county','state']] = pd.DataFrame([*df2['US County'].str.split(', ')])
df2.county = df2.county.str[1:]
df2.drop(columns='US County', inplace=True)
df2.head()
Populationcountystate
055869Autauga CountyAlabama
1223234Baldwin CountyAlabama
224686Barbour CountyAlabama
322394Bibb CountyAlabama
457826Blount CountyAlabama

1. 有多少縣滿足總投票數超過縣人口數的一半 ?

  • df1statecounty分組 , 求和計算每個county總票數
  • 再與df2statecounty兩列merge , 將Population轉移過來
df_merge = df1.groupby(['state','county'])['total_votes'].sum().reset_index().merge(df2, on=['state','county'], how='left')
df_merge.head()
statecountytotal_votesPopulation
0AlabamaAutauga County2777055869.0
1AlabamaBaldwin County109679223234.0
2AlabamaBarbour County1051824686.0
3AlabamaBibb County959522394.0
4AlabamaBlount County2758857826.0
  • 對上述結果取出total_votesPopulation作比較篩選出即可
df_merge[df_merge['total_votes'] > 0.5*df_merge['Population']]
statecountytotal_votesPopulation
11AlabamaChoctaw County746412589.0
12AlabamaClarke County1313523622.0
13AlabamaClay County693013235.0
16AlabamaColbert County2788655241.0
17AlabamaConecuh County644112067.0
...............
4626WyomingSheridan County1642830485.0
4627WyomingSublette County49709831.0
4629WyomingTeton County1467723464.0
4631WyomingWashakie County40127805.0
4632WyomingWeston County35426927.0

1434 rows × 4 columns

2. 把州(state)作為行索引 , 把投票候選人作為列名 , 列名的順序按照候選人在全美的總票數由高到低排序 , 行列對應的元素為該候選人在該州獲得的總票數

  • 依題意可以用pivot_table透視 , 填入行和列 , 對同一位置用sum聚合 , 打開margins匯總 , 對最后一行All降序排列
  • 可以看到第一列是每行的匯總 , 也就是每個state的匯總 , 第二列是Biden最高票 , Trump緊隨其后
df1.pivot_table(values = ['total_votes'],
                index = ['state'],
                columns = 'candidate',
                aggfunc = 'sum',
                margins = True).sort_values('All', 1, ascending=False).head()
total_votes
candidateAllJoe BidenDonald TrumpJo JorgensenHowie HawkinsWrite-insRocky De La FuenteGloria La RivaKanye WestDon Blankenship...Tom HoeflingRicki Sue KingPrincess Jacob-FambroBlake HuberRichard DuncanJoseph KishoreJordan ScottGary SwingKeith McCormicZachary Scalf
state
Alabama2323304849648.01441168.025176.0NaN7312.0NaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
Alaska391346153405.0189892.08896.0NaN34210.0318.0NaNNaN1127.0...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
Arizona33873261672143.01661686.051465.0NaN2032.0NaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
Arkansas1219069423932.0760647.013133.02980.0NaN1321.01336.04099.02108.0...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
California1749590611109764.06005961.0187885.081025.080.060155.051036.0NaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN

5 rows × 39 columns

3. 每一個州下設若干縣 , 定義拜登在該縣的得票率減去川普在該縣的得票率為該縣的BT指標 , 若某個州所有縣BT指標的中位數大于0 , 則稱該州為Biden State , 請找出所有的Biden State
方法一 :

  • 定義一個計算BT指標的函式 , 分別取出Biden的票數 , Trump的票數 , 計算每個county總票數 , 做差相除得到BT
  • statecounty分組 , 取出candidatetotal_votes兩列呼叫apply計算BT
def BT(x):
    biden = x[x['candidate']=='Joe Biden']['total_votes'].values
    trump = x[x['candidate']=='Donald Trump']['total_votes'].values
    return pd.Series((biden-trump)/x['total_votes'].sum(), index=['BT'])   
bt = df1.groupby(['state','county'])[['candidate','total_votes']].apply(BT)
bt.head()
BT
statecounty
AlabamaAutauga County-0.444184
Baldwin County-0.537623
Barbour County-0.076631
Bibb County-0.577280
Blount County-0.800022
  • bt結果恢復索引重新對state分組 , 用filter過濾每個statecountyBT指標中位數是否大于0
  • state去重后即滿足條件的所有state , 只有9
bt.reset_index().groupby('state').filter(lambda x:x.BT.median()>0)[['state']].drop_duplicates()
state
197California
319Connecticut
488Delaware
491District of Columbia
725Hawaii
1878Massachusetts
2999New Jersey
3536Rhode Island
4065Vermont

方法二 :

  • 分別用bool條件取出bidentrump的所有行 , 再對statecounty分組求出每個county的總票數
  • 這三個df巧了都是一樣的大小 , 說明每個county都有bidentrump的票
biden_df = df1[df1['candidate']=='Joe Biden'][['state','county','total_votes']]
trump_df = df1[df1['candidate']=='Donald Trump'][['state','county','total_votes']]
sum_df = df1.groupby(['state','county'])[['total_votes']].sum().reset_index()
  • 將上述三個一樣大的df合并
res = biden_df.merge(trump_df, on=['state','county'] ,suffixes=('_biden','_trump')).merge(sum_df, on=['state','county'])
res.head()
statecountytotal_votes_bidentotal_votes_trumptotal_votes
0DelawareKent County445524100987025
1DelawareNew Castle County19503488364287633
2DelawareSussex County5668271230129352
3District of ColumbiaDistrict of Columbia39041172541681
4District of ColumbiaWard 229078291832881
  • 分別取出biden列和trump列做差后除以sum列得出BT指標
res['BT'] = (res['total_votes_biden']-res['total_votes_trump'])/res['total_votes']
res.head()
statecountytotal_votes_bidentotal_votes_trumptotal_votesBT
0DelawareKent County4455241009870250.040712
1DelawareNew Castle County195034883642876330.370855
2DelawareSussex County5668271230129352-0.112468
3District of ColumbiaDistrict of Columbia390411725416810.895276
4District of ColumbiaWard 2290782918328810.795596
  • 同樣的 , 按要求過濾后取出所有滿足條件的state , 也是9
res[['state','BT']].groupby('state').filter(lambda x:x.median()>0)[['state']].drop_duplicates()
state
0Delaware
3District of Columbia
237Hawaii
1390Massachusetts
2511New Jersey
3048Rhode Island
3577Vermont
4327California
4449Connecticut
  • 下面將上述兩種方法分別封裝成方法 , 并測驗性能
def method1():
    bt = df1.groupby(['state','county'])[['candidate','total_votes']].apply(BT)
    bt.reset_index().groupby('state').filter(lambda x:x.BT.median()>0)[['state']].drop_duplicates()
def method2():
    biden_df = df1[df1['candidate']=='Joe Biden'][['state','county','total_votes']]
    trump_df = df1[df1['candidate']=='Donald Trump'][['state','county','total_votes']]
    sum_df = df1.groupby(['state','county'])[['total_votes']].sum().reset_index()
    res = biden_df.merge(trump_df, on=['state','county'] ,suffixes=('_biden','_trump')).merge(sum_df, on=['state','county'])
    res['BT'] = (res['total_votes_biden']-res['total_votes_trump'])/res['total_votes']
    res[['state','BT']].groupby('state').filter(lambda x:x.median()>0)[['state']].drop_duplicates()
%timeit method1()
6.56 s ± 210 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit method2()
90.9 ms ± 4.83 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
  • 可以看到方法二雖然拆分好多步驟 , 但是沒有用apply呼叫自定義函式 , 性能強到飛起

【任務四】計算城市間的距離矩陣

【題目描述】資料中給出了若干城市的經緯度,請構造關于城市的距離DataFrame ,其橫縱索引為城市名稱 , 值為矩陣 M M M , M i j M_ij Mi?j表示城市i與城市j間的球面距離(可以利用geopy包中distance模塊的geodesic函式),并規定與自身的距離為0

My solution :

  • 讀取表資料 , 以,分割 , 并重命名列名
df = pd.read_table('map.txt', sep=',', names=['city1','longitude','latitude'], skiprows=1)
df.head()
city1longitudelatitude
0沈陽市123.42909241.796768
1長春市125.32450143.886841
2哈爾濱市126.64246445.756966
3北京市116.40528939.904987
4天津市117.19018639.125595
  • 將緯度和經度打包成元組供后面計算距離用
  • 洗掉原來的兩列經緯度
df['coord1'] = pd.Series([*zip(df.latitude, df.longitude)])
df.drop(columns=['longitude','latitude'], inplace=True)
df.head(3)
city1coord1
0沈陽市(41.796768, 123.429092)
1長春市(43.886841, 125.324501)
2哈爾濱市(45.756966, 126.64246399999999)
  • 復制一份df表 , 并重命名列名加以區分 , 并設定city2index , 為后續透視表做準備
df2 = df.rename(columns={'city1':'city2','coord1':'coord2'}).set_index('city2')
df2.head(3)
coord2
city2
沈陽市(41.796768, 123.429092)
長春市(43.886841, 125.324501)
哈爾濱市(45.756966, 126.64246399999999)
  • dfdf2擴展 , 先借用groupbydf兩列分組 , 看似分了個寂寞 , 實則用applydf2一個一個拼上去了 , 將原表在索引里的坐標coord1恢復到資料列 , 用stack把列移下來做一個reshape , 再重置索引 , 將空列名起個名字coords , 這一列都是坐標了 , 為后續透視表做完了準備
df_expand = df.groupby(['city1','coord1']).apply(lambda x:df2).reset_index(1).stack().reset_index().rename(columns={0:'coords'})
df_expand.head(3)
city1city2level_2coords
0上海市沈陽市coord1(31.231707, 121.472641)
1上海市沈陽市coord2(41.796768, 123.429092)
2上海市長春市coord1(31.231707, 121.472641)
  • 匯入計算距離的函式geodesic
  • 將上述準備好的表進行透視 , 并對透視結果坐標列用geodesic計算距離 , 用km做單位 , 再保留兩位小數
from geopy.distance import geodesic
df_expand.pivot_table(values = 'coords',
                      index = 'city1',
                      columns = 'city2',
                      aggfunc = lambda x : geodesic(*x).km
                     ).round(2).head(3)
city2上海市烏魯木齊市蘭州市北京市南京市南寧市南昌市臺北市合肥市呼和浩特市...福州市西寧市西安市貴陽市鄭州市重慶市銀川市長春市長沙市香港
city1
上海市0.003272.691718.731065.83271.871601.34608.49687.22403.871378.10...609.421912.401220.031527.44827.471449.731606.181444.77887.531229.26
烏魯木齊市3272.690.001627.852416.783010.733005.603023.063708.722907.562009.15...3466.841443.792120.862572.822448.762305.961666.743004.862850.223415.02
蘭州市1718.731627.850.001182.611447.271529.941397.552085.951326.02870.72...1841.48194.64506.741086.41904.20765.89343.022023.001226.071826.19

3 rows × 34 columns

  • 將上述所有程序封裝為函式 , 并測驗性能
def calculate_M():
    df = pd.read_table('map.txt', sep=',', names=['city1','longitude','latitude'], skiprows=1)
    df['coord1'] = pd.Series([*zip(df.latitude, df.longitude)])
    df.drop(columns=['longitude','latitude'], inplace=True)
    df2 = df.rename(columns={'city1':'city2', 'coord1':'coord2'}).set_index('city2')
    df_expand = df.groupby(['city1','coord1']).apply(lambda x:df2).reset_index(1).stack().reset_index().rename(columns={0:'coords'})
    return df_expand.pivot_table(values = 'coords',
                                  index = 'city1',
                                  columns = 'city2',
                                  aggfunc = lambda x : geodesic(*x).km
                                 ).round(2)
%timeit -n 10 calculate_M()
395 ms ± 23.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

附錄 :

geopy

  1. 根據城市名查城市位置
  • 創建定位器 :
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36")
  • 根據城市名稱查詢位置 :
location = geolocator.geocode("南京市雨花臺區")
location.address
'雨花臺區, 南京市, 江蘇省, 中國'
  • 經度 :
location.longitude
118.7724224
  • 緯度 :
location.latitude
31.9932018
  1. 根據經緯度查詢位置 :
location = geolocator.reverse("31.997858805465647, 118.78544536405718")
location.address
'雨花東路, 雨花臺區, 建鄴區, 南京市, 江蘇省, 21006, 中國'
location.raw
{'place_id': 134810031,
 'licence': 'Data ? OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright',
 'osm_type': 'way',
 'osm_id': 189414212,
 'lat': '31.99705152324867',
 'lon': '118.78513775762214',
 'display_name': '雨花東路, 雨花臺區, 建鄴區, 南京市, 江蘇省, 21006, 中國',
 'address': {'road': '雨花東路',
  'suburb': '雨花臺區',
  'city': '建鄴區',
  'state': '江蘇省',
  'postcode': '21006',
  'country': '中國',
  'country_code': 'cn'},
 'boundingbox': ['31.9964788', '31.9989487', '118.7819222', '118.7866616']}
  1. 計算距離 :
from geopy.distance import distance, geodesic
wellington, salamanca = (-41.32, 174.81), (40.96, -5.50)
distance(wellington, salamanca, ellipsoid='GRS-80').miles
12402.369702934551
shanghai, beijing = (31.235929042252014,121.48053886017651), (39.910924547299565,116.4133836971231)
distance(shanghai, beijing).km
1065.985103985533
geodesic(shanghai, beijing).km
1065.985103985533

因此 , 任務四的資料集就可以自己造了 :

cities = df['city1']
cities.head()
0     沈陽市
1     長春市
2    哈爾濱市
3     北京市
4     天津市
Name: city1, dtype: object
def get_lon_lat(city):
    location = geolocator.geocode(city)
    return location.longitude,location.latitude
longitude, latitude = [*zip(*[get_lon_lat(city) for city in cities])]
data = pd.DataFrame({'city':cities, 'longitude':longitude, 'latitude':latitude})
data.head()
citylongitudelatitude
0沈陽市123.45867441.674989
1長春市125.31712243.813074
2哈爾濱市126.53040045.798827
3北京市116.71852139.902080
4天津市117.19510739.085673

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/243848.html

標籤:python

上一篇:爬取冰冰B站千條評論,看看大家說了什么

下一篇:python80行代碼寫一個檔案整理軟體

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more