精华内容
下载资源
问答
  • Python数据分析学习总结

    千次阅读 2017-10-02 22:43:19
    Python数据分析学习总结 概述数据分析的含义与目标方法:统计分析方法目标:提取有用信息手段:研究、概括、总结 Python与数据分析Python特点:简洁、开发效率高、运算速度慢、胶水特性(集成C语言)Python数据分析...

    Python数据分析学习总结

    • 概述

      • 数据分析的含义与目标

        方法:统计分析方法

        目标:提取有用信息

        手段:研究、概括、总结

      • Python与数据分析

        Python特点:简洁、开发效率高、运算速度慢、胶水特性(集成C语言)

        Python数据分析:numpy、scipy、matplotlib、pandas、scikit-learn、keras…

      • Python数据分析大家族

        numpy:数据结构基础

        scipy:强大的科学计算方法(矩阵分析、信号分析、数理分析…)

        matplotlib:丰富的可视化套件

        pandas:基础数据分析套件

        scikit-learn:强大的数据分析建模库

        keras:人工神经网络

      • Python数据分析环境搭建

        平台:Windows、Linux

        科学计算工具:Anaconda

    • Python数据分析基础

      • numpy

        开源、数据计算扩展;ndarray、多维操作、线性代数

        • numpy使用程序:

          import numpy as np
          
          def main():
              lst=[[1,3,5],[2,4,6]]
              print(type(lst))
              np_lst=np.array(lst)
              print(type(np_lst))
              np_lst=np.array(lst, dtype=np.float)
              print(np_lst.shape)
              print(np_lst.ndim)
              print(np_lst.dtype)
              print(np_lst.itemsize)
              print(np_lst.size)
          
          if __name__=="__main__":
              main()
          执行结果:
          <class 'list'>
          <class 'numpy.ndarray'>
          (2, 3)
          2
          float64
          8
          6
          
        • numpy常用数组

          print(np.zeros([2,4]))
          print(np.ones([3,5]))
          print(np.random.rand(2,4))
          print(np.random.rand())
          print("RandInt:")
          print(np.random.randint(1,10,3))
          print("Randn:")  # 标准正态分布
          print(np.random.randn(2,4)) 
          print("Choice")
          print(np.random.choice([10,20,30]))
          print("Distribute:")  # Beta分布
          print(np.random.beta(1,10,100))
          
          执行结果:
          [[ 0.  0.  0.  0.]
           [ 0.  0.  0.  0.]]
          [[ 1.  1.  1.  1.  1.]
           [ 1.  1.  1.  1.  1.]
           [ 1.  1.  1.  1.  1.]]
          [[ 0.80307088  0.25491367  0.54381007  0.10159737]
           [ 0.71565024  0.62473538  0.66892166  0.41078071]]
          0.16467244260637237
          RandInt:
          [5 3 2]
          Randn:
          [[-0.51707383 -1.46091351 -0.78197086  0.44640286]
           [-0.0998081   0.40701679  0.07750661  0.66041753]]
          Choice
          10
          Distribute:
          [ 0.03897375  0.09804991  0.1617222  ...,  0.12878516  0.11699157
            0.05681225]
          
        • numpy常用操作

          print("Arange:")
          print(np.arange(1,11))
          print("Exp:")
          print(np.exp(lst))
          print("Exp2:")
          print(np.exp2(lst))
          print("Sqrt:")
          print(np.sqrt(lst))
          print("Sin:")
          print(np.sin(lst))
          print("Log:")
          print(np.log(lst))
          执行结果:
          Arange:
          [ 1  2  3  4  5  6  7  8  9 10]
          Exp:
          [[   2.71828183   20.08553692  148.4131591 ]
           [   7.3890561    54.59815003  403.42879349]]
          Exp2:
          [[  2.   8.  32.]
           [  4.  16.  64.]]
          Sqrt:
          [[ 1.          1.73205081  2.23606798]
           [ 1.41421356  2.          2.44948974]]
          Sin:
          [[ 0.84147098  0.14112001 -0.95892427]
           [ 0.90929743 -0.7568025  -0.2794155 ]]
          Log:
          [[ 0.          1.09861229  1.60943791]
           [ 0.69314718  1.38629436  1.79175947]]
          
          lst=np.array([[[1,2,3,4],[4,5,6,7]],[[7,8,9,10],[10,11,12,13]],[[14,15,16,17],[18,19,20,11]]])
          print(lst.sum(axis=2))
          print(lst.sum(axis=1))
          print(lst.sum(axis=0))
          print("Max:")
          print(lst.max(axis=1))
          print("Min:")
          print(lst.min(axis=0))  
          执行结果:
          [[10 22]
           [34 46]
           [62 68]]
          [[ 5  7  9 11]
           [17 19 21 23]
           [32 34 36 28]]
          [[22 25 28 31]
           [32 35 38 31]]
          Max:
          [[ 4  5  6  7]
           [10 11 12 13]
           [18 19 20 17]]
          Min:
          [[1 2 3 4]
           [4 5 6 7]]
          
          lst1=np.array([10,20,30,40])
          lst2=np.array([4,3,2,1])
          print("Add:")
          print(lst1+lst2)
          print("Sub:")
          print(lst1-lst2)
          print("Mul:")
          print(lst1*lst2)
          print("Div:")
          print(lst1/lst2)
          print("Square:")
          print(lst1**2)
          print("Dot:")
          print(np.dot(lst1.reshape([2,2]),lst2.reshape([2,2])))
          print("Concatenate:")
          print(np.concatenate((lst1,lst2),axis=0))
          print("vstack:")
          print(np.vstack((lst1,lst2)))
          print("hstack:")
          print(np.hstack((lst1,lst2)))
          print("Split:")
          print(np.split(lst1,2))
          print(np.split(lst1,4))
          print("Copy:")
          print(np.copy(lst1))
          执行结果:
          Add:
          [14 23 32 41]
          Sub:
          [ 6 17 28 39]
          Mul:
          [40 60 60 40]
          Div:
          [  2.5          6.66666667  15.          40.        ]
          Square:
          [ 100  400  900 1600]
          Dot:
          [[ 80  50]
           [200 130]]
          Concatenate:
          [10 20 30 40  4  3  2  1]
          vstack:
          [[10 20 30 40]
           [ 4  3  2  1]]
          hstack:
          [10 20 30 40  4  3  2  1]
          Split:
          [array([10, 20]), array([30, 40])]
          [array([10]), array([20]), array([30]), array([40])]
          Copy:
          [10 20 30 40]
          
        • 线程方程组

          import numpy as np
          from numpy.linalg import *
          
          def main():
          
              print(np.eye(3))
              lst=np.array([[1,2],[3,4]])
              print("Inv:")
              print(inv(lst))
              print("T:")
              print(lst.transpose())
              print("Det:")
              print(det(lst))
              print("Eig:")
              print(eig(lst))
          
          if __name__=="__main__":
              main()
          
          执行结果:
          [[ 1.  0.  0.]
           [ 0.  1.  0.]
           [ 0.  0.  1.]]
          Inv:
          [[-2.   1. ]
           [ 1.5 -0.5]]
          T:
          [[1 3]
           [2 4]]
          Det:
          -2.0
          Eig:
          (array([-0.37228132,  5.37228132]), array([[-0.82456484, -0.41597356],
                 [ 0.56576746, -0.90937671]]))
          
        • numpy其他方面应用

          import numpy as np
          from numpy.linalg import *
          
          def main():
          
              print("FFT:")
              print(np.fft.fft(np.array([1,1,1,1,1,1,1,1])))
              print("Coef:")
              print(np.corrcoef([1,0,1],[0,2,1]))
              print("Poly:")
              print(np.poly1d([2,1,3]))
          
          if __name__=="__main__":
              main()
          
          执行结果:
          FFT:
          [ 8.+0.j  0.+0.j  0.+0.j  0.+0.j  0.+0.j  0.+0.j  0.+0.j  0.+0.j]
          Coef:
          [[ 1.        -0.8660254]
           [-0.8660254  1.       ]]
          Poly:
             2
          2 x + 1 x + 3
          
      • matplotlib

        • 概述

          matplotlib是关键的绘图库。

        • 实现

          import numpy as np
          import matplotlib.pyplot as plt
          
          def main():
              #line
              x=np.linspace(-np.pi,np.pi,256,endpoint=True)
              c,s=np.cos(x),np.sin(x)
              plt.figure(1)
              plt.plot(x,c,color="blue",linewidth=1.0,linestyle="-",label="COS",alpha=0.5)
              plt.plot(x,s,"r*",label="SIN")
              plt.title("COS & SIN")
              ax=plt.gca()
              ax.spines["right"].set_color("none")
              ax.spines["top"].set_color("none")
              ax.spines["left"].set_position(("data",0))
              ax.spines["bottom"].set_position(("data",0))
              ax.xaxis.set_ticks_position("bottom")
              ax.yaxis.set_ticks_position("left")
              plt.show()
          
              #scatter
              fig=plt.figure()
              ax=fig.add_subplot(3,3,1)
              n=128
              X=np.random.normal(0,1,n)
              Y=np.random.normal(0,1,n)
              T=np.arctan2(Y,X)
              #plt.axes([0.025,0.025,0.95,0.95])
              #plt.scatter(X,Y,s=75,c=T,alpha=0.5)
              ax.scatter(X,Y,s=75,c=T,alpha=0.5)
              plt.xlim(-1.5,1.5),plt.xticks([])
              plt.ylim(-1.5,1.5),plt.yticks([])
              plt.axis()
              plt.title("scatter")
              plt.xlabel("x")
              plt.ylabel("y") 
              plt.show()
          
              #bar
              fig.add_subplot(332)
              n=10
              X=np.arange(n)
              Y1=(1-X/float(n))*np.random.uniform(0.5,1.0,n)
              Y2=(1-X/float(n))*np.random.uniform(0.5,1.0,n)
              plt.bar(X,+Y1,facecolor='#9999ff',edgecolor='white')
              plt.bar(X,-Y2,facecolor='#9999ff',edgecolor='white')
              for x,y in zip(X,Y1):
                  plt.text(x+0.4,y+0.05,'%.2f' % y,ha='center',va='bottom')
              for x,y in zip(X,Y2):
                  plt.text(x+0.4,-y-0.05,'%.2f' % y,ha='center',va='bottom')       
              plt.show()
          
              #Pie
              fig.add_subplot(333)
              n=20
              Z=np.ones(n)
              Z[-1]*=2
              plt.pie(Z,explode=Z*.05,colors=['%s' % (i / float(n)) for i in range(n)],
                      labels=['%.2f' % (i / float(n)) for i in range(n)])
              plt.gca().set_aspect('equal')
              plt.xticks([]), plt.yticks([])
              plt.show()
          
              #polar
              fig.add_subplot(334)
              n=20
              theta=np.arange(0.0,2*np.pi,2*np.pi/n)
              radii=10*np.random.rand(n)
              plt.plot(theta, radii)
              plt.show() 
          
              #beatmap
              fig.add_subplot(335)
              from matplotlib import cm
              data=np.random.rand(3,3)
              cmap=cm.Blues
              map=plt.imshow(data,interpolation='nearest',cmap=cmap,aspect='auto',vmin=0,vmax=1)
              plt.show()
          
              #hot map
              fig.add_subplot(313)
              def f(x,y):
                  return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)
              n=256
              x=np.linspace(-3,3,n)
              y=np.linspace(-3,3,n)
              X,Y=np.meshgrid(x,y)
              plt.contourf(X,Y,f(X,Y),8,alpha=.75,cmap=plt.cm.hot)
              plt.show()
          
              #3D
              ax=fig.add_subplot(336,projection="3d")
              ax.scatter(1,1,3,s=100)
              plt.show()
          
          if __name__=="__main__":
              main()
          
      • scipy

        • 简介

          数值计算库

        • 积分

          程序:
          import numpy as np
          from scipy.integrate import quad,dblquad,nquad
          
          def main():
              # Integral
              print(quad(lambda x:np.exp(-x),0,np.inf))
              print(dblquad(lambda t,x:np.exp(-x*t)/t**3,0,np.inf,lambda x:1,lambda x:np.inf))
              def f(x,y):
                  return x*y
              def bound_y():
                  return [0,0.5]
              def bound_x(y):
                  return [0,1-2*y]
              print(nquad(f,[bound_x,bound_y]))
          
          if __name__=="__main__":
              main()
          
          执行结果:
          (1.0000000000000002, 5.842607038578007e-11)
          (0.3333333333366853, 1.3888461883425516e-08)
          (0.010416666666666668, 4.101620128472366e-16)
          
        • 优化器

          import numpy as np
          from scipy.optimize import minimize
          
          def main():
              # Optimizer
              def rosen(x):
                  return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0+(1-x[:-1])**2.0)
              x0=np.array([1.3,0.7,0.8,1.9,1.2])
              res=minimize(rosen,x0,method="nelder-mead",options={"xtol":1e-8,"disp":True})
              print("ROSE MINI:", res)
          
          if __name__=="__main__":
              main()
          
          执行结果:
          Optimization terminated successfully.
                       Current function value: 0.000000
                   Iterations: 339
                   Function evaluations: 571
          ROSE MINI:  final_simplex: (array([[ 1.        ,  1.        ,  1.        ,  1.        ,  1.        ],
                 [ 1.        ,  1.        ,  1.        ,  1.        ,  1.        ],
                 [ 1.        ,  1.        ,  1.        ,  1.00000001,  1.00000001],
                 [ 1.        ,  1.        ,  1.        ,  1.        ,  1.        ],
                 [ 1.        ,  1.        ,  1.        ,  1.        ,  1.        ],
                 [ 1.        ,  1.        ,  1.        ,  1.        ,  0.99999999]]), array([  4.86115343e-17,   7.65182843e-17,   8.11395684e-17,
                   8.63263255e-17,   8.64080682e-17,   2.17927418e-16]))
                     fun: 4.8611534334221152e-17
                 message: 'Optimization terminated successfully.'
                    nfev: 571
                     nit: 339
                  status: 0
                 success: True
                       x: array([ 1.,  1.,  1.,  1.,  1.])
          
        • 插值

          import numpy as np
          from scipy.interpolate import interpld
          
          def main():
              def fun(x):
                  return x+2*np.cos(x)
              sol=root(fun,0.1)
              print("ROOT:",sol.x,sol.fun)
              #Interpolation
              x=np.linspace(0,1,10)
              y=np.sin(2*np.pi*x)
              li=interpld(x,y,kind="cubic")
              x_new=np.linspace(0,1,50)
              y_new=li(x_new)
              figure()
              plot(x,y,"r")
              plot(x_new,y_new,"k")
              show()
              print(y_new)
          
          if __name__=="__main__":
              main()
          
        • 线性计算与矩阵分解

          程序:
          import numpy as np
          from scipy import linalg as lg
          
          def main():
              arr=np.array([[1,2],[3,4]])
              print("Det:",lg.det(arr))
              print("Inv:",lg.inv(arr))
              b=np.array([6,14])
              print("Sol:",lg.solve(arr,b))
              print("Eig:",lg.eig(arr))
              print("LU:",lg.lu(arr))
              print("QR:",lg.qr(arr))
              print("SVD:",lg.svd(arr))
              print("Schur:",lg.schur(arr))
          
          if __name__=="__main__":
              main()
          
          执行结果:
          Det: -2.0
          Inv: [[-2.   1. ]
           [ 1.5 -0.5]]
          Sol: [ 2.  2.]
          Eig: (array([-0.37228132+0.j,  5.37228132+0.j]), array([[-0.82456484, -0.41597356],
                 [ 0.56576746, -0.90937671]]))
          LU: (array([[ 0.,  1.],
                 [ 1.,  0.]]), array([[ 1.        ,  0.        ],
                 [ 0.33333333,  1.        ]]), array([[ 3.        ,  4.        ],
                 [ 0.        ,  0.66666667]]))
          QR: (array([[-0.31622777, -0.9486833 ],
                 [-0.9486833 ,  0.31622777]]), array([[-3.16227766, -4.42718872],
                 [ 0.        , -0.63245553]]))
          SVD: (array([[-0.40455358, -0.9145143 ],
                 [-0.9145143 ,  0.40455358]]), array([ 5.4649857 ,  0.36596619]), array([[-0.57604844, -0.81741556],
                 [ 0.81741556, -0.57604844]]))
          Schur: (array([[-0.37228132, -1.        ],
                 [ 0.        ,  5.37228132]]), array([[-0.82456484, -0.56576746],
                 [ 0.56576746, -0.82456484]]))
          
      • pandas

        • 简介

          数据分析库

        • 基础数据分析技术

          import numpy as np
          import pandas as pd
          
          def main():
              #Data Structure
              s=pd.Series([i*2 for i in range(1,11)])
              print(type(s))   
              dates=pd.date_range("20170301",periods=8)
              df=pd.DataFrame(np.random.randn(8,5),index=dates,columns=list("ABCDE"))
              print(df)
              #Basic
              print(df.head(3))
              print(df.tail(3))
              print(df.index)
              print(df.values)
              print(df.T)
              print(df.sort(columns="C"))
              print(df.sort_index(axis=1,ascending=False))
              print(df.describe())
              #Select
              print(type(df["A"]))
              print(df[:3])
              print(df["20170301":"20170304"])
              print(df.loc[dates[0]])
              print(df.loc["20170301":"20170304",["B","D"]])
              print(df.iloc[1:2,2:4])
              print(df.iloc[1,4])
              print(df[df.B>0][df.A<0])
              print(df[df>0])
              print(df[df["E"].isin([1,2])])
          
              #Set
              s1=pd.Series(list(range(10,18)),index=pd.date_range("20170301",periods=8))
              df["F"]=s1
              print(df)
              df.at[dates[0],"A"]=0
              print(df)
              df.iat[1,1]=1
              df.loc[:,"D"]=np.array([4]*len(df))
              df2=df.copy()
              df2[df2>0]=df2
              print(df2)
          
              #Missing Value
              df1=df.reindex(index=dates[:4],columns=list("ABCD")+["G"])
              df1.loc[dates[0]:dates[1],"G"]=1
              print(df1)
              print(df1.dropna())
              print(df1.fillna(value=2))
          
              #Concat
              pieces=[df[:3],df[-3:]]
              print(pd.concat(pieces))
              left=pd.DataFrame({"key":["x","y"],"value":[1,2]})
              right=pd.DataFrame({"key":["x","z"],"value":[3,4]})
              print("LEFT:",left)
              print("RIFHT:",right)
              print(pd.merge(left,right,on="key",how="left"))
              df3=pd.DataFrame({"A":["a","b","c","b"],"B":list(range(4))})
              print(df3.groupby("A").sum())
          
          if __name__=="__main__":
              main()
          
        • 时间、绘图

          import numpy as np
          import pandas as pd
          from pylab import *
          
          def main():
              #Time Series
              t_exam=pd.date_range("20170301",periods=10,freq="S")
              print(t_exam)
          
              #Graph
              ts=pd.Series(np.random.randn(1000),index=pd.date_range("20170301",periods=1000))
              ts=ts.cumsum()
              ts.plot()
              show()
          
          if __name__=="__main__":
              main()
          
      • scikit-learn

        • 简介

          数据挖掘建模、机器学习

        • 机器学习与决策树

          机器学习:因子–>结果

          结果:

          不带标记–>无监督学习(聚类);带标记–>监督学习

          有限离散–>分类;连续–>回归

          决策树:监督学习;树形结构

        • Iris数据集

          • 花萼长度
          • 花萼宽度
          • 花瓣长度
          • 花瓣宽度
          • 种类:Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾)、Iris Virginica(维吉尼亚鸢尾)
        • 实现

          import numpy as np
          import pandas as pd
          from sklearn.datasets import load_iris
          from sklearn.cross_validation import train_test_split
          from sklearn import tree
          from sklearn import metrics
          def main():
              #Pre-processing
              iris=load_iris()
              print(iris)
              print(len(iris["data"]))
              train_data,test_data,train_target,test_target=train_test_split(iris.data,iris.target,test_size=0.2,random_state=1)
          
              #Model
              clf=tree.DecisionTreeClassifier(criterion="entropy")
              clf.fit(train_data,train_target)
              y_pred=clf.predict(test_data)
          
              #Verify
              print(metrics.accuracy_score(y_true=test_target,y_pred=y_pred))
              print(metrics.confusion_matrix(y_true=test_target,y_pred=y_pred))
          
          if __name__=="__main__":
              main()
          
      • keras

        • 简介

          人工神经网络

        • 简单神经网络实现

          Keras安装步骤:Anaconda CMD;conda install mingw libpython;pip install keras;pip install np_utils

        • 实例

          注意:需要需要C:/user/username/.keras/keras.json,具体改后内容如下:{“backend”: “theano”,”image_data_format”: “th”,”epsilon”: 1e-07,”floatx”: “float32”}。

          import numpy as np
          from keras.models import Sequential
          from keras.layers import Dense,Activation
          from keras.optimizers import SGD
          from sklearn.datasets import load_iris
          from sklearn.preprocessing import LabelBinarizer
          from sklearn.cross_validation import train_test_split
          
          def main():
              pass
              iris=load_iris()
              print(iris["target"])
              LabelBinarizer().fit_transform(iris["target"])
              train_data,test_data,train_target,test_target=train_test_split(iris.data,iris.target,test_size=0.2,random_state=1)
              labels_train=LabelBinarizer().fit_transform(train_target)
              labels_test=LabelBinarizer().fit_transform(test_target)
          
              model=Sequential(
                      [
                              Dense(5,input_dim=4),
                              Activation("relu"),
                              Dense(3),
                              Activation("sigmoid"),
                      ]
                      )
              # 优化器
              sgd=SGD(lr=0.01,decay=1e-6,momentum=0.9,nesterov=True)
              model.compile(optimizer=sgd,loss="categorical_crossentropy")
              model.fit(train_data,labels_train,nb_epoch=200,batch_size=40)
              print(model.predict_classes(test_data))
              #model.save_weights("D:/w")
              #model.load_weights("D:/w")
          
          if __name__=="__main__":
              main()
          
      • 参考文献

        http://www.imooc.com/learn/843

    展开全文
  • 作者找工作中 V信:dfs2191 开发环境 4.3【开发平台及环境】 ...数据清洗 分析模块pandas,numpy 可视化模块pyecharts 下期更新flask可项目视化项目 python,MySQL,Echarts,js 一:数据采集 招聘...

    作者找工作中

    开发环境

    4.3【开发平台及环境】
    Windons 10 教育版
    Python 3.7
    IntelliJ IDEA 2018.2.1 / PyCharm
    Googe Chrome
    数据清洗 分析模块pandas,numpy
    可视化模块pyecharts

    下期更新flask可项目视化项目
    python,MySQL,Echarts,js

    一:数据采集

    招聘信息采集:使用爬虫采集技术,采集字段如下:
    公司名称,职位,职位亮点,ID,规模,城市,学历,工作经验,公司类型,公司网站,求职网址,编号,城市ID

    项目开发时间2019-10-10到10-16期间,爬虫代码随时间变化可能无效

    import requests
    from lxml import etree
    import re
    import json
    import csv
    import time
    header = {
        'Accept': 'application/json, text/plain, */*',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3732.400 QQBrowser/10.5.3819.400',
        "cookie":"x-zp-client-id=e2f8492a-39c6-44f1-f181-3408dfc4c651; urlfrom2=121114583; adfcid2=www.baidu.com; adfbid2=0; sts_deviceid=1"
                 "6d66515ef32a9-00a0ecf38d6864-34564a75-2073600-16d66515ef5900; sou_experiment=capi; sensorsdata2015jssdkcross=%7B%22distin"
                 "ct_id%22%3A%2216d66515f058fe-0a7bf2d03b44ab-34564a75-2073600-16d66515f062a6%22%2C%22%24device_id%22%3A%2216d66515f058fe-0a7"
                 "bf2d03b44ab-34564a75-2073600-16d66515f062a6%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E"
                 "%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search"
                 "_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%7D; acw_tc=276082061571053"
                 "5124757507e7f855599045d70c3a3baead7cb13244f9ce1; dywea=95841923.3929760379540693000.1569379672.1569379672.1571054618.2; dywez"
                 "=95841923.1571054618.2.2.dywecsr=jobs.zhaopin.com|dyweccn=(referral)|dywecmd=referral|dywectr=undefined|dywecct=/cc224037312"
                 "j00240379404.htm; Hm_lvt_38ba284938d5eddca645bb5e02a02006=1569379672,1571054618; __utma=269921210.106900723.1569379672.156937"
                 "9672.1571054618.2; __utmz=269921210.1571054618.2.2.utmcsr=jobs.zhaopin.com|utmccn=(referral)|utmcmd=referral|utmcct=/CC2240373"
                 "12J00240379404.htm; LastCity%5Fid=749; ZP_OLD_FLAG=false; POSSPORTLOGIN=0; CANCELALL=0; LastCity=%E9%95%BF%E6%A0%AA%E6%BD%AD; "
                 "sts_sg=1; sts_chnlsid=Unknown; zp_src_url=http%3A%2F%2Fjobs.zhaopin.com%2FCC879864350J00334868004.htm; jobRiskWarning=true; acw"
                 "_sc__v2=5da57cb5b3223856c3fb768be55c39bec99b9b33; ZL_REPORT_GLOBAL={%22jobs%22:{%22recommandActionidShare%22:%22f4ec2b1a-bbe2-41"
                 "ba-b0fc-14c426ffd63b-job%22%2C%22funczoneShare%22:%22dtl_best_for_you%22}}; sts_sid=16dce6f31656d-0cee0282bd8b1b-34564a75-2073600-16dce6f31666cf; sts_evtseq=2"
    }
    def get_context(number):
        url = "https://fe-api.zhaopin.com/c/i/similar-positions?number="+number
        urll='https://jobs.zhaopin.com/'+number+'.htm'
        html = requests.get(url=url, headers=header)
        # print(html.json()['data']['data']['list'])
        companyName,companyNumber,companySize,salary60,workCity,education,\
        workingExp,property,companyUrl,positionURL,name,welfareLabel,number,cityId,cityDistrict,applyType,score,tag="","","","","","","","","","","","","","","","","",""
        try:
            for i in html.json()['data']['data']['list']:
                companyName = i['companyName']  # 公司
                companyNumber = i['companyNumber']  # ID
                companySize = i['companySize']  # 规模
                salary60 = i['salary60']  # 薪水
                workCity = i['workCity']  # 城市
                education = i['education']  # 学历
                workingExp = i['workingExp']  # 工作经验
                property = i['property']  #企业性质
                companyUrl = i['companyUrl']  # 公司网址
                positionURL = i['positionURL']  # 求职网址
                name = i['name']  # 职位名称
                # welfareLabel = i['welfareLabel']  # 福利
                number = i['number']  # 编号
                cityId = i['cityId']  # 城市id
                cityDistrict = i['cityDistrict']  # 城市区域
                applyType = i['applyType']  # 公司类型
                score = i['score']  # 公司分数
                tag=[] #标签
    
                for j in i['welfareLabel']:
                    tag.append(j['value'])
                tag="/".join(tag)
        except:
            pass
    
        html = requests.get(url=urll,headers=header)
        html_xpath = etree.HTML(html.text)
        # miaosu = re.findall('<div class="describtion__detail-content">(.*?)</div></div><div class="job-address clearfix">', html.text)
        miaosu = html_xpath.xpath('string(//*[@class="describtion__detail-content"])')      # 提取子标签所有文本
        print("----------------------"+miaosu)
        miaosu = ''.join(miaosu)
        # time.sleep(1)
        fp = open('智联招聘_大数据.csv', 'a', newline='')
        write = csv.writer(fp)
        row = (companyName,name, tag ,companyNumber ,companySize, salary60,workCity,
               education,workingExp,property,companyUrl,positionURL,name,number,cityId,cityDistrict,applyType,score,miaosu)
        write.writerow(row)
        print('正在写入----'+workCity+'----的职位数据'+'----------'+name)
        fp.close()
    
    # Web前端
    
    def get_url(city):
        key = '大数据'      # 搜索关键字
    
        url = 'https://fe-api.zhaopin.com/c/i/sou?pageSize=4000&cityId='+city+'&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1' \
                '&kw='+key+'&kt=3&lastUrlQuery=%7B%22pageSize%22:%2260%22,%22jl%22:%22489%22,%22kw%22:%22%E5%A4%A7%E6%95%B0%E6%8D%AE%22,%22kt%22:%223%22%7D'
    
        number  = ''
        url_head = 'https://jobs.zhaopin.com/'
    
        html = requests.get(url = url, headers = header)
        try:
            for i in html.json()['data']['results']:
                print("-----------"+i['number'])
                get_context(i['number'])          # 内容爬虫开始---/
        except:
            pass
    
    
    url = 'https://sou.zhaopin.com/?jl=852&sf=0&st=0&kw=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88&kt=3'
    html = requests.get(url = url, headers = header).text
    data =re.findall('<script>__INITIAL_STATE__=(.*?)</script>',html)
    datas = json.loads(data[0])
    try:
        for i in datas["basic"]["dict"]["location"]["province"]:
            get_url(i["code"])
    except:
        pass
    
    

    采集的数据保存为csv格式

    在这里插入图片描述

    关于python访问MySQL数据,使用matplotlib(复杂)可视化的简单例子访问:点击查看项目

    简介:众多的招聘岗位中,大数据岗位分布在全国各个城市,岗位与企业之间又有着错综复杂的联系,企业类型多样,不同的企业有着各自不同的文化,对应聘者也有着不同约束。应聘者不同经验获得的薪资也不一样,找到符合自己的职位,需要考虑招聘者发布的基本要求,如:经验,学历等各方面的需求。应聘者也会考查企业性质和类型。以下我们对发布求职公司进行分析。

    大数据岗位基本分析

    1 统计出公司类型的数量

    数据量不大,为了节省开发时间,使用了pandas,可视化使用的是pyecharts,也可以使用将数据导入MySQL,可视化使用 Echarts,后端我常使用flask / node.js,选其一即可,下一个项目介绍flask为依托的可视化项目

    # 公司类型的数量
    import pandas as pd
    from pyecharts import Bar, Pie
    
    # # 显示所有列
    # pd.set_option('display.max_columns', None)
    # # 显示所有行
    # pd.set_option('display.max_rows', None)
    # # 设置value的显示长度为100,默认为50
    # pd.set_option('max_colwidth', 100)
    
    # 引擎,去空(只有有一个字段为空就删除整行数据),根据ID字段去重,保留第一个
    data = pd.read_csv('../File/智联招聘_数据分析师.csv',engine='python').dropna().drop_duplicates('ID','first')
    
    
    # 分组,求数量,排序(倒叙),
    
    # conpany = data[['ID','公司类型']].groupby(by='公司类型',as_index=False).count()
    
    company = data[['ID','公司类型']].groupby(by='公司类型',as_index=False).count().sort_index(by='ID',ascending=False)
    
    # company.to_csv('text.csv')
    
    bar = Bar(width=2000, height=1000)
    bar.add("公司类型", company['公司类型'], company['ID'],
            bar_category_gap="50%",  # 柱状大小减少一半
            is_label_show=True,  # 显示柱子值
            xaxis_label_textsize=15,  # x轴 柱子text的大小
            yaxis_label_textsize=25,  #y轴
            xaxis_rotate=30,        #x轴字体旋转
            legend_text_size=25
            )   #title大小
    bar.render("2.1公司类型的数量.html")
    # #
    pie = Pie(height=850, width=1800)
    pie.add("公司类型", company['公司类型'], company['公司名称'],
            is_label_show=True)
    pie.render("2.1公司类型的数量占比.html")
    

    可视化图表
    在这里插入图片描述
    在这里插入图片描述

    分析:
    在数量前10的公司类型中,民营类型稳居榜首,占总体比例57%。民营企业在我国已经经历了20多年的发展和改革,民营经济已经克服了先天性不足和自身基础薄弱等劣势,已经成为了我国国民经济的重要组成部分。
    股份制企业榜二,占总体比例14.68%。股份制企业最早诞生在欧洲国家,是企业为了征集民间参与企业发展的一种战略,发行股票,一方借以取得股息,另一方面又能让人们参与企业经营和管理。
    上市公司榜三,占比7.42%。在美国500家大企业有96%是上市公司,是一种公开发行股票需要经过国务院或者国务院授权的一种公司,上市公司可以在证券交易所自由交易个人股份的以一种公司。
    国企,合资企业等其他类型的公司在招聘中并不是很突出,在另外一面也可以反应对大数据岗位需求不多,国企,合资企业发展相对稳定,成熟,普遍不属于互联网企业。

    在这里插入图片描述

    小结:
    根据上述分析,我们可以了解,大数据分析师岗位,民营企业,股份制企业招聘数量相对较多,国家鼓励大众创业,创新,推动国民经济发展,IT互联网企业更多的是属于创新类企业,新型企业。国企,合资企业成熟,但是却没有引入太多互联网大数据技术。在面向求职这一方向,IT大数据分析师应该更多的考虑民营企业和股份制企业。

    统计大数据职位经验要求的数量

    同理上述

    data = pd.read_csv('../File/智联招聘_数据分析师.csv',engine='python').dropna().drop_duplicates('ID',inplace=False)
    undergo = data[['职位','工作经验']]\
            .groupby('工作经验',as_index=False)\
            .count()\
            .sort_index(by='职位',ascending=False)
    

    可视化图表在这里插入图片描述

    分析:
    大数据岗位工作要求类数量最多的是“不限”,其次是1-3年,3-5年相比榜一,榜二已减少一般,由此我们可以看出,大数据岗位属于新兴职业,求贤若渴,“不限”岗位最多,比较java开发岗位经验要求,我们可以从侧面反应企业对招聘大数据岗位降低了要求。

    在这里插入图片描述

    小结:
    根据上述Java开发,python开发和大数据分析师,三个职业对比,我们可以看到IT互联网岗位要求各不相同,我国IT互联网公司多岗位一直处于空缺,尤其是新兴职业,大数据,云计算,人工智能,才人严重匮乏。

    统计企业规模及企业数量

    # 3.统计出公司规模及数量
    import pandas as pd
    from pyecharts import Bar
    
    # 引擎,去空(只有有一个字段为空就删除整行数据),根据ID字段去重,保留第一个
    data = pd.read_csv('../File/智联招聘_数据分析师.csv', engine='python').dropna()
    data.drop_duplicates('ID', 'first', inplace=False)
    company = data[['城市ID', '规模']].groupby('规模', as_index=False).count()
    company = company.sort_index(by='城市ID', ascending=False)
    company.to_csv('text2.csv')
    # # 柱状大小减少一半, 显示柱子值,x轴 柱子text的大小,y轴,x轴字体旋转,title大小
    bar = Bar(width=2000, height=1000)
    bar.add("公司规模", company['规模'], company['城市ID'],
            bar_category_gap="50%",
            is_label_show=True,
            xaxis_label_textsize=15,
            yaxis_label_textsize=25,
            xaxis_rotate=30,
            legend_text_size=25)
    bar.render("2.3公司规模及数量.html")
    

    可视化图表在这里插入图片描述

    分析:
    在数量前10的公司规律中,100-499类型稳居榜首。IT互联网公司人员招聘大数据就岗位的也基本稳定在这个层级。
    榜二20-99人,数据在某方面可能存在一定的争议性。招聘公司五花八门,类型繁多,有培训机构,有猎头公司,有数据外包等小型公司等等一些小规模创业公司。
    榜三1000-9999人,属于中大型企业。

    在这里插入图片描述

    小结:
    根据上述分析,我们得到一个信息,招聘大数据岗位的IT互联网企业人数规模适中,大中小企业都有对大数据分析师招聘。在某一方面也反映了大数据岗位受到了大中小企业的追捧。

    统计全国招聘大数据职位薪资1w到2w的企业占总体的百分比

    # 1w到2w高薪的公司在总体数据的百分百
    import pandas as pd
    from pyecharts import Pie
    
    # 显示所有列
    pd.set_option('display.max_columns', None)
    # 显示所有行
    pd.set_option('display.max_rows', None)
    # 设置value的显示长度为100,默认为50
    pd.set_option('max_colwidth', 100)
    
    data = pd.read_csv('../File/智联招聘_数据分析师.csv',engine='python').dropna().drop_duplicates('ID','first',inplace=False)
    money = data[['公司名称','薪资']]
    money_sum_number = data[['公司名称','薪资']].groupby('薪资',as_index=False).count()
    money_sum_number = money_sum_number['公司名称'].sum()
    # #将数据分割(8千-1.4万)分成起薪8千,最高薪1.4万,最后我们只取最高薪
    first_money = money['薪资'].str.split('-').str[0].dropna()
    last_money= money['薪资'].str.split('-').str[1].dropna()
    
    # #将他转类型,不然不能用contains()函数
    a = pd.DataFrame(last_money)
    # #这是包含了 8千 和 2.5w,所以我们要匹配含有万的,能去掉8千,2.5W的不能
    money_1w_n = a[a['薪资'].str.contains('万')]['薪资']
    # print(money_1w_n)
    money_1_2w_num = []
    #将数组循环,replace将“万”替换掉,再转float类型,匹配<=2万的,存入数组money_1w_2w
    [money_1_2w_num.append(float(j.replace('万', ''))) for j in money_1w_n if float(j.replace('万', '')) <=2]
    print(money_1_2w_num)
    
    
    data_money_pie = []
    data_money_pie.append(float(money_sum_number))
    data_money_pie.append(float(len(money_1_2w_num)))
    x = ['全部占比','1w-2w占比']
    print(data_money_pie)
    # pie = Pie("全国天气类型比例", '2018-4-16')
    pie = Pie(width=2000,height=1000)
    pie.add("",x,data_money_pie,
            is_label_show=True,
            legend_text_size=25,)
    pie.render("2.4统计薪资1w-2w的占比.html")
    
    

    可视化图表
    在这里插入图片描述

    分析:
    本次计算的薪资是平均薪资,我们根据薪资分布统计出平均薪资,大数据分析师1w - 2w薪资占比27.06%,数量230,总职位:620.0(后面我们分析了不同经验的平均薪资,和不同学历的平均薪资等等)

    统计全国大数据职位数量,即在哪些城市容易找到大数据职位

    # 1.分析不同城市对于大数据岗位的需求,即在该城市是否容易找到大数据的岗位,求出不同城市“bigdata”的数量(需求量)
    import pandas as pd
    from pyecharts import Bar,WordCloud
    data = pd.read_csv('../File/智联招聘_数据分析师.csv',engine='python').dropna().drop_duplicates('ID',inplace=False)
    city_bigdata = data[['职位','城市']].groupby('城市',as_index=False).count().sort_index(by='职位',ascending=False)[:30]
    city_word = data[['职位','城市']].groupby('城市',as_index=False).count().sort_index(by='职位',ascending=False)
    # city_bigdata.to_csv('text3.csv')
    bar = Bar(width=2000,height=1000)
    bar.add("大数据岗位前20的城市",city_bigdata["城市"],city_bigdata["职位"],
            is_label_show=True,
            xaxis_label_textsize=15,
            yaxis_label_textsize=20,
            xaxis_rotate=50,
            legend_text_size=20)
    bar.render('3.1各城市岗位需求柱状图.html')
    
    word = WordCloud(width=2000,height=1000)
    word.add("前10岗位",city_word["城市"],city_word["职位"])
    word.render('3.1前10岗位词云图.html')
    # print(list(city_bigdata['城市']))
    

    可视化图表
    在这里插入图片描述在这里插入图片描述

    分析:
    在数量前15的城市中,北京稳居榜首,数据展示了城市与大数据岗位分布情况,给应聘者提供方向。
    北京,互联网公司总部所在地,在北京市有近50家大型互联网公司,稳居全国榜一,北京互联网公司占据了全国半边江山,也可以看出北京的综合实力。

    分析:
    在数量前15的城市中,北京稳居榜首,数据展示了城市与大数据岗位分布情况,给应聘者提供方向。
    北京,互联网公司总部所在地,在北京市有近50家大型互联网公司,稳居全国榜一,北京互联网公司占据了全国半边江山,也可以看出北京的综合实力。

    统计全国各大数据职位薪资分布情况

    # 1.分析不同城市对于大数据岗位的需求,即在该城市是否容易找到大数据的岗位,求出不同城市“bigdata”的数量(需求量)
    import pandas as pd
    from pyecharts import Bar,WordCloud
    data = pd.read_csv('../File/智联招聘_数据分析师.csv',engine='python').dropna().drop_duplicates('ID',inplace=False)
    city_bigdata = data[['职位','城市']].groupby('城市',as_index=False).count().sort_index(by='职位',ascending=False)[:30]
    city_word = data[['职位','城市']].groupby('城市',as_index=False).count().sort_index(by='职位',ascending=False)
    # city_bigdata.to_csv('text3.csv')
    bar = Bar(width=2000,height=1000)
    bar.add("大数据岗位前20的城市",city_bigdata["城市"],city_bigdata["职位"],
            is_label_show=True,
            xaxis_label_textsize=15,
            yaxis_label_textsize=20,
            xaxis_rotate=50,
            legend_text_size=20)
    bar.render('3.1各城市岗位需求柱状图.html')
    
    word = WordCloud(width=2000,height=1000)
    word.add("前10岗位",city_word["城市"],city_word["职位"])
    word.render('3.1前10岗位词云图.html')
    # print(list(city_bigdata['城市']))
    

    分析:
    在数量前15的城市中,北京稳居榜首,数据展示了城市与大数据岗位分布情况,给应聘者提供方向。
    北京,互联网公司总部所在地,在北京市有近50家大型互联网公司,稳居全国榜一,北京互联网公司占据了全国半边江山,也可以看出北京的综合实力。

    统计全国各大数据职位薪资分布情况

    注意:数据清洗涉及到了一个中文薪资问题,
    格式如下:
    5千-8千 ,7千-1.4万,面议,1万-2万,1.2万-2.4万 …等
    我们需要分析的是全国各省的薪资分布情况(细品)
    1.数据清洗,将薪资转成float
    2.将面议等清洗掉或者缺失值填充
    3.求出各省的The average salary

    # 不同城市的大数据岗位薪资的分布
    import pandas as pd
    import numpy as np
    from pyecharts import Bar, WordCloud, Line
    
    pd.set_option('display.max_columns', None)
    # 显示所有行
    pd.set_option('display.max_rows', None)
    # 设置value的显示长度为100,默认为50
    pd.set_option('max_colwidth', 100)
    
    data = pd.read_csv('../File/智联招聘_Java开发.csv', engine='python').dropna().drop_duplicates('ID', 'first', inplace=False)
    city_bigdata = data[['职位', '城市', '薪资']]
    print(city_bigdata)
    def price_str(x):
        # index key_0 薪资_x 薪资_y  x  y 字段名,x带表当前行,可以通过下标进行索引
        if (x['x'] > 0):
            x['薪资_x'] = float(x['薪资_x'][:x['x']]) * 10000
        if (x['x'] < 0):
            x['薪资_x'] = float(x['薪资_x'][:x['x']]) * 1000
    
        if (x['y'] > 0):
            x['薪资_y'] = float(x['薪资_y'][:x['y']]) * 10000
        if (x['y'] < 0):
            x['薪资_y'] = float(x['薪资_y'][:x['y']]) * 1000
        return x
    
    first_qian = pd.DataFrame(city_bigdata['薪资'].str.split('-').str[0])
    last_qian = pd.DataFrame(city_bigdata['薪资'].str.split('-').str[1])
    # 很多“面议”岗位,前面split之后分成了“面议”和“NaN”,不容易发现,使用numpy.nan获取NaN将他替换
    first_qian = pd.DataFrame(first_qian['薪资'].replace('面议', '1千'))
    last_qian = pd.DataFrame(last_qian['薪资'].replace(np.nan, '1千'))
    
    a = pd.merge(first_qian, last_qian, on=first_qian.index)
    # a.字段名,类型,寻找 “万”
    a['x'] = a.薪资_x.str.find('万')
    a['y'] = a.薪资_y.str.find('万')
    city_price = a.apply(price_str, axis=1)
    # 删除 x  y  key_0 字段,按照列
    city_price = city_price.drop(['x', 'y', 'key_0'], axis=1)
    
    # sum  = city_price.eval('薪资_x+薪资_y',inplace=True)
    # 两列求出平均值
    city_price['薪资'] = city_price.mean(axis=1)
    print(city_price)
    city = data[['职位', '城市']]
    city = city.reset_index(drop=True)
    city_price_avg = pd.merge(city, city_price, on=city.index).drop(['key_0'], axis=1)
    city_price_avg_word = city_price_avg.groupby('城市', as_index=False).mean().sort_index(by='薪资', ascending=False)
    city_price_avg_line_bar = city_price_avg.groupby('城市', as_index=False).mean().sort_index(by='薪资', ascending=False)[:10]
    city_price_avg_line_bar.to_csv("text4.csv")
    
    

    可视化

    作者为什么做两个图?
    作者的回应是:‘多做又不要你的钱,还能更充分的表达数据的意思’

    word = WordCloud(width=1500, height=700)
    word.add("", city_price_avg_word['城市'], city_price_avg_word['薪资'], word_size_range=[30, 100], )
    word.show_config()
    word.render("3.2城市薪资词云图.html")
    
    line = Line(width=2000, height=1000)
    line.add("城市", city_price_avg_line_bar['城市'], city_price_avg_line_bar['薪资'],
             is_label_show=True,
             xaxis_rotate=20,
             xaxis_label_textsize=20,
             legend_text_size=30,
             yaxis_label_textsize=20,
             is_smooth=True,
             mark_point=['average'])
    line.render("3.2各城市平均薪资分布曲线.html")
    
    bar = Bar(width=2000, height=1000)
    bar.add('城市', city_price_avg_line_bar['城市'], city_price_avg_line_bar['薪资'],
            xaxis_rotate=80,
            is_label_show=True,
            xaxis_label_textsize=15,
            label_text_size=10,
            legend_text_size=25)
    bar.show_config()
    bar.render("3.2各城市大数据平均薪资柱状图.html")
    

    在这里插入图片描述
    在这里插入图片描述

    分析“大数据分析师和算法工程师”不同学历数量与平均薪资分布曲线情况

    # 不同学历的平均薪资#
    import pandas as pd
    import numpy as np
    from pyecharts import Bar, Pie, WordCloud, Line,Overlap
    
    pd.set_option('display.max_columns', None)
    # 显示所有行
    pd.set_option('display.max_rows', None)
    # 设置value的显示长度为100,默认为50
    pd.set_option('max_colwidth', 100)
    # 算法工程师
    data = pd.read_csv('../File/智联招聘_数据分析师.csv', engine='python').dropna().drop_duplicates('ID', inplace=False)
    education_text = data[['学历', '薪资']]
    
    education_text['起薪'] = education_text['薪资'].str.split('-').str[0].replace('面议', '1千')
    education_text['尾薪'] = education_text['薪资'].str.split('-').str[1].replace(np.nan, '1千')
    education_text = education_text.drop(['薪资'], axis=1)
    def price_str(x):
        if x['x'] > 0:
            x['x'] = float(x['起薪'][:x['x']]) * 10000
        if x['x'] < 0:
            x['x'] = float(x['起薪'][:x['x']]) * 1000
    
        if x['y'] > 0:
            x['y'] = float(x['尾薪'][:x['y']]) * 10000
        if x['y'] < 0:
            x['y'] = float(x['尾薪'][:x['y']]) * 1000
        return x
    
    
    education_text['x'] = education_text.起薪.str.find('万')
    education_text['y'] = education_text.尾薪.str.find('万')
    education_text = education_text.apply(price_str, axis=1)
    education_text = education_text.drop(['起薪', '尾薪'], axis=1)
    education_text['avg_price'] = education_text[['x', 'y']].mean(axis=1)
    education_text = education_text.drop(['x', 'y'], axis=1)
    education_price = education_text[['学历', 'avg_price']].groupby('学历', as_index=False).mean().sort_index(by='学历',ascending=False)
    xueli = education_text[['学历', 'avg_price']].groupby('学历', as_index=False).count().sort_index(by='学历',ascending=False)
    # education_price.to_csv("text55.csv")
    

    在这里插入图片描述

    统计职位不同经验薪资分布情况

    import pandas as pd
    import numpy as np
    from pyecharts import Bar, Pie, WordCloud, Line,Overlap
    
    pd.set_option('display.max_columns', None)
    # 显示所有行
    pd.set_option('display.max_rows', None)
    # 设置value的显示长度为100,默认为50
    pd.set_option('max_colwidth', 100)
    
    data = pd.read_csv('../File/智联招聘_数据分析师.csv', engine='python').dropna().drop_duplicates('ID', inplace=False)
    education_text = data[['职位','工作经验', '薪资']]
    
    education_text['起薪'] = education_text['薪资'].str.split('-').str[0].replace('面议', '1千')
    education_text['尾薪'] = education_text['薪资'].str.split('-').str[1].replace(np.nan, '1千')
    education_text = education_text.drop(['薪资'], axis=1)
    
    
    def price_str(x):
        if x['x'] > 0:
            x['x'] = float(x['起薪'][:x['x']]) * 10000
        if x['x'] < 0:
            x['x'] = float(x['起薪'][:x['x']]) * 1000
    
        if x['y'] > 0:
            x['y'] = float(x['尾薪'][:x['y']]) * 10000
        if x['y'] < 0:
            x['y'] = float(x['尾薪'][:x['y']]) * 1000
        return x
    
    
    education_text['x'] = education_text.起薪.str.find('万')
    education_text['y'] = education_text.尾薪.str.find('万')
    education_text = education_text.apply(price_str, axis=1)
    education_text = education_text.drop(['起薪', '尾薪'], axis=1)
    education_text['avg_price'] = education_text[['x', 'y']].mean(axis=1)
    education_text = education_text.drop(['x', 'y'], axis=1)
    education_price = education_text[['工作经验', 'avg_price']].groupby('工作经验', as_index=False).mean()
    undergo = education_text[['职位','工作经验']].groupby('工作经验',as_index=False).count()
    
    # 可视化  折线图   柱状图
    # education_price.to_csv('text6.csv')
    line = Line(height=850, width=1800)
    line.add("工作经验的平均薪资", education_price['工作经验'], education_price['avg_price'],line_color='black')
    
    bar = Bar(height=850, width=1800)
    bar.add("工作经验的平均薪资", undergo['工作经验'], undergo['职位'],is_label_show=True)
    
    over = Overlap()
    over.add(line)
    over.add(bar,yaxis_index=1,is_add_yaxis=True)
    over.render("3.4不同工作经验的数量于平均薪资子图.html")
    print(undergo)
    print(education_price)
    

    在这里插入图片描述

    大数据职位描述要求分析

    使用结巴分词模块将bigdata文件中的“岗位描述.csv”进行分词,清洗出“岗位描述”中涉及到的关键技术名称,并将技术名称进行词频统计

    使用结巴分词技术,结果保存为csv

    #使用分词技术对 “职位描述” 进行分词,提取关键  技术名词 #
    import pandas as pd
    import jieba
    data = pd.read_csv('../File/大数据全国职位_描述.csv',engine='python')
    #DataFrom转array
    data = data[['职位描述']].values
    #结巴分词
    text = []
    for i in data:
        text.append(i[0])
    jieba_text = jieba.cut(str(text),cut_all=True)
    a = list(jieba_text)
    
    #过滤中文,保留技术名词
    declare = []
    for i in a:
        if  (i.islower()==True) | (i.istitle()==True):
            declare.append(i)
    #文件操作
    text = pd.DataFrame(declare,columns=['name'])
    text =text.to_csv("技术名词.csv")
    
    

    读取分词好的csv文件

    import jieba
    import pandas as pd
    from pyecharts import WordCloud, Bar
    
    data = pd.read_csv('技术名词.csv', engine='python')
    data = data[['index', 'name']].groupby('name', as_index=False).count().sort_index(by='index', ascending=False)
    data['name'] = [i.lower() for i in data['name']]
    data_bar = data[['name', 'index']].groupby(['name'], as_index=False).sum().sort_index(by='index', ascending=False)[:20]
    data_word = data[['name', 'index']].groupby(['name'], as_index=False).sum().sort_index(by='index', ascending=False)
    print(data)
    # 可视化展示  词云图和柱状图
    work = WordCloud(height=850, width=1800)
    work.add("大数据岗位技术名词统计", data_word['name'], data_word['index'], word_size_range=[20, 100])
    work.render('4.1大数据岗位技术名词统计词云图.html')
    
    bar = Bar(width=2000, height=1000)
    bar.add('大数据岗位技术名词统计', data_bar['name'], data_bar['index'], xaxis_rotate=30, is_label_show=True,
            xaxis_label_textsize=15,yaxis_label_textsize=15, label_text_size=15, legend_text_size=25)
    bar.render("4.1大数据岗位技术名词统计柱状图.html")
    
    data_bar.to_csv('text7.csv')
    

    在这里插入图片描述在这里插入图片描述

    结论:
    结合上述数据显示,大数据分析师岗位资历越长,薪资越高。
    综合上述数据可得,大数据分析师岗位入职基本信息。
    普遍学历门槛为大专和本科,工作经验1-5年发展空间较大,5-10年为瓶颈期。
    工作城市北京,广东,深圳,武汉,合肥,天津,重庆,郑州,沈阳,西安,成都,厦门,上海,南京,济南等一二线大型城市。
    公司类型民营,股份制企业较多。
    公司规模为小型,中大型互联网公司。
    发展倾向:
    专科,本科工作经验有3-5年,平均薪资12k以上
    专科,本科工作经验有1-3年,平均薪资7k- 10k上下
    专科,本科工作经验1年以下平均薪资在6K以下。
    工作城市的选择也很重要,结合报表5 城市岗位数量及平均薪资报表,可得,杭州,广东,深圳属于高薪多岗位城市,北京,厦门,上海,济南是最理想的就业城市之一。
    大数据分析师各大企业招聘所需要的技术为spark,hadoop,Java,hive,python ,linux,storm,kafka,bhase,shell等技术。

    喜欢的话点赞转载加收藏

    展开全文
  • Pandas是基于Numpy的专业数据分析工具,可以灵活高效的处理各种数据集,也是我们后期分析案例的神器。它提供了两种类型的数据结构,分别是DataFrame和Series,我们可以简单粗暴的把DataFrame理解为Excel里面的一张表...
  • Python爬取所有股票数据并进行数据分析

    万次阅读 多人点赞 2019-04-13 14:47:41
    一、背景:作为一个程序员,总喜欢在股市里面晃荡,无奈总是当成韭菜收割了。每一次都是卖涨买跌,处处碰壁。...于是,开始编写了爬取股票数据并进行数据分析的程序。 二、环境:Anaconda3.3 python3.7.1 ...

    一、背景:作为一个程序员,总喜欢在股市里面晃荡,无奈总是当成韭菜收割了。每一次都是卖涨买跌,处处碰壁。但是作为一个有一定阅历的程序员本能告诉自己,只要掌握了大量的股票数据,就可以在信息渠道落后的情况下,分析出机构大概率的在布局哪些股票,从而在机构拉涨停之前,提前进入分一杯羹。于是,开始编写了爬取股票数据并进行数据分析的程序。

    二、环境:Anaconda3.3     python3.7.1   

    三、目标:爬取所有股票每天每一分钟的数据,并且进行数据分析

    四、最终效果图:

                                                                                 爬虫结果图

                                                                               数据展示图

     

     

     

    五、程序代码解析(源代码下载地址及数据库文章底部会提供):

    1、把所有股票的基本信息都保存在一个mysql数据库中gp.sql,总过三千六百多条,如下图:

    2、获取股票当天所有的数据get_gp_detail.py:

    import pymysql
    import numpy as np
    import sys
    import json
    import urllib.request
    import urllib
    import os
    import time
    #连接数据库
    db = pymysql.connect(host='127.0.0.1',user='root',password='root',db='gp_db',port=3306)
    #获取cursor
    cursor = db.cursor()# 使用 execute() 方法执行 SQL,如果表存在则删除  
    sql = "select * from gp"  
    cursor.execute(sql)  
    print("SELECT OK")
    #all_gp = cursor.fetchmany(1)
    all_gp = cursor.fetchall()     #从数据库中获取所有股票的基本信息数据
    arr = np.array(all_gp)      #转化为numpy数据格式
    
    now = int(time.time()) 
    #转换为其他日期格式,如:"%Y-%m-%d %H:%M:%S" 
    timeStruct = time.localtime(now) 
    strTime = time.strftime("%Y-%m-%d", timeStruct) 
    gp_count = 1        #股票当天所有数据的保存编号
    def mkdir(path):    #股票保存路径函数	
        folder = os.path.exists(path) 	
        if not folder:                   #判断是否存在文件夹如果不存在则创建为文件夹		
            os.makedirs(path)            #makedirs 创建文件时如果路径不存在会创建这个路径		
            print(path) 	
    def getData(url):   #函数——从接口中获取单只股票当天每分钟的数据
        content = ""
        try:        #网络会偶发出现奔溃情况,为了保证不中断和保证数据齐全,休息5秒重新执行
            response = urllib.request.urlopen(url)
            content = response.read().decode('utf-8')
        except:
            print("发生网络异常")
            time.sleep(5)
            return getData(url)
        if content != "":
            return content
        else:
            print("内容为空")
            return getData(url)
    def csv_create(path, msg):     #函数——将单只股票的数据保存进指定文件夹  
        file = open(path,'w')             
        file.write(msg) 
        print("文件"+path+"创建成功")
        file.close() 
    def tranformToCSV(content,filepath):        #函数——将下载的数据转换为csv数据,以便读取
        content = content.replace("(","").replace(")","")
        json_str = json.loads(content)
        a_str = json_str.get("data")
        a_time = json_str.get("info").get("time")
        a_date = str(a_time).split(" ")
        mkdir(filepath)
        array_str = np.array(a_str)
        csv_str = "time,first,second,third,fourth\n"    #time为当天时间点,first为该分钟股票价格
        for item in array_str:
            item = str(item)
            items = item.split(",")
            itemss = (str(items[0])).split(" ")
            items0 = itemss[1]
            csv_str += '"'+items0+'",'+items[1]+','+items[2]+','+items[3]+','+items[4]+'\n'
        csv_create(filepath+"/"+a_date[0]+".csv",csv_str)
    
    for item in arr:
        url = "http://pdfm.eastmoney.com/EM_UBG_PDTI_Fast/api/js?rtntype=5&id="+item[3]+item[1]+"&type=r&iscr=false"
        data = getData(url)
        item2 = item[2].replace("*","")
        tranformToCSV(data,"D://gp/"+str(gp_count)+"、"+item2+item[3])     #股票信息的保存路径是(D://pg/序号+股票名字+股票代号/日期.csv)
        gp_count = gp_count+1;
        # 使用 DebugLog
        
    db.commit()
    db.close()

    get_gp_detail.py程序正确运行之后,D盘中将会出现我们所需要的数据,如下图:

     

     

    3、对数据进行简单呈现plt_show.py:

     

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    o=open('D:/gp/1045、广州港601228/2019-04-01.csv')
    table = pd.read_csv(o)
    plt.plot(table['time'], table['first'])
    plt.rcParams['figure.figsize'] = (30.0, 20.0)
    
    plt.show()
    pd.to_numeric(table["first"],errors="ignore")
    #print(table["first"])
    max = np.argmax(table["first"],axis=1)
    min = np.argmin(table["first"],axis=0)
    wave_price = table["first"][max]-table["first"][min]
    wave_price_rate = wave_price/table["first"][0]
    final_wave_price = table["first"][240]-table["first"][0]
    final_wave_price_rate = final_wave_price/table['first'][0]
    print("最大值"+str(table["first"][max]))
    print("最小值"+str(table["first"][min]))
    print("波动区间"+str(wave_price))
    print("波动幅度%.2f%%"% (wave_price_rate * 100))
    print("最终价格差距"+str(final_wave_price))
    print('最终价格幅度%.2f%%' % (final_wave_price_rate * 100))

    效果图:

    4、对所有股票数据进行简单的筛选和分析,筛选出2019-04-12,当天下午两点到三点之间,突然拉伸超过3%的所有股票并且保存进数据库find_feature.py:

     

    import pymysql
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    #连接数据库
    db = pymysql.connect(host='127.0.0.1',user='root',password='root',db='gp_db',port=3306)
    #获取cursor
    cursor = db.cursor()
    time = "2019-04-12"
    def find_feature(path,name,gpid):
        o=open(path)
        table = pd.read_csv(o)
        table['time'] = pd.to_datetime(table["time"])
        table = table.set_index('time',drop=False)     #排序之后,日期会是当前日期加上时间
        table = table["2019-04-12 14:00:00":"2019-04-12 15:00:00"]
        #print(table)
        if(table['first'].empty):
            return
        try:
            #print(table['first'])
            max = np.argmax(table["first"])
            min = np.argmin(table["first"])
            
            wave_price = table["first"][max]-table["first"][min]
            final_wave_price = table["first"][60]-table["first"][0]
            wave_price_rate = 0
            final_wave_price_rate = 0
            if table["first"][0] != 0:
                wave_price_rate = wave_price/table["first"][0]
                final_wave_price_rate = final_wave_price/table['first'][0]
            if  final_wave_price_rate > 0.03:
                print(name+gpid)
                print("波动幅度%.2f%%"% (wave_price_rate * 100))
                print('最终价格幅度%.2f%%' % (final_wave_price_rate * 100))
                cursor.execute('insert into special_gp(gpfeature,gpname,gpid,gptime) values(%s,%s,%s,%s)',(1,str(gp_count)+"、"+name,gpid,time))
        except:
            pass
    
    sql = "select * from gp"  
    cursor.execute(sql)  
    print("SELECT OK")
    #all_gp = cursor.fetchmany(1)
    all_gp = cursor.fetchall()
    arr = np.array(all_gp)
    gp_count = 1
    
    for item in arr:
        item2 = item[2].replace("*","")
        path = "D://gp/"+str(gp_count)+"、"+item2+item[3]+"/"+time+".csv"
        find_feature(path,item2,item[3])
        gp_count = gp_count+1;
    db.commit()
    db.close()
    

    效果图:

    以上即为股票当天数据爬取及数据分析,注意:每天股票的详细数据必须在第二天开市之前进行抓取,否则便再也抓取不到。

    csdn下载地址:https://download.csdn.net/download/mldan/11111439

    demo大师下载地址:http://www.demodashi.com/demo/15238.html

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 数据分析:Python分析学生数据

    千次阅读 2017-11-11 18:39:42
    本文为优达学城数据分析入门课程的mini项目,所用数据集为优达学城某段时间内的学生数据。数据简介全部数据包含三个文件,其内容分别为: enrollments.csv: daily-engagement.csv project-submissions.csv 各字段的...

    本文为优达学城数据分析入门课程的mini项目,所用数据集为优达学城某段时间内的学生数据。

    数据简介

    全部数据包含三个文件,其内容分别为:

    • enrollments.csv:
    • daily-engagement.csv
    • project-submissions.csv

    各字段的意义见table_desc.txt,文末附录会给出。

    载入数据

    import csv
    
    def readcsv_Dict(file):
        with open(file) as fd:
            reader=csv.DictReader(fd)        #以字典形式读取CSV,适用于带headline的数据
            return list(reader)
    enrollments=readcsv_Dict("./enrollments.csv")
    engagements=readcsv_Dict("./daily-engagement.csv")
    submissions=readcsv_Dict("./project-submissions.csv")
    print(len(enrollments),len(engagements),len(submissions))

    输出为:1640,136240,3642

    预览数据

    enrollments[0]

    engagements[0]

    submissions[0]

    数据处理

    格式修正

    从CSV中读出的数据是以字符串存储在内存中的,需要对原数据中的数值类型与时间类型进行还原。

    from datetime import datetime as dt
    def parase_data(data):
        if data=="":
            return None
        else:
            return dt.strptime(data, '%Y/%m/%d')
    
    def parase_maybe_int(i):
        if i=="":
            return None
        else:
            return int(i)
    #字符串转换
    for line in enrollments:
        line['join_date']=parase_data(line['join_date'])
        line['cancel_date']=parase_data(line['cancel_date'])
        line['days_to_cancel']=parase_maybe_int(line['days_to_cancel'])
        line['is_udacity']=(line['is_udacity']=='TRUE')
        line['is_canceled']=(line['is_canceled']=='TRUE')
    
    for line in engagements:
        line['utc_date']=parase_data(line['utc_date'])
        line['num_courses_visited']=parase_maybe_int(float(line['num_courses_visited']))
        line['total_minutes_visited']=float(line['total_minutes_visited'])
        line['lessons_completed']=parase_maybe_int(float(line['lessons_completed']))
        line['projects_completed']=parase_maybe_int(float(line['projects_completed']))
    
    for line in submissions:
        line['creation_date']=parase_data(line['creation_date'])
        line['completion_date']=parase_data(line['completion_date'])
    
    # print(enrollments[0])
    # print(engagements[0])
    # print(submissions[0])

    字段修正

    注意到engagements中的学生账户字段标识与另两文件中的不一样,将其修改为与另两者一致的’account_key’。

    #修改不一致的键值(这里也可以直接对原文件进行修改)
    for line in engagements:
        line['account_key']=line['acct']
        del line['acct']
    
    print(engagements[0])

    计算学生数

    计算三个文件中分别有多少学生的数据。

    def get_unique_stu(stu_list):
        unique_stu=set()
        for stu in stu_list:
            unique_stu.add(stu['account_key'])
        return unique_stu
    unique_enroller=get_unique_stu(enrollments)
    unique_engager=get_unique_stu(engagements)
    unique_submitter=get_unique_stu(submissions)
    print(len(unique_enroller),len(unique_engager),len(unique_submitter))

    输出为:1302,1237,743

    处理异常值

    可以看到enrollments中的学生数要多于engagement中的学生数,这是不合理的,正常来说应该是engagement中的学生数大于等于enrollments的学生数,所以数据中一定存在异常值。

    找出在enrollments中存在却不在engagement中存在的学生,这里排除掉当天注册又注销的学生。

    def find_outlier():
        for enroll_stu in enrollments:
            stu=enroll_stu['account_key']
            if stu not in unique_engager and enroll_stu['join_date']!=enroll_stu['cancel_date']:
                print(enroll_stu)
    find_outlier()

    发现异常值有一个共同点:(‘is_udacity’, True),都为优达学城的测试账号。

    删除掉这些测试账号。

    test_acct=[]
    
    for stu in enrollments:
        if stu['is_udacity']:
            test_acct.append(stu['account_key'])
    test_acct=list(set(test_acct))
    
    def remove_test_acct(stu_list):
        tmp=[]
        for stu in stu_list:
            if stu['account_key'] not in test_acct:
                tmp.append(stu)
        return tmp
    
    enrollments=remove_test_acct(enrollments)
    engagements=remove_test_acct(engagements)
    submissions=remove_test_acct(submissions)
    print(len(test_acct))

    有6个测试账号。

    筛选数据

    由于整个数据集中包含了七天免费试用的学生,这一部分学生数据明显是没有意义的,需要筛选出付费学生的数据。

    paid_students_join_date={}
    for stu in enrollments:
        #未注销或者取消时间超过七天的学生
        if not stu['is_canceled'] or stu['days_to_cancel']>7:
            #当字典中不存在条目时创建,且只保留最新的join_date
            if stu['account_key'] not in paid_students_join_date or stu['join_date']>paid_students_join_date[stu['account_key']]:
                paid_students_join_date[stu['account_key']]=stu['join_date']
    paid_acct=list(set(paid_students_join_date.keys()))
    
    def remove_free_acct(stu_list):
        tmp=[]
        for stu in stu_list:
            if stu['account_key'] in paid_acct:
                tmp.append(stu)
        return tmp
    
    paid_enrollments=remove_free_acct(enrollments)
    paid_engagements=remove_free_acct(engagements)
    paid_submissions=remove_free_acct(submissions)
    
    print(len(paid_acct))

    共有995名付费学生。

    分析数据

    一周数据

    这里只分析一周内的数据。

    paid_engagement_1stweek=[]
    
    for stu in paid_engagements:
        days=(stu['utc_date']-paid_students_join_date[stu['account_key']]).days
        if (days>=0 and days<7):
            paid_engagement_1stweek.append(stu)
    
    print(len(paid_engagement_1stweek))

    一周内有6919条数据。

    学习时间

    from collections import defaultdict
    
    #整合同一学生账户的信息
    def group_data(data,key_name):
        grouped_data=defaultdict(list)      #value为列表的字典
        for data_point in data:
            grouped_data[data_point[key_name]].append(data_point)    #将同一账户的信息整合
        return grouped_data
    
    #在整合信息中计算某个字段的累加值
    def count_total(grouped_data,field_name):
        total_dic={}
        for acct in grouped_data:
            total=0
            for info in grouped_data[acct]:
                total+=info[field_name]
            total_dic[acct]=total
        return total_dic
    
    
    engager_acct_1stweek=group_data(paid_engagement_1stweek,'account_key')
    
    total_minutes_byacct=count_total(engager_acct_1stweek,'total_minutes_visited')
    total_minutes=list(total_minutes_byacct.values())
    import numpy as np
    print(np.mean(total_minutes),np.max(total_minutes),np.min(total_minutes),np.std(total_minutes))

    输出:306.708326753 3564.7332645 0.0 412.99693341

    完成课程数

    total_lessons_byacct=count_total(engager_acct_1stweek,'lessons_completed')
    total_lessons=list(total_lessons_byacct.values())
    print(np.mean(total_lessons),np.max(total_lessons),np.min(total_lessons),np.std(total_lessons))

    输出:1.63618090452 36 0 3.00256129983

    课程访问量

    total_courses_visited_byacct=count_total(engager_acct_1stweek,'num_courses_visited')
    total_courses_visited=list(total_courses_visited_byacct.values())
    print(np.mean(total_lessons),np.max(total_lessons),np.min(total_lessons),np.std(total_lessons))

    输出:1.63618090452 36 0 3.00256129983

    学习天数

    当’num_courses_visited’字段不为零时则学习天数加一天。

    total_studydays_byacct={}
    for acct in engager_acct_1stweek:
        total_studydays=0
        for info in engager_acct_1stweek[acct]:
            if info['num_courses_visited']==0:
                continue
            else:
                total_studydays+=1
        total_studydays_byacct[acct]=total_studydays
    
    total_studydays=list(total_studydays_byacct.values())
    print(np.mean(total_studydays),np.max(total_studydays),np.min(total_studydays),np.std(total_studydays))

    输出为:2.86733668342 7 0 2.25519800292

    通过情况

    以课程746169184与3176718735为例,计算通过这两门课程的学生数。

    passing_acct=set()
    project_key=['746169184','3176718735']
    pass_flag=['PASSED','DISTINCTION']
    for stu in paid_submissions:
        if (stu['lesson_key'] in project_key) and (stu['assigned_rating'] in pass_flag):
            passing_acct.add(stu['account_key'])
    
    print(len(passing_acct))

    付费学生共有995名,最近一周有647名学生通过了这两门课程。

    两群体数据对比

    对比通过课程的学生与未通过学生的一系列数据,来发现规律。

    #目前已有数据
    # total_courses_visited_byacct
    # total_lessons_byacct
    # total_minutes_byacct
    # total_studydays_byacct
    
    def compare_stu_data(data_to_compare):
        passing_stu_data={}
        non_passing_stu_data={}
        for stu_acct in data_to_compare:
            if stu_acct in passing_acct:
                passing_stu_data[stu_acct]=data_to_compare[stu_acct]
            else:
                non_passing_stu_data[stu_acct]=data_to_compare[stu_acct]
        return passing_stu_data,non_passing_stu_data

    课程浏览量

    passing_stu_courses_visited,non_passing_stu_courses_visited=compare_stu_data(total_courses_visited_byacct)
    passing_visited_data,non_passing_visited_data=list(passing_stu_courses_visited.values()),list(non_passing_stu_courses_visited.values())
    print(np.mean(passing_visited_data),np.max(passing_visited_data),np.min(passing_visited_data),np.std(passing_visited_data))
    print(np.mean(non_passing_visited_data),np.max(non_passing_visited_data),np.min(non_passing_visited_data),np.std(non_passing_visited_data))

    输出:
    4.72642967543 25 0 3.7002397793
    2.58908045977 18 0 2.90670969025

    差异显著。课程浏览量在一定程度上可以体现学生的学习兴趣,通过课程的学生的学习兴趣要比未通过的学生高。

    课程完成量

    passing_stu_lessons,non_passing_stu_lessons=compare_stu_data(total_lessons_byacct)
    passing_lessons_data,non_passing_lessons_data=list(passing_stu_lessons.values()),list(non_passing_stu_lessons.values())
    print(np.mean(passing_lessons_data),np.max(passing_lessons_data),np.min(passing_lessons_data),np.std(passing_lessons_data))
    print(np.mean(non_passing_lessons_data),np.max(non_passing_lessons_data),np.min(non_passing_lessons_data),np.std(non_passing_lessons_data))

    输出:
    2.05255023184 36 0 3.14222705558
    0.862068965517 27 0 2.54915994183

    差异显著。这个没什么好解释的。

    学习时间

    passing_stu_minutes,non_passing_stu_minutes=compare_stu_data(total_minutes_byacct)
    passing_minutes_data,non_passing_minutes_data=list(passing_stu_minutes.values()),list(non_passing_stu_minutes.values())
    print(np.mean(passing_minutes_data),np.max(passing_minutes_data),np.min(passing_minutes_data),np.std(passing_minutes_data))
    print(np.mean(non_passing_minutes_data),np.max(non_passing_minutes_data),np.min(non_passing_minutes_data),np.std(non_passing_minutes_data))

    输出:
    394.586046483 3564.7332645 0.0 448.49951933
    143.326474266 1768.5227493 0.0 269.538619008

    差异显著。同样无需解释。

    学习天数

    passing_stu_studydays,non_passing_stu_studydays=compare_stu_data(total_studydays_byacct)
    passing_studydays_data,non_passing_studydays_data=list(passing_stu_studydays.values()),list(non_passing_stu_studydays.values())
    print(np.mean(passing_studydays_data),np.max(passing_studydays_data),np.min(passing_studydays_data),np.std(passing_studydays_data))
    print(np.mean(non_passing_studydays_data),np.max(non_passing_studydays_data),np.min(non_passing_studydays_data),np.std(non_passing_studydays_data))

    输出:
    3.38485316847 7 0 2.25882147092
    1.90517241379 7 0 1.90573144136

    差异显著。

    可视化

    %matplotlib inline
    import matplotlib.pyplot as plt

    学习时间

    plt.xlabel("total_minutes")
    plt.ylabel("num of stu")
    plt.hist(passing_minutes_data,bins=30)
    plt.hist(non_passing_minutes_data,bins=30)

    学习天数

    通过的学生:

    plt.xlabel("study days")
    plt.ylabel("num of stu")
    plt.hist(passing_studydays_data,bins=7)

    未通过的学生:

    plt.xlabel("study days")
    plt.ylabel("num of stu")
    plt.hist(non_passing_studydays_data,bins=7)

    附录

    enrollments.csv:

    • account_key:学员帐号标识
    • status:收集数据时,学员课程状态的数据,可能的值为“已取消”(’canceled’)和“学习中”(’current’)。
    • join_date:学员加入课程的时间。
    • cancel_date:学员取消的时间,如果学员没有取消则显示空。
    • days_to_cancel:加入课程时间和取消时间之间间隔的天数,如果学员没有取消就显示空。
    • is_udacity:如果是优达学城官方的测试账号,就显示 True,如果不是,显示 False。
    • is_canceled:如果收集数据时,学员已经取消,就显示 True,如果还没有取消,显示 False。

    daily_engagement.csv:报名注册表中每一位学生,在数据分析纳米学位的日常参与学习数据。

    • acct:学员账号的唯一标识符,这是他们参与学习的数据。(导入数据后修改为account_key)
    • utc_date:收集数据的日期。
    • num_courses_visited:这一天里,学生访问数据分析纳米学位课程的数量(访问时间至少 2 分钟)。纳米学位课程和免费课程,如果内容相同,也需要分开考虑。
    • total_minutes_visited:在这一天,学生学习数据分析纳米学位课程的总时间(分钟)。
    • lessons_completed:在这一天,学生访问的数据分析纳米学位中的课程总数。
    • projects_completed:在这一天,学生完成的数据分析纳米学位中的项目总数。

    project_submissions.csv:关于在报名注册表中的每个学生提交数据分析纳米学位项目的数据。

    • creation_date:项目提交的日期。
    • completion_date:项目被评估的日期。
    • assigned_rating:这个字段有4个可能的值:
      blank - 项目没有被评估。
      INCOMPLETE - 项目不符合要求。
      PASSED - 项目符合要求。
      DISTINCTION – 项目超出要求。
      UNGRADED – 项目无法被评估。(例如:包括损坏的文件)
    • account_key:提交了该项目的学生账号的唯一标识符。
    • lesson_key:提交了项目的唯一标识符。(练习使用ID:746169184,3176718735)
    • processing_state:这个字段可能有2个可能的值:
      CREATED - 项目已提交但没有被评估。
      EVALUATED – 项目已经被评估。
    展开全文
  • 唯品会数据分析

    千次阅读 2019-11-18 10:02:11
    研究思路 确定好研究唯品会后,就开始要确定...在编好基本语言后,我们对微博可以爬取的数据维度进行讨论分析,最后重点开始分析需要的数据维度,最一开始的微博文本(用户发表的言论)是必须的,团队讨论一段时间...
  • Python大数据分析系列博客,包括网络爬虫、可视化分析、GIS地图显示、情感分析、舆情分析、主题挖掘、威胁情报溯源、知识图谱、预测预警及AI和NLP应用等。前文分享了疫情相关新闻数据爬取,并进行中文分词处理及文本...
  • 数据分析中的SQL整理

    万次阅读 多人点赞 2015-03-14 12:43:16
    对于数据分析师来说,做数据分析的前提是有数据,而提取数据就免不了和SQL打交道。SQL语言是数据分析师必须掌握的一项基本技能,它可以衡量一个数据分析师对数据查询和获取的能力,否则就只能等着别人把数据送到你...
  • Python数据分析入门

    万次阅读 2017-03-08 20:23:47
    最近接受Python数据分析的培训,准备接下来深入研究一下,正处在初涉阶段,先上一个小练习热热身。 开发工具:PyCharm 2016.2 完整练习的GitHub地址:https://github.com/xinluqishi/pythonTrainingPro项目分析...
  • 数据分析与数据处理 数据及含义 这里先上截图,具体的数据及数据含义点击下边链接,自行获取! https://download.csdn.net/download/weixin_44423698/11737958 方法 探索数据、清洗数据、清洗过后的选择需要的数据...
  • 泰坦尼克号Python数据分析

    千次阅读 2019-10-28 12:03:59
    Python数据分析及应用 泰坦尼克号数据集 链接:https://pan.baidu.com/s/10y2SRH7Ry_W3CZC3s8PHWw 提取码:s128 复制这段内容后打开百度网盘手机App,操作更方便哦 导入必要的库 import numpy as np import pandas ...
  • 数据分析技术方案

    千次阅读 2019-03-04 19:50:01
    转自 lWX471878的博客... 一.目标 现在已经进入大数据时代, 数据是无缝连接网络世界与物理世界的DNA。发现数据DNA、重组数据DNA是人类不断认识、探索、实践大数据的持续过程。大数据分析可以有效...
  • python爬取前程无忧和拉勾数据分析岗位并分析

    万次阅读 多人点赞 2018-03-05 23:14:40
    分析数据分析岗位的招聘情况,包括地区分布、薪资水平、职位要求等,了解最新数据分析岗位的情况。 环境:python 3.6 设计的工具:Tableau工具(主要是生成图方便,用matplotlib也可以达到同样的效果) 二、数据...
  • NBA运动员球员数据分析

    千次阅读 2019-12-02 17:11:04
    NBA运动员数据分析 背景信息 当前,篮球运动是最受欢迎的运动之一。在此万受瞩目的运动下,我打算针对篮球运动员个人的信息,技能水平等各项指标进行相关的分析与统计。例如,我们可能会关注如下的内容: 哪些球员...
  • 还在为数据繁杂而困扰吗? 还在为不知道怎么提炼有价值的数据而焦躁吗? 别担心,解决的办法来了!本文就为大家介绍两款数据分析的实用软件。当然介绍软件的同时,更有两款软件最全的视频教程合集送你!
  • 使用hive+hbase做数据分析

    千次阅读 2019-06-18 16:19:27
    博客只做数据分析的流程与方法介绍,代码还在完善中,所以不做提供 闲话不多说,直接展示效果图 1.数据清洗 拿到数据集后发现数据并不是很规整,需要做一些处理,比如说去除制表符,去空或者是换行符等等,这里的...
  • 本文讲述如何利用Python语言针对美丽的AngelaBaby的影视作品进行 爬虫与数据分析
  • 上海链家二手房交易数据分析

    千次阅读 2017-12-20 22:58:12
    【python】上海链家二手房交易数据分析 目的:练习pandas数据处理以及数据可视化 数据采集时间:2017/11/7 数据获取:八爪鱼数据采集工具 数据量:约3w条 字段:行政区、小区名称、房型、楼层、朝向、单价、总价、...
  • 迈出数据分析与机器学习的第一步

    千次阅读 2017-04-07 10:54:03
    数据分析机器学习-牛刀小试数据分析太火爆,怎奈机器学习太难懂!随着人工智能的浪潮卷卷袭来,机器学习已经越来越火爆啦。数据分析与机器学习岗位可谓供不应求,但是入门的门槛也是蛮高的,究竟了机器学习太难学...
  • Python数据分析:手把手教你用Pandas生成可视化图表

    万次阅读 多人点赞 2018-03-16 18:56:32
    作为数据分析工具的集大成者,pandas作者曾说,pandas中的可视化功能比plt更加简便和功能强大。实际上,如果是对图表细节有极高要求,那么建议大家使用matplotlib通过底层图表模块进行编码。当然,我们大部分人在...
  • 在对数据进行预处理时,有时会面临特征值是字符串类型的时候,这时候就需要对特征值进行编码处理,主要分为一下两类: 各个特征值之间没有任何关联,如['red', 'green', 'blue']。 各个特征值之间有关系,如['...
  • 在没有看<利用python进行数据分析>之前一直不太明白数据分析是什么事情, 就跟学了很久python以后, 还是要时常搜索下, python能用来干嘛. 学了这两个模块后, 总算对于数据分析有一个初步的概念, 进行了一次实践 ...
  • 文章目录《Spark高级数据分析》——基于ALS算法的音乐推荐0. 简介1. 数据准备2. 训练ALS模型3. 为用户推荐音乐家4. 利用网格搜索与AUC评分5. 完整代码 《Spark高级数据分析》——基于ALS算法的音乐推荐 0. 简介 ...
  • 数据分析三剑客之 Pandas 基础教程

    千次阅读 多人点赞 2020-03-19 12:45:35
    目录0.1 先导条件:1 创建对象:1.1 Series:1.1.1 通过列表创建Series:1.1.2 通过字典创建Series:1.1.3 为Series对象即索引添加...1.2.3 通过嵌套字典创建自定义行列索引的DataFrame:2 查看数据:2.1 查看数据...
  • "sumBoxInfo": "综合票房总收入"} # 用于数据分析的主要属性 html = requests.get(url, headers=headers).text # 获取页面信息,得到json对象 result = json.loads(html, encoding="utf-8") # 将json对象转为...
  • 需求:使用pandas对船舶数据分析中,爬取下来的一些字段是英文的,将某列Series的英文翻译成中文 解决方案:这里封装了一个对某列不同语言的Series进行翻译的类 思路:因为翻译接口有访问次数的限制,所以首先将...
  • ###整体的 思路 是采用 selenium 模拟浏览器的行为,具体的步骤如下: 初始化 爬取数据,这里分为两个部分:一是爬取网页数据,二是进行翻页操作 保存数据,将数据保存到文件... pass # 爬取网页数据 def parse_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 94,827
精华内容 37,930
关键字:

pass数据分析