2023美國大學生數(shù)學建模競賽思路分析
資料思路分享Q群:323126572
數(shù)據(jù)數(shù)據(jù)一用提供了3個csv文件:
附件1:123家有信貸記錄企業(yè)的相關(guān)數(shù)據(jù).xlsx
附件2:302家無信貸記錄企業(yè)的相關(guān)數(shù)據(jù).xlsx
附件3:銀行貸款年利率與客戶流失率關(guān)系的統(tǒng)計數(shù)據(jù).xlsx
觀察數(shù)據(jù)import pandas as pdimport numpy as np
df1_1 = pd.read_excel('../data/附件1:123家有信貸記錄企業(yè)的相關(guān)數(shù)據(jù).xlsx',sheet_name=0)df1_2 = pd.read_excel('../data/附件1:123家有信貸記錄企業(yè)的相關(guān)數(shù)據(jù).xlsx',sheet_name=1)df1_3 = pd.read_excel('../data/附件1:123家有信貸記錄企業(yè)的相關(guān)數(shù)據(jù).xlsx',sheet_name=2)
df2_1 = pd.read_excel('../data/附件2:302家無信貸記錄企業(yè)的相關(guān)數(shù)據(jù).xlsx',sheet_name=0)df2_2 = pd.read_excel('../data/附件2:302家無信貸記錄企業(yè)的相關(guān)數(shù)據(jù).xlsx',sheet_name=1)df2_3 = pd.read_excel('../data/附件2:302家無信貸記錄企業(yè)的相關(guān)數(shù)據(jù).xlsx',sheet_name=2)
df3 = pd.read_excel('../data/附件3:銀行貸款年利率與客戶流失率關(guān)系的統(tǒng)計數(shù)據(jù).xlsx',sheet_name=0)
display(df1_1.head())display(df1_2.head())display(df1_3.head())
display(df2_1.head())display(df2_2.head())display(df2_3.head())
建模每個企業(yè)生存年限'''每家公司的成立年限,第一張發(fā)票時間到最后一張發(fā)票時間的差值,以月為單位'''
支出表生存年限
live_time2 = df1_2[['企業(yè)代號','開票日期']]live_time2_min = live_time2.groupby('企業(yè)代號').min().reset_index()live_time2_max = live_time2.groupby('企業(yè)代號').max().reset_index()live_time2 = pd.merge(live_time2_max,live_time2_min,on='企業(yè)代號')live_time2['生存年限1'] = live_time2['開票日期x'] - live_time2['開票日期y']
收入表生存年限
live_time3 = df1_3[['企業(yè)代號','開票日期']]live_time3_min = live_time3.groupby('企業(yè)代號').min().reset_index()live_time3_max = live_time3.groupby('企業(yè)代號').max().reset_index()live_time3 = pd.merge(live_time3_max,live_time3_min,on='企業(yè)代號')live_time3['生存年限2'] = live_time3['開票日期x'] - live_time3['開票日期y']
找出生存年限最大的值作為生存年限
live_time = pd.merge(live_time2,live_time3,on='企業(yè)代號')[['企業(yè)代號','生存年限1','生存年限2']]x1 = list(live_time['生存年限1'])x2 = list(live_time['生存年限2'])x = []for i in range(len(x1)): ? if x1[i] >= x2[i]: ? ? ? x.append(x1[i]) ? else: ? ? ? x.append(x2[i])company_id = pd.DataFrame(live_time['企業(yè)代號'])x = pd.DataFrame(x,columns=['生存年限'])live_time = company_id.join(x)
生存年限轉(zhuǎn)為月份
live_time['生存年限'] = live_time['生存年限'].astype(str)live_time['生存年限'] = live_time['生存年限'].str.split().str.get(0)live_time['生存年限'] = live_time['生存年限'].map(lambda x: str(int(x) // 30) + '月')live_time.head()
客戶量計算收入的發(fā)票數(shù)有多少
ustomer = df1_3[['企業(yè)代號','購方單位代號','發(fā)票狀態(tài)']]customer = customer[customer['發(fā)票狀態(tài)'] == '有效發(fā)票']customer = customer.drop_duplicates(subset=['企業(yè)代號','購方單位代號'])customer = customer.groupby('企業(yè)代號')['購方單位代號'].count().reset_index()customer.rename(columns={'購方單位代號': '客戶數(shù)'},inplace=True)customer.head()
公司類別
查看公司名字中都有哪些詞
company = df1_1[['企業(yè)代號','企業(yè)名稱']]company_name = list(company['企業(yè)名稱'])company_name = ' '.join(company_name).replace('*','').\ ? ? ? ? ? ? ? ? ? replace('有限公司','').replace('責任公司','').\ ? ? ? ? ? ? ? ? ? replace('分公司','')
詞云
import jiebaimport wordcloudfrom scipy.misc import imreadw = wordcloud.WordCloud(background_color = 'white', ? ? ? ? ? ? ? ? ? ? ? width = 1000,height = 700, ? ? ? ? ? ? ? ? ? ? ? font_path = 'msyh.ttc', ? ? ? ? ? ? ? ? ? ? ? )w.generate(company_name)w.to_file('../output/公司名稱詞云.png')# 定義企業(yè)類型,銷項,中小微table = { ? '餐飲業(yè)':{'銷項價稅合計(年)':{'中':[2000,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[100,2000], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',100]}}, ? '倉儲業(yè)':{'銷項價稅合計(年)':{'中':[1000,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[100,1000], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',100]}}, ? '信息傳輸業(yè)':{'銷項價稅合計(年)':{'中':[1000,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[100,1000], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',100]}}, ? '軟件和信息技術(shù)服務業(yè)':{'銷項價稅合計(年)':{'中':[1000,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[50,1000], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',50]}}, ? '房地產(chǎn)開發(fā)經(jīng)營':{'銷項價稅合計(年)':{'中':[5000,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[2000,5000], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',2000]}}, ? '物業(yè)管理':{'銷項價稅合計(年)':{'中':[1000,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[500,1000], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',500]}}, ? '租賃和上午服務業(yè)':{'銷項價稅合計(年)':{'中':[8000,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[100,8000], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',100]}}, ? '農(nóng)林牧漁業(yè)':{'銷項價稅合計(年)':{'中':[500,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[50,500], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',50]}}, ? '工業(yè)':{'銷項價稅合計(年)':{'中':[2000,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[300,2000], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',300]}}, ? '建筑業(yè)':{'銷項價稅合計(年)':{'中':[5000,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[300,5000], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',300]}}, ? '批發(fā)業(yè)':{'銷項價稅合計(年)':{'中':[5000,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[1000,5000], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',1000]}}, ? '零售業(yè)':{'銷項價稅合計(年)':{'中':[500,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[100,500], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',100]}}, ? '交通運輸業(yè)':{'銷項價稅合計(年)':{'中':[3000,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[200,3000], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',200]}}, ? '郵政業(yè)':{'銷項價稅合計(年)':{'中':[2000,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[100,2000], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',100]}}, ? '住宿業(yè)':{'銷項價稅合計(年)':{'中':[2000,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[100,2000], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',100]}}, ? '其他':{'銷項價稅合計(年)':{'中':[2562,'正無窮'], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'小':[325,2562], ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'微':['負無窮',325]}},} ? ?if ('工程' in s): ? ? ? return '建筑業(yè)' ? if ('木' in s) or ('林' in s) or ('花' in s) or ('農(nóng)' in s): ? ? ? return '農(nóng)、林、牧、漁業(yè)' ? if ('礦' in s): ? ? ? return '采礦業(yè)' ? else: ? ? ? return '其他'company['企業(yè)類別'] = company['企業(yè)名稱'].map(kind)company
信譽等級時序圖ank = df1_3[df1_3['發(fā)票狀態(tài)'] == '有效發(fā)票']rank = rank[['企業(yè)代號','開票日期','價稅合計']]
開票日期轉(zhuǎn)換為年月
rank['year'] = rank['開票日期'].dt.yearrank['year'] = rank['year'].astype(str)rank['month'] = rank['開票日期'].dt.monthrank['month'] = rank['month'].astype(str)rank['開票日期'] = rank['year'] + '-' + rank['month']
rank = rank.groupby(['企業(yè)代號','開票日期'])['價稅合計'].sum().reset_index()rank = pd.merge(rank,df1_1,on='企業(yè)代號',how='left')rank.head()
rank_a = rank[rank['信譽評級'] == 'A']
import seaborn as snsimport matplotlib.pyplot as plt
設(shè)置這些配置,圖標才能正常顯示
#%matplotlib inline # 讓圖表直接在 jupyter notebook 中展現(xiàn)出來plt.rcParams['font.sans-serif'] = ['SimHei'] # 解決中文亂碼問題plt.rcParams['axes.unicode_minus'] = False # 解決負號無法正常顯示的問題%config InlineBackend.figure_format = 'svg' # 將圖標設(shè)置成矢量圖格式顯示,會更清晰plt.style.use('ggplot') # 設(shè)置繪圖樣式#display(plt.style.available) # 風格
fig = plt.figure(figsize=(5,4), dpi=100)sns_line_a=sns.lineplot(x="開票日期", y="價稅合計", ? ? ? ? ? ? ? ? hue="企業(yè)代號",data=rank_a, ? ? ? ? ? ? ? ? markers=True, dashes=False)sns_line_a
rank_b = rank[rank['信譽評級'] == 'B']fig = plt.figure(figsize=(5,4), dpi=100)sns_line_b=sns.lineplot(x="開票日期", y="價稅合計", ? ? ? ? ? ? ? ? hue="企業(yè)代號",data=rank_b, ? ? ? ? ? ? ? ? markers=True, dashes=False)sns_line_b
rank_c = rank[rank['信譽評級'] == 'C']fig = plt.figure(figsize=(5,4), dpi=100)sns_line_c=sns.lineplot(x="開票日期", y="價稅合計", ? ? ? ? ? ? ? ? hue="企業(yè)代號",data=rank_c, ? ? ? ? ? ? ? ? markers=True, dashes=False)sns_line_c
rank_d = rank[rank['信譽評級'] == 'D']fig = plt.figure(figsize=(5,4), dpi=100)sns_line_d=sns.lineplot(x="開票日期", y="價稅合計", ? ? ? ? ? ? ? ? hue="企業(yè)代號",data=rank_d, ? ? ? ? ? ? ? ? markers=True, dashes=False)sns_line_d
企業(yè)進項,作廢發(fā)票數(shù),有效發(fā)票數(shù)bill_outcome = df1_2[['企業(yè)代號','價稅合計','發(fā)票狀態(tài)']]
有效發(fā)票數(shù)
yes_bill_outcome = bill_outcome[bill_outcome['發(fā)票狀態(tài)'] == '有效發(fā)票']yes_bill_outcome = yes_bill_outcome.groupby('企業(yè)代號')['發(fā)票狀態(tài)'].count()yes_bill_outcome = yes_bill_outcome.reset_index()
作廢發(fā)票數(shù)
no_bill_outcome = bill_outcome[bill_outcome['發(fā)票狀態(tài)'] == '作廢發(fā)票']no_bill_outcome = no_bill_outcome.groupby('企業(yè)代號')['發(fā)票狀態(tài)'].count()no_bill_outcome = no_bill_outcome.reset_index()
進項有效,作廢發(fā)票數(shù)匯總
bill_outcome = pd.merge(yes_bill_outcome,no_bill_outcome,on='企業(yè)代號', ? ? ? ? ? ? ? ? ? ? ?how='left')bill_outcome.rename(columns={'發(fā)票狀態(tài)x' : '進項有效發(fā)票數(shù)', ? ? ? ? ? ? ? ? ? ? ? ? ? '發(fā)票狀態(tài)y' : '進項作廢發(fā)票數(shù)'}, ? ? ? ? ? ? ? ? ? ? ? ? ? inplace=True)bill_outcome.head()
企業(yè)銷項作廢發(fā)票數(shù),有效發(fā)票數(shù)bill_income = df1_3[['企業(yè)代號','價稅合計','發(fā)票狀態(tài)']]
有效發(fā)票數(shù)
yes_bill_income = bill_income[bill_income['發(fā)票狀態(tài)'] == '有效發(fā)票']yes_bill_income = yes_bill_income.groupby('企業(yè)代號')['發(fā)票狀態(tài)'].count()yes_bill_income = yes_bill_income.reset_index()
作廢發(fā)票數(shù)
no_bill_income = bill_income[bill_income['發(fā)票狀態(tài)'] == '作廢發(fā)票']no_bill_income = no_bill_income.groupby('企業(yè)代號')['發(fā)票狀態(tài)'].count()no_bill_income = no_bill_income.reset_index()
進項有效,作廢發(fā)票數(shù)匯總
bill_income = pd.merge(yes_bill_income,no_bill_income,on='企業(yè)代號', ? ? ? ? ? ? ? ? ? ? how='left')bill_income.rename(columns={'發(fā)票狀態(tài)x' : '銷項有效發(fā)票數(shù)', ? ? ? ? ? ? ? ? ? ? ? ? ? '發(fā)票狀態(tài)y' : '銷項作廢發(fā)票數(shù)'}, ? ? ? ? ? ? ? ? ? ? ? ? ? inplace=True)bill_income.head()
企業(yè)進項價,銷項稅合計
進項
outcome_sum = df1_2[['企業(yè)代號','價稅合計']]outcome_sum = outcome_sum.groupby('企業(yè)代號')['價稅合計'].sum().reset_index()
銷項
income_sum = df1_3[['企業(yè)代號','價稅合計']]income_sum = income_sum.groupby('企業(yè)代號')['價稅合計'].sum().reset_index()
進項,銷項匯總
outcome_income_sum = pd.merge(outcome_sum,income_sum,on='企業(yè)代號')outcome_income_sum.rename(columns={'價稅合計x' : '進項價稅合計', ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '價稅合計y' : '銷項價稅合計'},inplace=True)outcome_income_sum.head()
變量匯總'''字段為:企業(yè)代號,企業(yè)名稱,信譽評級,是否違約,進項合計,銷項合計,進項有效發(fā)票數(shù),進項作廢發(fā)票數(shù),銷項有效發(fā)票數(shù),進項作廢發(fā)票數(shù),成立時間,客戶量'''import mathdata = pd.merge(df1_1,live_time,on='企業(yè)代號')data = pd.merge(data,customer,on='企業(yè)代號')data = pd.merge(data,bill_outcome,on='企業(yè)代號')data = pd.merge(data,bill_income,on='企業(yè)代號')data = pd.merge(data,outcome_income_sum,on='企業(yè)代號')data['利潤'] = data['銷項價稅合計'] - data['進項價稅合計']data['生存年限'] = data['生存年限'].map(lambda x: int(x.replace('月','')))data['生存年限'] = data['生存年限'].map(lambda x: math.ceil(x / 12))data['收益率'] = (data['銷項價稅合計'] - data['進項價稅合計']) / data['進項價稅合計']data['收益率'] = data['收益率'] / data['生存年限']data.to_excel('../data/data.xlsx',encoding='utf8',index=False)
LCR 模型,KMeans 聚類LCR 建模data.head()
'''LCR 模型變量選取L 成立年限C 客戶數(shù)R 收益率'''LCR = data[['生存年限','客戶數(shù)','收益率']]#LCR['生存年限'] = LCR['生存年限'].map(lambda x: int(x.replace('月','')))LCR.head()
聚類模型對企業(yè)分類'''from sklearn.cluster import KMeanskms = KMeans(n_clusters=4)kms.fit(LCR)label = kms.labels_label = pd.DataFrame(list(label))
把企業(yè)類別匯總到 data.xlsx,并保存為 new_data.xlsx
data['種類'] = labeldata.to_excel('../data/data_Kmeans.xlsx')data.head()
聚類結(jié)果可視化
0 類型
kind_0 = data[data['種類'] == 0]#kind_0['生存年限'] = kind_0['生存年限'].map(lambda x: int(x.replace('月','')))kind_0 = kind_0[["生存年限","客戶數(shù)","收益率"]].mean()kind_0
1 類型
kind_1 = data[data['種類'] == 1]#kind_1['生存年限'] = kind_1['生存年限'].map(lambda x: int(x.replace('月','')))kind_1 = kind_1[["生存年限","客戶數(shù)","收益率"]].mean()kind_1
2 類型
kind_2 = data[data['種類'] == 2]#kind_2['生存年限'] = kind_2['生存年限'].map(lambda x: int(x.replace('月','')))kind_2 = kind_2[["生存年限","客戶數(shù)","收益率"]].mean()kind_2
kind_3 = data[data['種類'] == 3]#kind_3['生存年限'] = kind_3['生存年限'].map(lambda x: int(x.replace('月','')))kind_3 = kind_3[["生存年限","客戶數(shù)","收益率"]].mean()kind_3
雷達圖
from pyecharts import options as optsfrom pyecharts.globals import ThemeTypefrom pyecharts.charts import Radar
value_0 = [ ? list(kind_0.values)]value_1 = [ ? list(kind_1.values)]value_2 = [ ? list(kind_2.values)]value_3 = [ ? list(kind_3.values)]c_schema = [ ? {"name": "成立年限", "max": 5, "min": 0}, ? {"name": "客戶數(shù)", "max": 8500, "min": 0}, ? {"name": "收益率", "max": 4425, "min": 0},]c = ( ? Radar(init_opts=opts.InitOpts(theme=ThemeType.DARK)) ? .add_schema(schema=c_schema, shape="circle") ? .add("0", value_0, color="#f9713c") ? .add("1", value_1, color="#b3e4a1") ? .add("2", value_2, color="#bd10e0") ? .add("3", value_3, color="#FFFF00") ? .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) ? .set_global_opts(title_opts=opts.TitleOpts(title="企業(yè)聚類結(jié)果")))c.render('../output/聚類結(jié)果.html')c.render_notebook()
建立 KNN 分類模型預測附件2 企業(yè)等級附件1最終數(shù)據(jù)作為訓練集
data = data.fillna(0)
x_train = data.drop(columns=['企業(yè)代號','企業(yè)名稱','信譽評級','是否違約','種類'])y_train = data['信譽評級']
模型建立
from sklearn.neighbors import KNeighborsClassifier as KNNknn = KNN(n_neighbors=2) # 當有一個新樣本時,選取離他最近的 3 個,類別最多的,那新樣本也屬于這個類別knn.fit(x_train,y_train)
預測準確度評估
an = knn.predict(x_train)from sklearn.metrics import accuracy_scorescore = accuracy_score(an, y_train)score
附件2處理為需要用到的數(shù)據(jù)
'''每家公司的成立年限,第一張發(fā)票時間到最后一張發(fā)票時間的差值,以月為單位'''
支出表生存年限
live_time2 = df2_2[['企業(yè)代號','開票日期']]live_time2_min = live_time2.groupby('企業(yè)代號').min().reset_index()live_time2_max = live_time2.groupby('企業(yè)代號').max().reset_index()live_time2 = pd.merge(live_time2_max,live_time2_min,on='企業(yè)代號')live_time2['生存年限1'] = live_time2['開票日期x'] - live_time2['開票日期y']
收入表生存年限
live_time3 = df2_3[['企業(yè)代號','開票日期']]live_time3_min = live_time3.groupby('企業(yè)代號').min().reset_index()live_time3_max = live_time3.groupby('企業(yè)代號').max().reset_index()live_time3 = pd.merge(live_time3_max,live_time3_min,on='企業(yè)代號')live_time3['生存年限2'] = live_time3['開票日期x'] - live_time3['開票日期y']
找出生存年限最大的值作為生存年限
live_time = pd.merge(live_time2,live_time3,on='企業(yè)代號')[['企業(yè)代號','生存年限1','生存年限2']]x1 = list(live_time['生存年限1'])x2 = list(live_time['生存年限2'])x = []for i in range(len(x1)): ? if x1[i] >= x2[i]: ? ? ? x.append(x1[i]) ? else: ? ? ? x.append(x2[i])company_id = pd.DataFrame(live_time['企業(yè)代號'])x = pd.DataFrame(x,columns=['生存年限'])live_time = company_id.join(x)
生存年限轉(zhuǎn)為月份
live_time['生存年限'] = live_time['生存年限'].astype(str)live_time['生存年限'] = live_time['生存年限'].str.split().str.get(0)live_time['生存年限'] = live_time['生存年限'].map(lambda x: str(int(x) // 30) + '月')
'''客戶量:計算收入的發(fā)票數(shù)有多少'''customer = df2_2[['企業(yè)代號','購方單位代號','發(fā)票狀態(tài)']]customer = customer[customer['發(fā)票狀態(tài)'] == '有效發(fā)票']customer = customer.drop_duplicates(subset=['企業(yè)代號','購方單位代號'])customer = customer.groupby('企業(yè)代號')['購方單位代號'].count().reset_index()customer.rename(columns={'購方單位代號': '客戶數(shù)'},inplace=True)
'''每個企業(yè)的進項,作廢發(fā)票數(shù),有效發(fā)票數(shù)'''bill_outcome = df2_3[['企業(yè)代號','價稅合計','發(fā)票狀態(tài)']]
有效發(fā)票數(shù)
yes_bill_outcome = bill_outcome[bill_outcome['發(fā)票狀態(tài)'] == '有效發(fā)票']yes_bill_outcome = yes_bill_outcome.groupby('企業(yè)代號')['發(fā)票狀態(tài)'].count()yes_bill_outcome = yes_bill_outcome.reset_index()
作廢發(fā)票數(shù)
no_bill_outcome = bill_outcome[bill_outcome['發(fā)票狀態(tài)'] == '作廢發(fā)票']no_bill_outcome = no_bill_outcome.groupby('企業(yè)代號')['發(fā)票狀態(tài)'].count()no_bill_outcome = no_bill_outcome.reset_index()
進項有效,作廢發(fā)票數(shù)匯總
bill_outcome = pd.merge(yes_bill_outcome,no_bill_outcome,on='企業(yè)代號', ? ? ? ? ? ? ? ? ? ? ?how='left')bill_outcome.rename(columns={'發(fā)票狀態(tài)x' : '進項有效發(fā)票數(shù)', ? ? ? ? ? ? ? ? ? ? ? ? ? '發(fā)票狀態(tài)y' : '進項作廢發(fā)票數(shù)'}, ? ? ? ? ? ? ? ? ? ? ? ? ? inplace=True)
'''每個企業(yè)的銷項作廢發(fā)票數(shù),有效發(fā)票數(shù)'''bill_income = df2_3[['企業(yè)代號','價稅合計','發(fā)票狀態(tài)']]
有效發(fā)票數(shù)
yes_bill_income = bill_income[bill_income['發(fā)票狀態(tài)'] == '有效發(fā)票']yes_bill_income = yes_bill_income.groupby('企業(yè)代號')['發(fā)票狀態(tài)'].count()yes_bill_income = yes_bill_income.reset_index()
作廢發(fā)票數(shù)
no_bill_income = bill_income[bill_income['發(fā)票狀態(tài)'] == '作廢發(fā)票']no_bill_income = no_bill_income.groupby('企業(yè)代號')['發(fā)票狀態(tài)'].count()no_bill_income = no_bill_income.reset_index()
進項有效,作廢發(fā)票數(shù)匯總
bill_income = pd.merge(yes_bill_income,no_bill_income,on='企業(yè)代號', ? ? ? ? ? ? ? ? ? ? how='left')bill_income.rename(columns={'發(fā)票狀態(tài)x' : '銷項有效發(fā)票數(shù)', ? ? ? ? ? ? ? ? ? ? ? ? ? '發(fā)票狀態(tài)y' : '銷項作廢發(fā)票數(shù)'}, ? ? ? ? ? ? ? ? ? ? ? ? ? inplace=True)
'''每個企業(yè)進項價,銷項稅合計'''
進項
outcome_sum = df2_2[['企業(yè)代號','價稅合計']]outcome_sum = outcome_sum.groupby('企業(yè)代號')['價稅合計'].sum().reset_index()
銷項
income_sum = df2_3[['企業(yè)代號','價稅合計']]income_sum = income_sum.groupby('企業(yè)代號')['價稅合計'].sum().reset_index()
進項,銷項匯總
outcome_income_sum = pd.merge(outcome_sum,income_sum,on='企業(yè)代號')outcome_income_sum.rename(columns={'價稅合計x' : '進項價稅合計', ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '價稅合計y' : '銷項價稅合計'},inplace=True)
'''變量匯總'''import mathdata1 = pd.merge(df2_1,live_time,on='企業(yè)代號')data1 = pd.merge(data1,customer,on='企業(yè)代號')data1 = pd.merge(data1,bill_outcome,on='企業(yè)代號')data1 = pd.merge(data1,bill_income,on='企業(yè)代號')data1 = pd.merge(data1,outcome_income_sum,on='企業(yè)代號')data1['利潤'] = data1['銷項價稅合計'] - data1['進項價稅合計']data1['生存年限'] = data1['生存年限'].map(lambda x: int(x.replace('月','')))data1['生存年限'] = data1['生存年限'].map(lambda x: math.ceil(x / 12))data1['收益率'] = (data1['銷項價稅合計'] - data1['進項價稅合計']) / data1['進項價稅合計']data1['收益率'] = data1['收益率'] / data['生存年限']data1.to_excel('../data/data2.xlsx',encoding='utf8',index=False)