import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
以上就是導(dǎo)入數(shù)據(jù)包: pandas乖阵,numpy巾钉,pyplot
第二段是魔法字,不過這句話具體代表什么鼎兽,我并不知道。
??%matplotlib inline
%config InlineBackend.figure_format = 'retina' 是什么意思铣除,這個(gè)可以作為研究對象谚咬。只是當(dāng)下應(yīng)保持專注。把復(fù)現(xiàn)走完尚粘。
想把絕對路徑和相對路徑死磕出來
問題:關(guān)于絕對路徑择卦。
背景:今天想復(fù)現(xiàn)fish上節(jié)課的代碼,在讀取文件環(huán)節(jié)背苦,就遇到路徑問題了互捌。 以前,我直接把.ipynb文件建立在課件材料的同一個(gè)文件夾內(nèi)行剂,所以幾乎不需要care路徑的問題秕噪,只要文件嗎正確就能讀取到。 但是厚宰,今天斗爭欲上來了腌巾,我就把.ipynb不放在課件材料同一個(gè)文件夾內(nèi),想把文件讀取出來铲觉。 google了一下澈蝙,參照那些代碼嘗試建立絕對路徑,并未成功撵幽。 想求教老師同學(xué)們灯荧,幫助拿下絕對路徑這個(gè)山頭。
fish的代碼讀取文件是這樣:
df = pd.read_csv('HRSalaries.csv')
df.head()而我把HRSalaries.csv放在win7電腦的這個(gè)位置盐杂,C:\Users\Administrator.USER-20170623BT\Desktop\第三課材料\第三課材料\HRSalaries.csv
我的代碼是這樣:df = pd.read_csv(r"C:\Users\Administrator.USER-20170623BT\Desktop\第三課材料\第三課材料\HRSalaries.csv")
結(jié)果報(bào)錯(cuò):OSError: Initializing from file failed
問題是:我到底該如何輸入絕對路徑逗载,才能成功讀取到HRSalaries.csv
先謝 哆窿。
df = pd.read_csv(r"C:\Users\bog\Desktop\3-python lesson\HRSalaries.csv")
df.head(20)
### 搞定了,原來是路徑中厉斟,不能有英文出現(xiàn)挚躯。 搞定了真開心。 回憶一下:用r“路徑\文件名.文件格式”
len(df)
#df是不是dataframe的簡稱啊擦秽,然后就習(xí)慣性把文件賦值給df這個(gè)名字码荔。
##len()方法是查閱總長度,是指有30284行嗎感挥?
30284
df.Department.value_counts()
##這會(huì)統(tǒng)計(jì)不同部門的人數(shù)缩搅,那有必要把文件原檔拿出來看看哦。 多種職位position也隸屬于某個(gè)部門department的链快。
###新增知識(shí)點(diǎn):value_counts()誉己,匯總相同的列在一起
POLICE 12461
FIRE 4798
SANITATION 2092
WATER MGMT 1796
AVIATION 1252
TRANSPORTATION 1196
EMERGENCY MGMT 1182
GENERAL SERVICES 922
PUBLIC LIBRARY 874
FAMILY & SUPPORT 719
HEALTH 568
FINANCE 533
LAW 455
CITY COUNCIL 265
BUILDINGS 261
COMMUNITY DEVELOPMENT 216
BUSINESS AFFAIRS 177
DoIT 97
MAYOR'S OFFICE 96
PROCUREMENT 77
CULTURAL AFFAIRS 76
HUMAN RESOURCES 61
ANIMAL CONTRL 57
DISABILITIES 29
TREASURER 24
Name: Department, dtype: int64
len(df.Department.unique())
###.unique()又是什么東東
25
df.Department.unique()
array(['EMERGENCY MGMT', 'POLICE', 'TRANSPORTATION', 'FIRE', 'WATER MGMT',
'FAMILY & SUPPORT', 'HEALTH', 'SANITATION', 'AVIATION',
'GENERAL SERVICES', 'PUBLIC LIBRARY', 'FINANCE', 'BUSINESS AFFAIRS',
'HUMAN RESOURCES', 'LAW', 'BUILDINGS', 'COMMUNITY DEVELOPMENT',
'ANIMAL CONTRL', "MAYOR'S OFFICE", 'CITY COUNCIL', 'DISABILITIES',
'CULTURAL AFFAIRS', 'PROCUREMENT', 'DoIT', 'TREASURER'], dtype=object)
開始計(jì)算平均趨勢了
均值
中位數(shù)
眾數(shù)
salary = df.Annual_Salary#賦值數(shù)據(jù)段給salary
salary.sum() / len(salary)
#工資求和除以員工數(shù)量,就是平均工資
60836.98560295866
salary.mean()
##用mean()方法好簡單域蜗。 這是不是pandas里面的方法哦
60836.98560295866
np.mean(salary)
###這個(gè)明顯是numpy里面的啊
60836.98560295866
求所有部分的平均工資
df.groupby('Department').Annual_Salary.mean().sort_values(ascending=False)
Department
DoIT 73831.979381
BUILDINGS 72137.885057
FIRE 69383.989996
MAYOR'S OFFICE 68953.677083
WATER MGMT 64760.186526
COMMUNITY DEVELOPMENT 64262.597222
GENERAL SERVICES 63747.808026
TREASURER 63497.500000
POLICE 63127.904984
TRANSPORTATION 62947.504181
PROCUREMENT 61452.584416
HEALTH 61213.503521
CULTURAL AFFAIRS 61181.894737
DISABILITIES 58058.586207
BUSINESS AFFAIRS 57216.067797
HUMAN RESOURCES 57108.163934
LAW 55917.958242
AVIATION 55816.200479
SANITATION 55555.813576
FINANCE 54286.375235
ANIMAL CONTRL 47604.473684
PUBLIC LIBRARY 44241.731121
EMERGENCY MGMT 42845.754653
CITY COUNCIL 38046.547170
FAMILY & SUPPORT 31193.307371
Name: Annual_Salary, dtype: float64
df.head(10)
sorted_salary = salary.sort_values()
sorted_salary
16629 3128
2247 3132
20961 3133
13423 3135
25422 3135
16451 3136
1732 3136
2215 3140
23454 3144
12291 3149
25959 3151
19186 3153
9905 3156
1752 3182
25170 3188
4739 3188
4858 3190
3688 3193
6947 3209
20065 3215
17837 3219
24322 3230
5840 3232
25971 3236
8175 3244
22631 3253
22602 3257
15958 3263
5194 3265
18713 3266
...
23452 128174
27353 130023
14122 130788
18022 131070
17173 131461
7333 132249
20450 132283
11322 135289
14042 135623
14386 136798
6491 136806
17347 137121
7565 137153
13217 137300
12748 137305
10283 137574
16910 137583
4165 137584
29829 137669
1260 138506
14746 138546
15059 138760
2866 138826
8904 144240
3246 144914
20222 146247
11657 146776
3486 157054
27879 167858
6724 201448
Name: Annual_Salary, dtype: int64
(sorted_salary.iloc[15141] + sorted_salary.iloc[15142]) / 2
##最中間的兩位數(shù),除以2
61836.0
salary.median()
#使用pandas()快速實(shí)現(xiàn)
61836.0
plt.hist(salary, bins=50, rwidth=0.9)
plt.show()
![](output_20_0.png)
plt.hist(salary, bins=25, rwidth=0.9, range=(100000, 210000))
plt.show()
##使用range指挑選10萬至21萬之間的
![](output_21_0.png)
salary.mean() < salary.median()
True
均值小于中位數(shù)噪猾,圖形左偏霉祸。
救火員收入分布
fire_salary = df[df.Department == 'FIRE'].Annual_Salary
plt.hist(fire_salary, bins=50, rwidth=0.9)
plt.show()
![](output_25_0.png)
fire_salary.mean()
69383.9899958316
fire_salary.median()
66260.0
fire_salary.mean()>fire_salary.median()
True
均值大于中數(shù),所以右偏
離散程度
salary.max()
#工資最大值
201448
salary.min()
###工資最小值
3128
##全距
salary.max() - salary.min()
198320
Q1 = salary.quantile(0.25)
Q1
#一分位
55671.75
Q3 = salary.quantile(0.75)
Q3
#三分位
68558.5
IQR = Q3 - Q1
IQR
##四分位距出來了
12886.75
salary.quantile(0.5)
#二分位
61836.0
salary.median()
##看來二分位就等于中位數(shù)哦
61836.0
salary.plot(kind='box', vert=False, figsize=(15, 5))
plt.show()
![](output_39_0.png)
###這樣的顯示說明了什么問題呢袱蜡? 離散程度很大啊丝蹭。 集中在四分位距的不錯(cuò),iqr坪蚁。
## IT員工的收入分布
doit_salary = df[df.Department == 'DoIT'].Annual_Salary.tolist()
plt.boxplot(doit_salary)
plt.show()
### 這里有一個(gè)tolist()方法奔穿,這是什么呢?敏晤,原來是把數(shù)據(jù)轉(zhuǎn)化成列表數(shù)據(jù)贱田。
![](output_41_0.png)
##建筑和IT收入差別
import seaborn as sns
sns.boxplot(data=df, y='Department', x='Annual_Salary')
plt.show()
###一個(gè)帥氣的包,seaborn嘴脾。
![](output_42_0.png)
###方差和標(biāo)準(zhǔn)差
mean = salary.mean()
np.sum((salary - mean)**2) / (len(salary) - 1)
###每個(gè)數(shù)減去均值求平方男摧,然后再相加,除以數(shù)量
271490393.4177519
###使用函數(shù)译打,就方便了耗拓、
var=salary.var()
var
271490393.4177519
###接下來是標(biāo)準(zhǔn)差的計(jì)算
np.sqrt(np.sum((salary - mean)**2) / (len(salary) - 1))
###本質(zhì)上就是方差開方
16476.965540346071
np.sqrt(271490393.4177519)
16476.965540346071
###函數(shù)出馬
std=salary.std()
std
16476.96554034607
拇指規(guī)則
len(salary[salary.between(mean - std, mean + std)]) / len(salary)
###大約68%的數(shù)據(jù)落在均值左右一個(gè)標(biāo)準(zhǔn)差的范圍內(nèi)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-32-4b2e7a7f4ef1> in <module>()
----> 1 len(salary[salary.between(mean - std, mean + std)]) / len(salary)
2 ###大約68%的數(shù)據(jù)落在均值左右一個(gè)標(biāo)準(zhǔn)差的范圍內(nèi)
NameError: name 'mean' is not defined
len(salary[salary.between(mean - 2*std, mean + 2*std)]) / len(salary)
###大約95%的數(shù)據(jù),落在均值左右兩個(gè)標(biāo)準(zhǔn)差的范圍內(nèi)奏司。
#基本符合鐘形曲線
0.933364152687888
協(xié)方差
兩個(gè)變量與均值之差的乘積乔询,再把這些乘積求和除以數(shù)量
score = df.Review_Score
##定義評分
np.sum((salary - salary.mean()) * (score - score.mean())) / (len(salary)-1)
###工資變量減去工資均值*評分變量-評分均值,再除以數(shù)量
7.747599921809748
np.cov(salary, score)
array([[ 2.71490393e+08, 7.74759992e+00],
[ 7.74759992e+00, 1.06173362e+00]])
cov = np.cov(salary, score)[0,1]
cov
#這是只要其中那個(gè)一個(gè)數(shù)的意思韵洋,0代表第一排竿刁,1代表第二位
7.7475999218100222
接下來就是相關(guān)系數(shù)
兩變量的協(xié)方差除以岸夯,兩變量的標(biāo)準(zhǔn)差乘積
np.cov(salary, score)[0,1] / (salary.std() * score.std())
0.00045633330757004046
np.corrcoef(salary, score)[0,1]
## 函數(shù)出馬,清算一半
0.00045633330757003586
plt.scatter(score, salary, alpha=0.3)
plt.show()
![](output_58_0.png)
position = df[df.Position_Title == 'FIREFIGHTER']
print(np.corrcoef(position.Annual_Salary, position.Review_Score)[1,0])
plt.scatter(position.Review_Score, position.Annual_Salary)
plt.show()
0.0571267765462
![](output_59_1.png)
#作業(yè)時(shí)間
## 1们妥、計(jì)算 HRSalaries 數(shù)據(jù)中評分Review_Score 的均值和中位數(shù)猜扮,并判斷其偏度是左偏還是右偏?
df
Review_Score =df.Review_Score
Review_Score.mean() >Review_Score.median()
False
均值小于中位數(shù)监婶,所以偏左
Review_Score.quantile(0.75)-Review_Score.quantile(0.25)
1.4000000000000004
rstd=Review_Score.std()
rstd
1.030404588021642
rmean=Review_Score.mean()
len(Review_Score[Review_Score.between(rmean - 2*rstd, rmean + 2*rstd)]) / len(Review_Score)
0.9617950072645621
position = df[df.Department == 'DoIT']
print(np.corrcoef(position.Annual_Salary, position.Review_Score)[1,0])
plt.scatter(position.Review_Score, position.Annual_Salary)
plt.show()
0.00602457101049
![](output_66_1.png)