大家好,我是不知所措挠头娜。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产品销量值
娜娜酱的代码(在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)-----')
运行上段代码可得到每月产品总销量:
第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的优势就突显出来了:这套代码只需要写好一次,以后每次使用前修改几个参数,调整几行代码即可,极大地减少了重复动作。大量的机械的重复交给代码就好了,多余出的时间可以用来做更有意思的事情哪!
我是娜娜酱,请继续期待后续数据分析打怪升级小作业~前面这几个作业比较初级,从下个作业起画风要变得炫酷起来了!
这是零基础入门数据分析系列的第五篇,其他内容在这里:
第一篇:零基础小白自学数据分析:从入门到摔门?
第二篇:零基础小白自学数据分析:从入门到绊倒?
第三篇:零基础小白自学数据分析:从入门到住院?
第四篇:零基础小白自学数据分析:从入门到出家?
也许你还想看看:数据分析,从入门到放弃
(-'๏_๏'-)谢谢您阅读,请勿转载。