#------------------------------------------------------------

# PCA讲解

#------------------------------------------------------------------

#1.导入可以进行PCA降维的库

from sklearn.decomposition import PCA



#2.先准备一下数据,这里我们用sklearn库自带的iris数据

from sklearn.datasets import load_iris

iris = load_iris()

iris.data #这是一个二维数组,里面只有具体数值,是一个4列的数据,每列是一个变量


iris.feature_names #4个变量的名字,是一个列表



#3.用PCA对我们的数据进行降维

#我们先实例化一个pca模型,对具体参数进行设定,比如n_compents,刚开始我们不知道提取几个主成分比较合适,我们不妨设为最大值4

PCA1=PCA(n_components=4)

#然后代入数据进行拟合

PCA1.fit(iris.data)


#如何查看各个主成分对原变量总体信息的解释比例呢?

PCA1.explained_variance_ #返回每个主成分对原信息解释的绝对值

PCA1.explained_variance_ratio_ #返回每个主成分对原信息的解释比例

#上面命令的结果为array([0.92461872, 0.05306648, 0.01710261, 0.00521218])

#可以看到第一个主成分的解释比例非常高,根据经验提取一个主成分就可以。如果你希望提取原数据更多信息,不妨提取两个主成分,

#具体提取几个只能自己根据经验和实际要求进行判断,比如我们最后决定提取两个

#就可以执行后面的命令

PCA2=PCA(n_components=2) #必须重新实例化这个模型,因为后面计算主成分的话可能会对矩阵进行旋转。

#然后传入数据进行模型拟合,这个fit_transform方法调用后会直接返回降维后的结果

#比如前面我们设定了n_components=2,也就是保留两个主成分,那么结果就会返回第一主成分和第二主成分的值

result1=PCA2.fit_transform(iris.data) #返回一个二维数组,两列数据。

#result1就是我们最终想要的降维后的主成分

#我们可以直接去拿这些主成分去建模,而不用使用原有的数据。

image.png

0 0 0

0 0 0

# -*- coding: utf-8 -*-
"""
Created on Mon Nov 23 11:01:18 2020
@author: Administrator
"""
#导入库
import pandas 
import matplotlib.pyplot as plt
import xlrd
path="D:\\360安全浏览器下载\\PGC_问答站-趋势分析(2020-10-29至2020-11-27).xls"
#导入数据
#在这里没有采用常规的导入方法,比如read_excel第一个参数直接设定为excel路径,是因为
#我们所用的这个excel文件的编码方式比较特殊,必须指定编码方式才能正确导入
#而pd.read_excel函数不支持编码参数encoding设定,所以我们用这种方式对pd.read_excel函数第一个参数io进行赋值
data=pd.read_excel(xlrd.open_workbook(path,encoding_override="GB2312"),sheet_name='趋势分析',skiprows=4,skipfooter=2)
#把2020年11月份的数据筛出来。
needdata=data[data["时段"].str.find("2020-11")!=-1].loc[:,["时段","独立访客"]]
#把时段变量变成日期格式
needdata["时段"]=needdata["时段"].map(lambda x:pd.Timestamp(x))
#对数据进行重新排序和重设索引
needdata.sort_values(by="时段",inplace=True)
needdata.reset_index(inplace=True,drop=True)
needdata["星期几"]=needdata["时段"].map(lambda x:x.dayofweek)+1
needdata["是否为工作日"]=needdata["星期几"]<6
#接下来计算本月剩余天数每天的平均进度,以便完成老板规定的本月目标
#如果最后一天的数据还没有统计完,还需要去掉最后一天的数据
needdata=needdata.iloc[0:-1,:]
本月天数=30
本月每日目标=800
本月目标=本月每日目标*30 #24000
本月已完成部分=needdata["独立访客"].sum() 
本月已过工作日天数=needdata["时段"][needdata["是否为工作日"]].count()
本月已过周末天数=needdata["时段"][needdata["是否为工作日"]==False].count()
本月已过天数=needdata.shape[0] 
本月平均每日完成=本月已完成部分/本月已过天数
本月平均每个工作日完成=needdata["独立访客"][needdata["是否为工作日"]].sum()/本月已过工作日天数
本月平均每个周末日完成=needdata["独立访客"][needdata["是否为工作日"]==False].sum()/本月已过周末天数
本月剩余天数=本月天数-本月已过天数
本月未完成部分=本月目标-本月已完成部分
本月未完成部分的任务分配到每天=本月未完成部分/本月剩余天数
print("本月天数:",本月天数)
print("本月每日目标:",本月每日目标)
print("本月目标:",本月目标)
print("本月已完成部分:",本月已完成部分)
print("本月已过天数",本月已过天数)
print("本月平均每日完成",本月平均每日完成)
print("本月平均每个工作日完成:",本月平均每个工作日完成)
print("本月平均每个周末日完成:",本月平均每个周末日完成)
print("本月未完成部分:",本月未完成部分)
print("本月剩余天数:",本月剩余天数)
print("本月未完成部分的任务分配到每天",本月未完成部分的任务分配到每天)


0 0 0

0 0 0

LXM21

2020-11-26

python传参