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()
plt.hist(salary, bins=25, rwidth=0.9, range=(100000, 210000))
plt.show()
##使用range指挑选10万至21万之间的
salary.mean() < salary.median()
True
均值小于中位数,图形左偏。
救火员收入分布
fire_salary = df[df.Department == 'FIRE'].Annual_Salary
plt.hist(fire_salary, bins=50, rwidth=0.9)
plt.show()
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()方法,这是什么呢?,原来是把数据转化成列表数据。
##建筑和IT收入差别
import seaborn as sns
sns.boxplot(data=df, y='Department', x='Annual_Salary')
plt.show()
###一个帅气的包,seaborn。
###方差和标准差
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()
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
#作业时间
## 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