美文网首页数据分析,从入门到放弃呆鸟的Python数据分析
数据分析 | 零基础入门数据分析(五):从入门到脱发?

数据分析 | 零基础入门数据分析(五):从入门到脱发?

作者: 娜某人 | 来源:发表于2018-06-28 17:28 被阅读27次

    大家好,我是不知所措挠头娜。o(〃'▽'〃)o
    今天开篇没有废话。如果你学了前面提到的python的几个包,看了作业题目觉得很想自己动手试试,可以私下找我把作业需要用到的数据资料分享给你~


    接着分享娜娜酱的第四个python学习小作业:某公司产品销量分析

    作业要求:
    1、批量读取数据,并输出以下信息:数据量、数据字段名、每个文件分别有多少缺失值
    ① 创建独立函数,从读取数据到以上输出要求
    ② 运行代码调用创建函数,对数据进行批量处理
    2、创建函数,批量读取数据,用均值填充缺失值数据,并完成以下计算及图表
    (1)读取数据并用均值填充缺失值;对“日期”字段进行时间序列处理,输出三个Dataframe文件data1,data2,data3
    (2)分别计算data1,data2,data3中A,B产品的月总销量,并绘制多系列柱状图,存储在对应的图片文件夹路径
    (3)分别计算A、B产品在每个月中哪一天超过了月度80%的销量,输出日期
    3、创建函数,读取数据并合并,对两种产品销量作线性回归拟合,预测
    (1)读取数据删除缺失值;对“日期”字段进行时间序列处理,合并三个月数据,输出data;
    (2)针对A产品销量和B产品销量数据做回归分析,制作散点图并存储,并预测当A销量为1200时,B产品销量值


    AB产品销量数据大概长这样

    娜娜酱的代码(在jupyter notebook做的):
    第1题:加载模块,创建函数读取产品销量数据

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    plt.rcParams['axes.unicode_minus']=False
    from sklearn.linear_model import LinearRegression
    import datetime
    import os
    % matplotlib inline
    
    #1、批量读取数据,并输出以下信息
    #(1)数据量
    #(2)数据字段columns
    #(3)输出每个文件分别有多少缺失值
    #创建函数 :f()
    def f():
        add = input('请指定工作目录路径:\n')
        while os.path.exists(add) == False:
            add = input('输入有误,路径不存在,请重新指定工作目录:\n')
        else:
            os.chdir(add)
        for i in os.walk(add):
            filename_lst = i[2]
        print('数据已加载')
    # 这里用了os.walk(path) ,可以返回路径中的信息及文件,结果为一个生成器
    
        for j in range(len(filename_lst)):
            data = pd.read_excel(filename_lst[j],header = 0,index_col=0)
            datasize = len(data) #数据量
            colname = data.columns.values.tolist() # 数据字段
            nan_num = len(data[data.isnull().values == True]) # 缺失值数量
            print('第%i个数据数据量为:%i' %(j+1,datasize))
            print('第%i个数据字段为:%s' %(j+1,colname))
            print('第%i个数据缺失值数量为:%i' %(j+1,nan_num))
            print('----------')
    
    #调用函数
    f()
    print('-----The end of Q1-----')
    

    上段运行后,可以得到:


    第2题:(1)批量读取数据,用均值填充缺失值数据对“日期”字段进行时间序列处理,转换成period
    #创建函数:Q2_read_and_fillna()
    def Q2_read_and_fillna():
        add = r'C:\Users\my\Desktop\python_project5'
        os.chdir(add)
        for i in os.walk(add):
            filename_lst = i[2]
        
        dataset = []
        for j in range(len(filename_lst)):
            data = pd.read_excel(filename_lst[j],header = 0,index_col=0)
            
            #用均值填充缺失值
            colname = data.columns.values.tolist()
            for col in colname:
                u = data[col].mean()
                data[col].fillna(u,inplace = True)
            
            #日期转换成时间序列   
            dataindex = data.index
            dataindex.to_period()
            
            #将data加入dataset  
            dataset.append(data)
        return(dataset)
    
    #调用函数
    data1 = Q2_read_and_fillna()[0]
    data2 = Q2_read_and_fillna()[1]
    data3 = Q2_read_and_fillna()[2]
    print('数据已加载已处理!')
    print('-----The end of Q2(1)-----')
    

    此时data1~data3就已经处理好了:


    第2题:(2)分别计算data1~data3中A、B产品的月总销量,绘制多系列柱状图并存储
    #创建函数: Q2_monthly_sales(*dfs)
    def Q2_monthly_sales(*dfs):
        sales_A = []
        sales_B = []
        for df in dfs:
            sales = df.sum()
            print(sales)
            sales_A.append(sales[0])
            sales_B.append(sales[1])
        
        #创建销量dataframe
        saledf = pd.DataFrame({'产品A月销量':sales_A,'产品B月销量':sales_B},
                             index = pd.period_range('201801','201803',freq = 'M'))
        #return(saledf)
        
        #绘图
        saledf.plot(kind = 'bar',grid = True,alpha = 0.5,rot = 0)
        plt.title('1-3月产品A、B总销量柱状图')
        plt.savefig(r'C:\Users\my\Desktop\python_project5_图片保存\销量图.png')
    
    #调用函数
    Q2_monthly_sales(data1,data2,data3)
    print('销量柱状图已绘制已保存!')
    print('-----The end of Q2(2)-----')
    

    运行上段代码可得到每月产品总销量:

    一季度产品A、B总销量柱状图
    第2题:(3)分别计算A、B产品在每个月中哪一天超过了月度80%的销量,输出日期
    #创建函数:Q2_date_when_sales_over80(*dfs)
    def  Q2_date_when_sales_over80(*dfs):
        date_A = []
        date_B = []
        for df in dfs:
            df['A_cum'] = df['productA'].cumsum()
            df['B_cum'] = df['productB'].cumsum()
            df_Aover80 = df[df['A_cum']>(0.8*df['productA'].sum())]
            df_Bover80 = df[df['B_cum']>(0.8*df['productB'].sum())]
            date_A.append(str(df_Aover80.iloc[0].name))
            date_B.append(str(df_Bover80.iloc[0].name))
        return(date_A,date_B)
    
    #调用函数
    print('A、B产品各月超过80%的销量日期分别为:\n')
    print(Q2_date_when_sales_over80(data1,data2,data3))
    print('-----The end of Q2(3)-----')
    

    可知A产品各月销量超过80%总销量的日期为:
    2018年01月26日、2018年02月23日、2018年03月25日
    B产品各月销量超过80%总销量的日期为:
    2018年01月26日、2018年02月24日、2018年03月26日
    上面两个日期非常相近,可以猜测A、B产品可能存在某种关联,下面第3题可以证实我们的猜测。

    第3题:(1)读取一季度三个月的数据并合并,做散点图观察A,B产品销量情况,并做回归

    #创建函数:Q3_read_and_combine()
    def Q3_read_and_combine():
        add = r'C:/Users/my/Desktop/python_project5'
        os.chdir(add)
        for i in os.walk(add):
            filename_lst = i[2]
            #print(filename_list)
        
        dataset = []
        for j in range(len(filename_lst)):
            data = pd.read_excel(filename_lst[j],header = 0,index_col=0)
            
            #日期转换成时间序列   
            dataindex = data.index
            dataindex.to_period()
            #删除缺失值
            data.dropna(inplace = True)
            #将data加入dataset  
            dataset.append(data)
                    
        #连接data
        data_re = pd.concat([dataset[0],dataset[1],dataset[2]])
        return(data_re)
    
    #调用函数
    data_combine = Q3_read_and_combine()
    print(data_combine)
    print('数据已加载已处理已合并!')
    print('-----The end of Q3(1)-----')
    

    这样一季度的销量就已经处理好了:


    第3题:(2)针对A产品销量和B产品销量数据做回归分析,制作散点图并存储,预测当A销量为1200时,B产品销量值
    #创建函数:Q3_regression_analysis(df)
    def Q3_regression_analysis(df):
        
        #样本数据
        xtrain = data_combine['productA']
        ytrain = data_combine['productB']
    
        #线性回归分析
        model = LinearRegression()
        model.fit(xtrain[:,np.newaxis],ytrain)
        xtest = np.linspace(0,1000,1000)
        ytest = model.predict(xtest[:,np.newaxis])
        
        #绘制散点图、线性回归拟合直线
        plt.scatter(xtrain,ytrain,marker = '.',color = 'k')
        plt.plot(xtest,ytest,color = 'r')
        plt.grid()
        plt.title('A-B产品销量回归拟合')
        plt.savefig(r'C:\Users\my\Desktop\python_project5_图片保存\线性回归拟合.png')
    
        return(model.predict(1200))
        
    #调用函数    
    Q3_regression_analysis(data_combine) 
    print('当A销量为1200时,B的销量预测值为:%i'%Q3_regression_analysis(data_combine))
    print('A-B产品销量回归拟合图已绘制已保存!')
    print('-----The end of Q3(2)-----')
    
    果然A、B产品销量存在某种关系~ 线性回归拟合

    可能有人会觉得,这些操作有什么难的,Excel也能做出来,还比敲代码快。确实Excel是一个非常强大的工具,可以做很多比较复杂的分析。不过,正因为它太“高大上”了,点几下鼠标就可以分析,也就意味着它太不自由了。而且如果我们每个月都需要分析很多个产品的销量,又或者数据量很大的时候,python的优势就突显出来了:这套代码只需要写好一次,以后每次使用前修改几个参数,调整几行代码即可,极大地减少了重复动作。大量的机械的重复交给代码就好了,多余出的时间可以用来做更有意思的事情哪!


    我是娜娜酱,请继续期待后续数据分析打怪升级小作业(作业题目来自数据分析师(python)微专业)~前面这几个作业比较初级,从下个作业起画风要变得炫酷起来了,嘿嘿嘿!

    这是零基础入门数据分析系列的第五篇,其他内容在这里:
    第一篇:零基础小白自学数据分析:从入门到摔门?
    第二篇:零基础小白自学数据分析:从入门到绊倒?
    第三篇:零基础小白自学数据分析:从入门到住院?
    第四篇:零基础小白自学数据分析:从入门到出家?

    (-'๏_๏'-)谢谢您阅读,请勿转载。

    相关文章

      网友评论

      本文标题:数据分析 | 零基础入门数据分析(五):从入门到脱发?

      本文链接:https://www.haomeiwen.com/subject/wkegyftx.html