大家好,我是不知所措撓頭娜。o(〃'▽'〃)o
今天開篇沒有廢話。如果你學(xué)了前面提到的python的幾個(gè)包,看了作業(yè)題目覺得很想自己動(dòng)手試試,可以私下找我把作業(yè)需要用到的數(shù)據(jù)資料分享給你~
接著分享娜娜醬的第四個(gè)python學(xué)習(xí)小作業(yè):某公司產(chǎn)品銷量分析
作業(yè)要求:
1、批量讀取數(shù)據(jù),并輸出以下信息:數(shù)據(jù)量、數(shù)據(jù)字段名、每個(gè)文件分別有多少缺失值
① 創(chuàng)建獨(dú)立函數(shù),從讀取數(shù)據(jù)到以上輸出要求
② 運(yùn)行代碼調(diào)用創(chuàng)建函數(shù),對數(shù)據(jù)進(jìn)行批量處理
2、創(chuàng)建函數(shù),批量讀取數(shù)據(jù),用均值填充缺失值數(shù)據(jù),并完成以下計(jì)算及圖表
(1)讀取數(shù)據(jù)并用均值填充缺失值;對“日期”字段進(jìn)行時(shí)間序列處理,輸出三個(gè)Dataframe文件data1,data2,data3
(2)分別計(jì)算data1,data2,data3中A,B產(chǎn)品的月總銷量,并繪制多系列柱狀圖,存儲在對應(yīng)的圖片文件夾路徑
(3)分別計(jì)算A、B產(chǎn)品在每個(gè)月中哪一天超過了月度80%的銷量,輸出日期
3、創(chuàng)建函數(shù),讀取數(shù)據(jù)并合并,對兩種產(chǎn)品銷量作線性回歸擬合,預(yù)測
(1)讀取數(shù)據(jù)刪除缺失值;對“日期”字段進(jìn)行時(shí)間序列處理,合并三個(gè)月數(shù)據(jù),輸出data;
(2)針對A產(chǎn)品銷量和B產(chǎn)品銷量數(shù)據(jù)做回歸分析,制作散點(diǎn)圖并存儲,并預(yù)測當(dāng)A銷量為1200時(shí),B產(chǎn)品銷量值
AB產(chǎn)品銷量數(shù)據(jù)大概長這樣
娜娜醬的代碼(在jupyter notebook做的):
第1題:加載模塊,創(chuàng)建函數(shù)讀取產(chǎn)品銷量數(shù)據(jù)
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、批量讀取數(shù)據(jù),并輸出以下信息
#(1)數(shù)據(jù)量
#(2)數(shù)據(jù)字段columns
#(3)輸出每個(gè)文件分別有多少缺失值
#創(chuàng)建函數(shù) :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('數(shù)據(jù)已加載')
# 這里用了os.walk(path) ,可以返回路徑中的信息及文件,結(jié)果為一個(gè)生成器
for j in range(len(filename_lst)):
data = pd.read_excel(filename_lst[j],header = 0,index_col=0)
datasize = len(data) #數(shù)據(jù)量
colname = data.columns.values.tolist() # 數(shù)據(jù)字段
nan_num = len(data[data.isnull().values == True]) # 缺失值數(shù)量
print('第%i個(gè)數(shù)據(jù)數(shù)據(jù)量為:%i' %(j+1,datasize))
print('第%i個(gè)數(shù)據(jù)字段為:%s' %(j+1,colname))
print('第%i個(gè)數(shù)據(jù)缺失值數(shù)量為:%i' %(j+1,nan_num))
print('----------')
#調(diào)用函數(shù)
f()
print('-----The end of Q1-----')
上段運(yùn)行后,可以得到:

第2題:(1)批量讀取數(shù)據(jù),用均值填充缺失值數(shù)據(jù)對“日期”字段進(jìn)行時(shí)間序列處理,轉(zhuǎn)換成period
#創(chuàng)建函數(shù):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)
#日期轉(zhuǎn)換成時(shí)間序列
dataindex = data.index
dataindex.to_period()
#將data加入dataset
dataset.append(data)
return(dataset)
#調(diào)用函數(shù)
data1 = Q2_read_and_fillna()[0]
data2 = Q2_read_and_fillna()[1]
data3 = Q2_read_and_fillna()[2]
print('數(shù)據(jù)已加載已處理!')
print('-----The end of Q2(1)-----')
此時(shí)data1~data3就已經(jīng)處理好了:

第2題:(2)分別計(jì)算data1~data3中A、B產(chǎn)品的月總銷量,繪制多系列柱狀圖并存儲
#創(chuàng)建函數(shù): 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])
#創(chuàng)建銷量dataframe
saledf = pd.DataFrame({'產(chǎn)品A月銷量':sales_A,'產(chǎn)品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月產(chǎn)品A、B總銷量柱狀圖')
plt.savefig(r'C:\Users\my\Desktop\python_project5_圖片保存\銷量圖.png')
#調(diào)用函數(shù)
Q2_monthly_sales(data1,data2,data3)
print('銷量柱狀圖已繪制已保存!')
print('-----The end of Q2(2)-----')
運(yùn)行上段代碼可得到每月產(chǎn)品總銷量:

第2題:(3)分別計(jì)算A、B產(chǎn)品在每個(gè)月中哪一天超過了月度80%的銷量,輸出日期
#創(chuàng)建函數(shù):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)
#調(diào)用函數(shù)
print('A、B產(chǎn)品各月超過80%的銷量日期分別為:\n')
print(Q2_date_when_sales_over80(data1,data2,data3))
print('-----The end of Q2(3)-----')
可知A產(chǎn)品各月銷量超過80%總銷量的日期為:
2018年01月26日、2018年02月23日、2018年03月25日
B產(chǎn)品各月銷量超過80%總銷量的日期為:
2018年01月26日、2018年02月24日、2018年03月26日
上面兩個(gè)日期非常相近,可以猜測A、B產(chǎn)品可能存在某種關(guān)聯(lián),下面第3題可以證實(shí)我們的猜測。
第3題:(1)讀取一季度三個(gè)月的數(shù)據(jù)并合并,做散點(diǎn)圖觀察A,B產(chǎn)品銷量情況,并做回歸
#創(chuàng)建函數(shù):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)
#日期轉(zhuǎn)換成時(shí)間序列
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)
#調(diào)用函數(shù)
data_combine = Q3_read_and_combine()
print(data_combine)
print('數(shù)據(jù)已加載已處理已合并!')
print('-----The end of Q3(1)-----')
這樣一季度的銷量就已經(jīng)處理好了:

第3題:(2)針對A產(chǎn)品銷量和B產(chǎn)品銷量數(shù)據(jù)做回歸分析,制作散點(diǎn)圖并存儲,預(yù)測當(dāng)A銷量為1200時(shí),B產(chǎn)品銷量值
#創(chuàng)建函數(shù):Q3_regression_analysis(df)
def Q3_regression_analysis(df):
#樣本數(shù)據(jù)
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])
#繪制散點(diǎn)圖、線性回歸擬合直線
plt.scatter(xtrain,ytrain,marker = '.',color = 'k')
plt.plot(xtest,ytest,color = 'r')
plt.grid()
plt.title('A-B產(chǎn)品銷量回歸擬合')
plt.savefig(r'C:\Users\my\Desktop\python_project5_圖片保存\線性回歸擬合.png')
return(model.predict(1200))
#調(diào)用函數(shù)
Q3_regression_analysis(data_combine)
print('當(dāng)A銷量為1200時(shí),B的銷量預(yù)測值為:%i'%Q3_regression_analysis(data_combine))
print('A-B產(chǎn)品銷量回歸擬合圖已繪制已保存!')
print('-----The end of Q3(2)-----')
果然A、B產(chǎn)品銷量存在某種關(guān)系~

可能有人會覺得,這些操作有什么難的,Excel也能做出來,還比敲代碼快。確實(shí)Excel是一個(gè)非常強(qiáng)大的工具,可以做很多比較復(fù)雜的分析。不過,正因?yàn)樗案叽笊稀绷?,點(diǎn)幾下鼠標(biāo)就可以分析,也就意味著它太不自由了。而且如果我們每個(gè)月都需要分析很多個(gè)產(chǎn)品的銷量,又或者數(shù)據(jù)量很大的時(shí)候,python的優(yōu)勢就突顯出來了:這套代碼只需要寫好一次,以后每次使用前修改幾個(gè)參數(shù),調(diào)整幾行代碼即可,極大地減少了重復(fù)動(dòng)作。大量的機(jī)械的重復(fù)交給代碼就好了,多余出的時(shí)間可以用來做更有意思的事情哪!

我是娜娜醬,請繼續(xù)期待后續(xù)數(shù)據(jù)分析打怪升級小作業(yè)~前面這幾個(gè)作業(yè)比較初級,從下個(gè)作業(yè)起畫風(fēng)要變得炫酷起來了!
這是零基礎(chǔ)入門數(shù)據(jù)分析系列的第五篇,其他內(nèi)容在這里:
第一篇:零基礎(chǔ)小白自學(xué)數(shù)據(jù)分析:從入門到摔門?
第二篇:零基礎(chǔ)小白自學(xué)數(shù)據(jù)分析:從入門到絆倒?
第三篇:零基礎(chǔ)小白自學(xué)數(shù)據(jù)分析:從入門到住院?
第四篇:零基礎(chǔ)小白自學(xué)數(shù)據(jù)分析:從入門到出家?
也許你還想看看:數(shù)據(jù)分析,從入門到放棄
(-'?_?'-)謝謝您閱讀,請勿轉(zhuǎn)載。
