复现fish03课python基础

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline
%config InlineBackend.figure_format = 'retina'

以上就是导入数据包: pandas,numpy,pyplot
第二段是魔法字,不过这句话具体代表什么,我并不知道。

??%matplotlib inline
%config InlineBackend.figure_format = 'retina' 是什么意思,这个可以作为研究对象。只是当下应保持专注。把复现走完。

想把绝对路径和相对路径死磕出来

问题:关于绝对路径。

背景:今天想复现fish上节课的代码,在读取文件环节,就遇到路径问题了。 以前,我直接把.ipynb文件建立在课件材料的同一个文件夹内,所以几乎不需要care路径的问题,只要文件吗正确就能读取到。 但是,今天斗争欲上来了,我就把.ipynb不放在课件材料同一个文件夹内,想把文件读取出来。 google了一下,参照那些代码尝试建立绝对路径,并未成功。 想求教老师同学们,帮助拿下绝对路径这个山头。

fish的代码读取文件是这样:

  • df = pd.read_csv('HRSalaries.csv')
    df.head()

  • 而我把HRSalaries.csv放在win7电脑的这个位置,C:\Users\Administrator.USER-20170623BT\Desktop\第三课材料\第三课材料\HRSalaries.csv

  • 我的代码是这样:df = pd.read_csv(r"C:\Users\Administrator.USER-20170623BT\Desktop\第三课材料\第三课材料\HRSalaries.csv")
    结果报错:OSError: Initializing from file failed

问题是:我到底该如何输入绝对路径,才能成功读取到HRSalaries.csv
先谢 。

df = pd.read_csv(r"C:\Users\bog\Desktop\3-python lesson\HRSalaries.csv")
df.head(20)
### 搞定了,原来是路径中,不能有英文出现。  搞定了真开心。   回忆一下:用r“路径\文件名.文件格式”
len(df)
#df是不是dataframe的简称啊,然后就习惯性把文件赋值给df这个名字。
##len()方法是查阅总长度,是指有30284行吗?
30284
df.Department.value_counts()
##这会统计不同部门的人数,那有必要把文件原档拿出来看看哦。 多种职位position也隶属于某个部门department的。
###新增知识点: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)

开始计算平均趋势了

均值
中位数
众数

salary = df.Annual_Salary#赋值数据段给salary
salary.sum() / len(salary)
#工资求和除以员工数量,就是平均工资
60836.98560295866
salary.mean()
##用mean()方法好简单。  这是不是pandas里面的方法哦
60836.98560295866
np.mean(salary)
###这个明显是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
##最中间的两位数,除以2
61836.0
salary.median()
#使用pandas()快速实现
61836.0
plt.hist(salary, bins=50, rwidth=0.9)
plt.show()

复现fish03课python基础_第1张图片
![output_21_0.png](http://upload-images.jianshu.io/upload_images/4421285-3e0db43faedc6f01.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
plt.hist(salary, bins=25, rwidth=0.9, range=(100000, 210000))
plt.show()
##使用range指挑选10万至21万之间的
复现fish03课python基础_第2张图片
output_21_0.png
salary.mean() < salary.median()
True

均值小于中位数,图形左偏。

救火员收入分布

fire_salary = df[df.Department == 'FIRE'].Annual_Salary
plt.hist(fire_salary, bins=50, rwidth=0.9)
plt.show()
复现fish03课python基础_第3张图片
![ ![output_41_0.png](http://upload-images.jianshu.io/upload_images/4421285-2ab6f41b5d48ba61.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ](http://upload-images.jianshu.io/upload_images/4421285-437edcb70967f98b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
fire_salary.mean()
69383.9899958316
fire_salary.median()
66260.0
fire_salary.mean()>fire_salary.median()
True

均值大于中数,所以右偏

离散程度

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()
##看来二分位就等于中位数哦
61836.0
salary.plot(kind='box', vert=False, figsize=(15, 5))
plt.show()
###这样的显示说明了什么问题呢? 离散程度很大啊。  集中在四分位距的不错,iqr。
## IT员工的收入分布
doit_salary = df[df.Department == 'DoIT'].Annual_Salary.tolist()
plt.boxplot(doit_salary)
plt.show()
### 这里有一个tolist()方法,这是什么呢?,原来是把数据转化成列表数据。
复现fish03课python基础_第4张图片
![ ![output_42_0.png](http://upload-images.jianshu.io/upload_images/4421285-137828da2d0db8c4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ](http://upload-images.jianshu.io/upload_images/4421285-9846946810822c27.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
##建筑和IT收入差别
import seaborn as sns

sns.boxplot(data=df, y='Department', x='Annual_Salary')
plt.show()
###一个帅气的包,seaborn。  
复现fish03课python基础_第5张图片
output_42_0.png
###方差和标准差
mean = salary.mean()
np.sum((salary - mean)**2) / (len(salary) - 1)
###每个数减去均值求平方,然后再相加,除以数量
271490393.4177519
###使用函数,就方便了、
var=salary.var()
var


271490393.4177519
###接下来是标准差的计算
np.sqrt(np.sum((salary - mean)**2) / (len(salary) - 1))
###本质上就是方差开方
16476.965540346071
np.sqrt(271490393.4177519)
16476.965540346071
###函数出马
std=salary.std()
std
16476.96554034607
拇指规则
len(salary[salary.between(mean - std, mean + std)]) / len(salary)
###大约68%的数据落在均值左右一个标准差的范围内

---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

 in ()
----> 1 len(salary[salary.between(mean - std, mean + std)]) / len(salary)
      2 ###大约68%的数据落在均值左右一个标准差的范围内


NameError: name 'mean' is not defined
len(salary[salary.between(mean - 2*std, mean + 2*std)]) / len(salary)
###大约95%的数据,落在均值左右两个标准差的范围内。
#基本符合钟形曲线
0.933364152687888

协方差

两个变量与均值之差的乘积,再把这些乘积求和除以数量

score = df.Review_Score
##定义评分
np.sum((salary - salary.mean()) * (score - score.mean())) / (len(salary)-1)
###工资变量减去工资均值*评分变量-评分均值,再除以数量




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
#这是只要其中那个一个数的意思,0代表第一排,1代表第二位
7.7475999218100222

接下来就是相关系数

两变量的协方差除以,两变量的标准差乘积

np.cov(salary, score)[0,1] / (salary.std() * score.std())


0.00045633330757004046
np.corrcoef(salary, score)[0,1]
## 函数出马,清算一半
0.00045633330757003586
plt.scatter(score, salary, alpha=0.3)
plt.show()
复现fish03课python基础_第6张图片
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
复现fish03课python基础_第7张图片
output_59_1.png
#作业时间
## 1、计算 HRSalaries 数据中评分Review_Score 的均值和中位数,并判断其偏度是左偏还是右偏?
df




Review_Score =df.Review_Score
Review_Score.mean() >Review_Score.median()
False

均值小于中位数,所以偏左

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
复现fish03课python基础_第8张图片
output_66_1.png

你可能感兴趣的:(复现fish03课python基础)