数据分析学习笔记 2/28

数据分析:研究数据背后研究对象的内在规律
-作用:
分析用户的消费行为:指定册小活动的方案/指定促销时间和力度/计算用户的活跃度/分析产品的回购力度
分析广告的点击率:决定投放时间/滴定广告定向人群方案/决定相关平台的投放
保险公司分析是否骗保
支付宝调整花呗的额度
短视频分析给用户推送视频
-意义:
岗位竞赛
python数据科学的基础
机器学习的基础
-实现流程
提出问题
准备数据
分析数据
获得结论
成果可视化
-课程内容介绍
基础模块使用学习
项目实现
金融量化
-数据分析三大工具
numpy
pandas(重点)
matplotlib
——————————————————————————————————————
jupyter使用
-新建
-code:编写代码
-markdown:编写笔记
-快捷键:
-添加新cell:A或B
-删除cell: X
-修改模式:
-m,修改成markdown
-y,修改成code
-执行cell:
-shift+enter
-自动补全:tab
-打开帮助文档:shift+tab
————————————————————————————————————————
numpy:重点在于数值计算(数组)
-1,创建数组
#导入numpy数组叫做np
import numpy as np
#array()创建一维数组
arr=np.array([1,2,3])
print(arr)
-2,数组和列表的区别是什么?
-数组中存储的数据元素必须是统一类型
-优先级:
字符串>浮点型>整形
-3,显示图片
import matplotlib.pyplot as plt
#返回的数组img_arr中装载的就是图片的内容
img_arr=plt.imread(’./aa.png’)
#imshow将numpy数组进行可视化展示
plt.imshow(img_arr)
-4,创建数组的方式
-np.ones(shape=(3,4))#创建三行四列的二维数组,填充元素为1
-np.zero()
-np.linspace(0,100,num=20)#一维的从0到100的等差数列数组,数量为20个
-np.arange(10,50,step=2)#一维的从10到50的等差数列数组,差值为2
-np.random.randint(0,100,size=(5,3))#输出5行3列的,元素从0到100的随机数组
-5,numpy对应的属性
np.shape:返回数组有几行几列
np.ndim:返回的是数组的维度
np.size:返回数组元素的个数
np.dtype:#返回数组元素的类型
arr=np.array([1,2,3],dtype=‘int32’)#改变数组元素类型为int32
或arr.dtype=‘uint8’#修改数组的元素类型
-6,numpy其他操作:索引/切片/变形reshape/级联操作/聚合操作
-索引
arr=np.random.randint(1,100,size=(5,6))
arr[1]#取出了numpy数组中的下表为1的行数据
arr[[1,3,4]]#取出多行
-7,切片操作
arr[0:2]#切出前两行
arr[:,0:2]#切出arr数组的前两行的数据,arr[行切片,列切片],可用于裁剪图片
arr[0:2,0:2]#切出前两行的前两列
arr[::-1]#行倒置
arr[:,::-1]#数组列导致,图片左右倒置为列倒置
arr[::-1,::-1]#所有元素倒置
-8,变形reshape
arr_1=arr.reshape((30,))#arr是5行6列的二维数组,变成一维
arr_1.reshape((2,15))#将一维变多维
-9,级联操作:将numpy数组进行横向或纵向的拼接(可以将图片拼接)
axis轴向的理解
-0:列
-1:行,axis=1,每一列
np.concatenate((arr,arr),axis=1)#横向行级联
-10,聚合操作:sum/max/min/mean(平均值)
arr.sum(axis=1)#求每一行的总和
arr.max()#数组元素的总和
arr.max(axis=1)#每一行的最大值
-11,常见的数学函数:sin()/cos()/tan()/sinc()为求反三角函数
numpy,around(a,decimals)函数返回指定数字的四舍五入值
a:数组
decimals:舍入的小数位数,默认值为0。如果为负,整数将四舍五入到小数点左侧的位置
-12,常用的统计函数
numpy.amin()和numpy.amax(),用于计算数组中的元素沿指定轴的最小/最大值
numpy.ptp()计算数组中元素最大值与最小值的茶(最大值-最小值)
numpy.median()函数用于计算数组a中元素的中位数(中值)
标准差.std():标准差为一组数据平均值分散程度的一种度量
公式:std=sqrt(mean((x-x.mean())**2))
若数组是[1,2,3,4],则平均值为2.5。因此,差的平方是[2.25,0.25,0.25,2.25],差的平方和除以4,为sqrt(5/4),结果为1.1180339887498949
方差.var():统计中方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数,即mean((x-x.mean())**2).换句话说,方差的平方根是标准差
-13.矩阵相关
numpy.matlib.identity()函数返回给定大小的单位矩阵。(也可以用numpy.eye(),括号内填写给定的阶大小)
转置矩阵:加.T
矩阵运算:
相乘:
a1=np.array([[2,1],[4,3]])
a2=np.array([[1,2],[1,0]])
np.dot(a1 ,a2 )
相加:a+b
求逆矩阵:np.linalg.inv(a) # 求逆
________________________________________________

-为什么学习pandas?
numpy能帮我们处理数值型的数据,pandas可以帮我们处理除了数值型的其他数据,例如字符串,时间序列等
-什么是pandas?
首先学习pandas中的两个常用的类
Series
DataFrame
-Series(一维数据结构)from pandas import Series
-series是一种类似于一组数组的对象,由下面两个部分组成:
-values:一组数据(ndarray类型)
-index:相关的数据索引标签,用来显示索引,默认01234…
-Series的索引和切片
切片:s[0:2]
索引:s[0]
-Series的常用属性
s.shape#返回形状
s.size#返回元素的个数
s.index#返回索引
s.values#返回data值
s.dtype#返回元素的类型(若返回的是o表示的是Object,字符串类型)
-Series常用方法
head(),tail()#显示前几个元素(默认前5个)/显示末尾几个元素()
unique()#去重
isnull(),notnull()#isnull判断元素是否为空,不空为False/
add(),sub(),mul(),div()#加减乘除
-Series的算术运算
-法则:索引一致的元素进行算数运算否则补空NaN
-Series的创建
-由列表或numpy数组创建
from pandas import Series
s=Series(data=[1,2,3,‘four’],index=[‘a’,‘b’,‘c’,‘d’])
-由字典创建
-----series利用字典
index用来增强Series的可读性
from pandas import Series
dic={
‘语文’:100,
‘数学’:99,
‘理综’:250,
}
s=Series(data=dic)
——————————————————————————————————
DataFrame(二维)from pandas import DataFrame
-DataFrame是一个表格型的数据结构。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一堆扩展到多维。DataFrame既有行索引,也有列索引
行索引:index
列索引:colunmns
值:values
-DataFrame的创建
ndarray创建
from pandas import DataFrame
df=DataFrame(data=[[1,2,3],[4,5,6]])
df=DataFrame(data=np.random.randint(0,100,size=(6,4)))
字典创建
--------------行
from pandas import DataFrame
dic={
‘name’:[‘zhangsan’,‘lisi’,‘wanglaogou’],
‘salary’:[1000,2000,3000]
}
df=DataFrame(data=dic,index=[‘a’,‘b’,‘c’])
df
-------------列
from pandas import DataFrame
dic={
‘张三’:[150,150,150,150],
‘李四’:[0,0,0,0],
}
df=DataFrame(data=dic,index=[‘语文’,‘数学’,‘英语’,‘理综’])
df
-DataFrame属性
values/colunmns/index/shape
df.values#返回二维形式的数据
df.columns#返回列索引
df.index#返回行索引
df.shape#返回形状,几行几列
-DataFrame索引操作
from pandas import DataFrame
import numpy as np
df=DataFrame(data=np.random.randint(60,100,size=(8,4)),columns=[‘a’,‘b’,‘c’,‘d’])
对行进行索引(iloc:通过隐式索引,loc:通过显式索引)
df.iloc[0]
df.iloc[[0,3,5]]#多行
对列进行索引(改列索引为abcd)
df[‘a’]
df[‘a’,‘c’]#多列
对元素进行索引
df.iloc[0,3]#对0行3列的元素进行索引#iloc使用的是隐式索引,3用’a’代替会报错,要用loc
df.iloc[[1,3,5],2]#取1,3,5行第二个元素
-DataFrame的切片操作
对行进行切片
df[0:2]#切前两行
对列进行切片
df.iloc[:,0:2]#切前两列
-DataFrame的运算
同Series
np+=10#所有都加10
np[‘李四’]+=100#李四都加100
np.loc[‘数学’,‘张三’]=0#将张三的数学成绩变成0
-时间类型数据的转换pd.to_datetime(col)
import pandas as pd
dic={
‘time’:[‘2010-10-10’,‘2011-11-20’,‘2020-01-10’],
‘temp’:[33,31,30]
}
df=DataFrame(data=dic)
df[‘time’]=pd.to_datetime(df[‘time’])
-将某一列设置为行索引df.set_index()
df.set_index(‘time’,inplace=True)#当改为true时永久改变
————————————————————————————————-
需求:股票分析
-1,使用tushare包获取某股票的历史行情数据
-tushare操作:
import tushare as ts
import pandas as pd
from pandas import DataFrame,Series
import numpy as np
#获取某只股票的历史行情数据
#code股票代码,data交易时间,open开盘价,close收盘价,volume成交量
df=ts.get_k_data(code=‘600519’,start=‘2000-01-01’)
#将互联网上获取的数据存到本地,to_xxx为写入本地
df.to_csv(’./maotao.csv’)
#将本地的文本数据读到df中
df=pd.read_csv(’./maotao.csv’)
#查看每一列的数据类型
#df.info()
#将time列转为时间序列类型
df[‘date’]=pd.to_datetime(df[‘date’])
#删除df中Unnamed:0的一列,axis=0表示列,1表示行,在drop中相反
df.drop(labels=‘Unnamed: 0’,axis=1,inplace=True)
#将date列作为源数据的行索引
df.set_index(‘date’,inplace=True)
df.head()
-2,输出该股票所有收盘比开盘上涨3%以上的日期:(收盘-开盘)/开盘>0.03
(df[‘open’]-df[‘close’])/df[‘open’]>0.03
#在分析中如果出现了bool值(true或false),则下一步及那个布尔值作为源数据的行索引
#如果布尔值作为df的行索引,则可以取出true对应的行索引,忽略false对应的行数据(得先将date列作为源数据的行索引)
df.loc[(df[‘open’]-df[‘close’])/df[‘open’]>0.03]#获取为true的行数据(满足需求的行数据)
df.loc[(df[‘open’]-df[‘close’])/df[‘open’]>0.03].index#返回满足需求的行数据(上涨的日期)
-3,输出该股票所有开盘比前日收盘跌幅超过2%的日期:(开盘-前日收盘)/前日收盘<-0.02
#让收盘集体下移一位
df[‘close’].shift(1)
df.loc[(df[‘open’]-df[‘close’])/df[‘close’]<-0.02].index
-4,假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?
-时间节点:2015-2021
new_df=df[‘2019-01’:‘2020-02’]
-一手股票:100至股票
-买股票:找每个月的第一个交易日对应的行数据(捕获到开盘价)==》每月的第一行数据
#每月第一个交易日对应的行数据
df_monthly=new_df.resample(‘M’).first()#数据的重新取样,取出每个月份的第一行数据
-一个完整的年,需要买入1200支股票
买入金额总花费:
cost=df_monthly[‘open’].sum()100
-卖股票:
-一个完整的年,需要卖出1200支股票
卖出股票的钱:(特殊情况:2020年买入的股票卖不出去)
new_df.resample[‘A’].last()#年为A,last为最后一行数据
#将2020年最后一行切出去
df_yearly=new_df.resample(‘A’).last()[:-1]
#计算卖出股票到手的钱
resv=df_yearly[‘open’].sum()1200
-买卖股票的单价:
-开盘价
#最后手中剩余的股票需要估量其价值总收益中
#取2020年12月最后收盘的数据,两个月没收盘故×200
last_money=new_df[‘close’][-1]200
resv+last_money-cost
——————————————————————————————————————————————
需求:双均线策略指定(使用tushare包获取某股票的历史行情数据)
-计算该股票历史数据的5日均线和30日均线
对于每一个交易日,都可以计算出前N天的移动平均值,然后把平均值连起来
日均线指标:5天/10天
季均线指标:30天/60天
年均线指标:120天/240天
均线计算方法:MA=(C1+C2+C3+…+Cn)/N (C:某日收盘价,N:移动平均周期(天数))
import tushare as ts
import pandas as pd
from pandas import DataFrame,Series
import numpy as np
import matplotlib.pyplot as plt
#drop中,o表示行,1表示列
df=pd.read_csv(’./maotao.csv’).drop(labels=‘Unnamed: 0’,axis=1)
#将time列转为时间序列类型
df[‘date’]=pd.to_datetime(df[‘date’])
#将date列作为源数据的行索引
df.set_index(‘date’,inplace=True)
ma5=df[‘close’].rolling(5).mean()
ma30=df[‘close’].rolling(30).mean()
#用matplotlib画线
%matplotlib inline
plt.plot(ma5[200:280])
plt.plot(ma30[200:280])
-分析出所有的金叉日期和死叉日期
股票分析技术中的金叉和死叉,可以简单解释为:
分析指标中的两根线,一根为短时间内的指标线,另一根为较长时间的指标线
如果短时间的指标线防线拐头向上,穿过长时间的指标线,称为“金叉”,拐头向下为“死叉”
一般情况,金叉买入,死叉卖出
s1=ma5<ma30#s1s死叉
s2=ma5>ma30#s2金叉
T->F 金叉
F->T 死叉
s1: T T F F T
s2: F F T T F
s1&s2.shift(1): F F F T
s1|s2.shift(1): T F T T
death_ex=s1&s2.shift(1)#判定死叉的条件
df=df[30:]
df.loc[death_ex]#死叉对应行数据
death_date=df.loc[death_ex].index#死叉数据对应的日期
golden_ex=(s1|s2.shift(1))#判定金叉条件
golden_date=df.loc[golden_ex].index#金叉的时间
-如果我从假如我从2010年1月1日开始,初始基金为10W元,金叉尽量买入,死叉全部卖出,到今天为止,我的炒股收益率如何?
-买卖股票的单价使用开盘价
-买卖股票的时机
-最终手里会有剩余股票没卖出去
-会有。如果最后一天为金叉,则买入股票。估量股票的剩余价值计算到总收益
剩余股票的单价就是用最后一天的收盘价
import tushare as ts
import pandas as pd
from pandas import Series
from pandas import DataFrame,Series
import numpy as np
import matplotlib.pyplot as plt
#获取某只股票的历史行情数据
#code股票代码,data交易时间,open开盘价,close收盘价,volume成交量
df=ts.get_k_data(code=‘600519’,start=‘2010-01-01’)
#将互联网上获取的数据存到本地,to_xxx为写入本地
df.to_csv(’./maotao.csv’)
#将本地的文本数据读到df中
df=pd.read_csv(’./maotao.csv’)
#drop中,o表示行,1表示列
df=pd.read_csv(’./maotao.csv’).drop(labels=‘Unnamed: 0’,axis=1)
#将time列转为时间序列类型
df[‘date’]=pd.to_datetime(df[‘date’])
#将date列作为源数据的行索引
df.set_index(‘date’,inplace=True)
ma5=df[‘close’].rolling(5).mean()
ma30=df[‘close’].rolling(30).mean()
#用matplotlib画线
%matplotlib inline
plt.plot(ma5[30:])
plt.plot(ma30[30:])
s1=ma5<ma30#s1死叉
s2=ma5>ma30#s2金叉
df=df[30:]
death_ex=s1&s2.shift(1)#判定死叉的条件
df.loc[death_ex]#死叉对应行数据
death_date=df.loc[death_ex].index#死叉数据对应的日期
golden_ex=-(s1|s2.shift(1))#判定金叉条件
golden_date=df.loc[golden_ex].index#金叉的时间
#1作为金叉的标识
s1=Series(data=1,index=golden_date)
#0作为死叉的标识
s2=Series(data=0,index=death_date)
#s2加到s1中
s=s1.append(s2)
#按日期交叉排好,s存储金叉/死叉对应的事件
s=s.sort_index()
s=s[‘2010’:‘2020’]
#本金
first_money=100000
money=first_money#买卖股票的钱都从money中操作
#hold为持有股票数(100股=1手)
hold=0
for i in range(0,len(s)):#i表示s的Series中的隐式索引
if s[i]==1:#金叉的时间,基于10W买尽可能多的股票
#获取股票对应的开盘价
time=s.index[i]#time为金叉的时间
p=df.loc[time][‘open’]#p为股票的单价,为当天的开盘价
hand_count=money//(p
100)#//为整除,p
100为一手的股票,hand_count为买了多少手
hold=hand_count
100
money-=(holdp)#把买股票的钱从money中减去
else:
#将买入的股票卖出去
#找出卖出股票的单价
death_time=s.index[i]#死叉时间
p_death=df.loc[death_time][‘open’]#卖股票的单价
money+=(p_death
hold)#卖出的股票收入加入到money
#如何判断最后一天为金叉还是死叉
last_money=hold*df[‘close’][-1]#剩余股票的价值
#总收益
money+last_money-first_money

————————————————————————————————————————————
基于pandas的数据清洗
-原因:数据中存在空值,数据缺失/重复值/异常值
-处理丢失数据
有两种丢失数据:
None------NoneType类型
np.nan(NaN)-------float类型,NAN浮点型
-为什么数据分析中需要用到的是浮点类型的空而不是对象类型?
因为数据分析中常用到某些形式的运算来处理原始数据,如果原始数据中的空值为NAN的形式,则不会干扰或者中断运算
NAN可以参与运算
None是不可以参与运算
(在pandas中遇到了None形式的空值,pandas则会将其强制转成NAN的形式)
-pandas处理空值操作
isnull
notnull
any
all
dropna
fillna
对缺失数据进行删除:方式1,方式2
-方式1:对空值过滤(删除空所在的行数据)
#那些行中存在true
#any:用来检测行或列中是否存在True,1表示行
df.isnull().any(axis=1) #df.notnull.all(axis=1)/df.loc[df.notnull().all(axis=1)]
#将上部的布尔值作为源数据的行索引
df.loc[df.isnull().any(axis=1)] #true对应的行数据就是存在缺失值的数据
drop_index=df.loc[df.isnull().any(axis=1)].index #即将要删除的有true的行索引
#将缺失行进行删除
df.drop(labels=drop_index,axis=0)
-方式2:dropna:可以将缺失值的行或列进行删除(drop中0与1与平常相反)
df.dropna(axis=0)
对缺失值覆盖:fillna
-简单填数(基本无意义): df.fillna(value=666)
-行补充axis=1,列补充axis=0
df.fillna(method=‘ffill’,axis=1)#左边的行填充
df.fillna(method=‘bfill’,axis=1)#右边的行填充
————————————————————————————————
面试题
-数据说明:
数据是1个冷酷的温度数据,1-7对应7个温度采集设备。1分钟采集一次
-数据处理目标:
用1-4对应的4个必须设备,通过建立冷库的温度场关系模型,预估出5-7对应的数据
最后每个冷库中仅需放置4个设备,取代放置7个设备
f(1-4)–>y(5-7)
import tushare as ts
import pandas as pd
from pandas import Series
from pandas import DataFrame,Series
import numpy as np
import matplotlib.pyplot as plt
df=pd.read_excel(’./data/testData.xlsl’)
#取出1,2,3,4列数据
df=df[[1,2,3,4]]
#将空值对应的行数据删除
df.dropna(axis=0)
#填充空值
df,fillna(method=‘ffill’,axis=0).fillna(method=‘bfill’,axis=0)#先上转下的列填充,后右往做行填充一次
#检测下是否填充完整,0表示列
data.isnull().any(axis=0)
-数据处理过程:
1,原始数据中有丢帧现象,需要做预处理
2,matplotlib绘图
3,建立逻辑回归模型
-无标准答案,按个人理解操作即可,请把自己的操作过程以文字形式简单描述一下,谢谢配合
-测试数据为testData.xlsx
————————————————————————————————————
-处理重复数据
import tushare as ts
import pandas as pd
from pandas import Series
from pandas import DataFrame,Series
import numpy as np
import matplotlib.pyplot as plt
#生成一组带有重复数据的数据源(重复的行数据)
df=DataFrame(data=np.random.randint(0,100,size=(8,4)))
df.iloc[2]=[0,0,0,0]
df.iloc[3]=[0,0,0,0]
df.iloc[4]=[0,0,0,0]
#使用drop_duplicates,删除重复数据,keep=False为全删,=‘first’为保留第一行
df.drop_duplicates(keep=False)
-处理异常数据
自定义一个1000行3列(A,B,C)取值范围为0-1的数据源,然后将C列中的值大于其两倍标准差的异常值进行清洗
import tushare as ts
import pandas as pd
from pandas import Series
from pandas import DataFrame,Series
import numpy as np
import matplotlib.pyplot as plt
#1000行3列,列索引为A/B/C
df=DataFrame(data=np.random.random(size=(1000,3)),columns=[‘A’,‘B’,‘C’])
#判定异常值的条件:将C列中的值大于其两倍标准差的异常值进行清洗
twice_std=df[‘C’].std()*2
#大于的值为True
#df[‘C’]>twice_std
#大于的值为False,作为索引,拿df.loc去清理掉大于twice_std的值
-(df[‘C’]>twice_std)
df.loc[-(df[‘C’]>twice_std)]
————————————————————————————————————————
DataFrame的级联and合并操作
-级联操作(表格横向/纵向拼接):concat
pd.concat , pd.append
pandas使用pd.concat函数,与np.concatenate函数类似,只是多了一些参数:
objs
axis=0
keys
join=‘outer’/‘inner’:表示的是级联的方式,outer会将所有的项进行级联(忽略匹配和不匹配),而inner只会将匹配的项级联到一起,不匹配的不级联
ignore_index=False
-匹配级联
import numpy as np
import pandas as pd
from pandas import DataFrame
df1=DataFrame(data=np.random.randint(0,100,size=(5,3)),columns=[‘A’,‘B’,‘C’])
df2=DataFrame(data=np.random.randint(0,100,size=(5,3)),columns=[‘A’,‘B’,‘D’])
#1表示横向级联
pd.concat((df1,df2),axis=0)
-不匹配级联
-不匹配指的是级联的维度的索引不一致,例如纵向级联时列索引不一致,横向级联时行索引不一致
-有2种连接方式:
外连接:补NaN(默认模式),C/D有空值为NaN
pd.concat((df1,df2),axis=0)
内连接:只连接匹配的项(只连接A/C)
pd.concat((df1,df2),axis=0,join=‘inner’)
-如果想要保存数据的完整性必须使用outer(外连接)
-append函数的使用
df1.append(df2)#行级联,列索引不变
-合并级联(级联对应表格,合并对应数据)
merge与concat的区别在于,merge需要依据某一共同列来进行合并
使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并
注意每一列元素的顺序不要求一致
一对一合并:
import numpy as np
import pandas as pd
from pandas import DataFrame
df2=DataFrame({
‘employee’:[‘Lisa’,‘Bob’,‘Jake’],
‘hire_date’:[2004,2008,2012],
})
df1=DataFrame({
‘employee’:[‘Bob’,‘Jake’,‘Lisa’],
‘group’:[‘Acounting’,‘Engineering’,‘Engineering’],
})
pd.merge(df1,df2)
一对多合并:(outer为外连接,连接所有的数据;inner为内连接,连接有限的数据;left为保留左表的数据,right为相反)
pd.merge(df1,df2,how=‘outer’)
on=‘ ’#(选定合并条件)
left_on=’’,right_on=’’#(选定两个合并条件)
————————————————————————————————————————----------------------
美国2010年人口分布数据分析:
“- 需求:\n”,
" - 导入文件,查看原始数据\n",
" - 将人口数据和各州简称数据进行合并\n",
" - 将合并的数据中重复的abbreviation列进行删除\n",
" - 查看存在缺失数据的列\n",
" - 找到有哪些state/region使得state的值为NaN,进行去重操作\n",
" - 为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN\n",
" - 合并各州面积数据areas\n",
" - 我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行\n",
" - 去除含有缺失数据的行\n",
" - 找出2010年的全民人口数据\n",
" - 计算各州的人口密度\n",
" - 排序,并找出人口密度最高的州"
____________________________________________________________________________________________
pandas高级操作之隐射-1
-替换操作
替换操作可以同步作用与Series和DataFrame
单值替换(对指定元素替换)df.replace()
普通替换:替换所有符合要求的元素:to_place=15,value=‘e’
字典替换:df.replace(to_replace={1:‘one’})#1替换成one
按列指定单值替换:to_place={列标签:替换值}, value=‘value’#列标签表示列索引,第几列
多值替换:
列表替换:to_place=[ ], value=[ ]
字典替换(推荐):to_place={to_place:value,to_place:value}
_________
import numpy as np
import pandas as pd
from pandas import DataFrame
-映射操作
定义:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定(给一个元素提供不同的表现形式)
创建一个df,两列分别是姓名和薪资,然后给其名字起对应的英文名字
import numpy as np
import pandas as pd
from pandas import DataFrame
dic1={
‘name’:[‘张三’,‘李四’,‘王二麻子’],
‘salary’:[15000,20000,30000]
}
df=DataFrame(data=dic1)
#映射关系表
dic2={
‘张三’:‘tom’,
‘李四’:‘jack’,
‘王二麻子’:‘john’,
}
#map是Series的方法,只能被series调用
df[‘e_name’]=df[‘name’].map(dic2)
df
-运算工具
需求:超过3000部分的钱缴纳50%的税,计算每个人的税后薪资
def after_tax(s):#计算s对应的税后薪资
return s-(s-3000)*0.5
df[‘after_tax’]=df[‘salary’].map(after_tax)
df
-排序实现的随机抽样
take()#用隐式索引
np.random.permutation()
—————————————————————————————
pandas高级操作之分组聚合-1(分组聚合:求出每一种水果的平均价格)
-数据的分类处理的核心:
groupby()函数
groups属性查看分组情况
import numpy as np
import pandas as pd
from pandas import DataFrame
df=DataFrame({‘item’:[‘Apple’,‘Banana’,‘Orange’,‘Banana’,‘Orange’,‘Apple’],‘color’:[‘red’,‘yellow’,‘yellow’,‘green’,‘green’,‘green’],‘price’: [4,3,3,2.5,4,2],‘weight’:[12,20,50,30,20,44]})
#对水果的种类进行分组
df.groupby(by=‘item’)
#查看详细的分组情况
df.groupby(by=‘item’).groups
#计算出每一种水果的平均价格(mean只能对数值型数据进行操作)
#df.groupby(by=‘item’).mean()
#除去重量
df.groupby(by=‘item’)[‘price’].mean()
#计算每一种颜色水果的平均重量
df.groupby(by=‘color’)[‘weight’].mean()
#将计算出的平均重量汇总到源数据中,根据颜色分配平均重量
dic=df.groupby(by=‘color’)[‘weight’].mean().to_dict()
df[‘mean_w’]=df[‘color’].map(dic)
df
-高级数据聚合(transform可以调用自己定义的方法def,apply和transform的作用相同)
使用groupby分组后,也可以使用transform和apply提供自定义函数实现更多的运算
df.groupby(‘item’)[‘price’].sum()<==>df.group(‘item’)[‘price’].apply(sum)
transform和apply都会进行运算,在transform或者apply中传入函数即可
transform和apply也可以传入一个lambda表达式
def my_mean(s):
m_sum=0
for i in s:
m_sum+=i
return m_sum/len(s)
df.groupby(by=‘item’)[‘price’].transform(my_mean)
_______________________
pandas透视表&交叉表
-数据加载
读取type.txt文件数据
import numpy as np
import pandas as pd
from pandas import DataFrame
import sqlite3 as sqlite3
df=pd.read_csv(’./data/type-.txt’,header=None,sep=’-’)
-读取数据库中的数据
import numpy as np
import pandas as pd
from pandas import DataFrame
import sqlite3 as sqlite3
#连接数据库,获取连接对象
conn=sqlite3.connect(’./data/weather_2012.sqlite’)
#读取库表中的数据值
sql_df=pd.read_sql(‘select * from weather_2012’,conn)
#将一个df中的数据值写入存储到db
df.to_sql(‘sql_data456’,conn)
sql_df1=pd.read_sql(‘select * from sql_data456’,conn)
sql_df1
-透视表
定义:是一种可以对数据动态排布并且分类汇总的表格格式。或许大多数人都在Excel使用过数据透视表,也体会到他的强大功能,而在pandas中他被称作pivot_table
优点:
灵活性高,随意定制你的分析计算要求
脉络清洗已于理解数据
操作性强,报表神器
pivot_table有四个最重要的参数index/values/columns/sggfunc
-index参数:分类汇总的分类条件
每个pivot_table必须拥有一个index。如果想查看哈登对阵每个队伍的得分则需要对每个队进行分类并计算其各类得分的平均分,想看看对阵同一对手在不同主客场下的数据,分类条件为对手和主客场
import numpy as np
import pandas as pd
df=pd.read_csv(’./data/透视表-篮球赛.csv’,encoding=‘utf8’)
df.pivot_table(index=[‘对手’,‘主客场’])
-values参数:需要队计算的数据进行筛选
如果我们只需要哈登在主客场和不同胜负情况下的得分/篮板与助攻三项数据:
df.pivot_table(index=[‘主客场’,‘胜负’],values=[‘得分’,‘篮板’,‘助攻’])
-aggfunc参数:设置我们对数据聚合时进行的函数操作
当我们未设置aggfunc时,它默认aggfunc=’mean‘计算均分
–还想获得james harden在主客场和不同胜负情况下的总得分/总篮板/总助攻时:
df.pivot_table(index=[‘主客场’,‘胜负’],values=[‘得分’,‘篮板’,‘助攻’],aggfunc=‘sum’)
-columns:可以设置列层次字段
对values字段进行分类
–分类,fill_value表示空值NaN填0
#获取所有队主客场的总得分
df.pivot_table(index=[‘主客场’],values=[‘得分’],aggfunc=‘sum’)
–#获取所有队主客场的总得分,总得分基础上进行了对手的分类
df.pivot_table(index=[‘主客场’],values=[‘得分’],columns=‘对手’,aggfunc=‘sum’,fill_value=0)
-交叉表
定义:是一种用于计算分组的特殊透视图,对数据进行汇总
pd.crosstab(index,colums)
index:分组数据,交叉表的行索引
colunmns:交叉表的列索引
——————
import pandas as pd
from pandas import DataFrame
df=DataFrame({
‘sex’:[‘man’,‘man’,‘women’,‘women’,‘man’,‘women’,‘man’,‘women’,‘women’],
‘age’:[15,23,25,17,35,57,24,31,22],
‘smoke’:[True,False,False,True,True,False,False,True,False],
‘height’:[168,179,181,166,173,178,188,190,160]
})
#求出各个性别抽烟的人数
pd.crosstab(df.smoke,df.sex)
#求出各个年龄段抽烟的人数
pd.crosstab(df.age,df.smoke)
_____________________________________________________
### 需求:美国大选献金项目数据分析

  • 加载数据
  • 查看数据的基本信息
  • 指定数据截取,将如下字段的数据进行提取,其他数据舍弃
    • cand_nm :候选人姓名
    • contbr_nm : 捐赠人姓名
    • contbr_st :捐赠人所在州
    • contbr_employer : 捐赠人所在公司
    • contbr_occupation : 捐赠人职业
    • contb_receipt_amt :捐赠数额(美元)
    • contb_receipt_dt : 捐款的日期
  • 对新数据进行总览,查看是否存在缺失数据
  • 用统计学指标快速描述数值型属性的概要。
  • 空值处理。可能因为忘记填写或者保密等等原因,相关字段出现了空值,将其填充为NOT PROVIDE
  • 异常值处理。将捐款金额<=0的数据删除
  • 新建一列为各个候选人所在党派party
  • 查看party这一列中有哪些不同的元素
  • 统计party列中各个元素出现次数
  • 查看各个党派收到的政治献金总数contb_receipt_amt
  • 查看具体每天各个党派收到的政治献金总数contb_receipt_amt
  • 将表中日期格式转换为’yyyy-mm-dd’。
  • 查看老兵(捐献者职业)DISABLED VETERAN主要支持谁
  • ——————————————————————————
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是一个简单的爬虫程序,使用 Python 和 BeautifulSoup 库来获取 https://nba.hupu.com/stats/players 网站上的球员数据,并使用 pandas 和 matplotlib 库来进行数据分析可视化。 ```python import requests from bs4 import BeautifulSoup import pandas as pd import matplotlib.pyplot as plt url = 'https://nba.hupu.com/stats/players' response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') # 获取表头 header = [] for th in soup.find_all('th'): header.append(th.text.strip()) # 获取数据 data = [] for tr in soup.find_all('tr')[1:]: row = [] for td in tr.find_all('td'): row.append(td.text.strip()) data.append(row) # 转换为 DataFrame 对象 df = pd.DataFrame(data, columns=header) # 将数据类型转换为数值类型 df = df.apply(pd.to_numeric, errors='ignore') # 绘制柱状图 plt.figure() df.plot.bar(x='球员', y='得分', rot=0) plt.title('NBA 球员得分排名') plt.xlabel('球员') plt.ylabel('得分') plt.show() ``` 以上程序会爬取 https://nba.hupu.com/stats/players 网站上的球员数据,并将数据转换为 DataFrame 对象,然后使用 pandas 库来对数据进行分析和可视化。这里我们只展示了一种简单的可视化方式,即绘制球员得分排名的柱状图。 运行程序后,会弹出一个窗口显示柱状图,如下图所示: ![NBA 球员得分排名柱状图](https://img-blog.csdnimg.cn/20211022171115725.png) 该图展示了 NBA 球员的得分排名,可以看到,詹姆斯·哈登(James Harden)以场均 36.1 分的得分高居榜首,而另外几名球员的得分也都超过了 30 分,这反映了 NBA 的比赛水平之高。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值