2023五一数模b题思路分享2

 第一问

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import numpy as np
import pandas as pd


# In[4]:


# 导入附件1
data = pd.read_excel(r"C:UsersDesktop2023-51MCM-Problem B附件1(Attachment 1)2023-51MCM-Problem B.xlsx").values


# In[8]:


date = np.unique(data[:,0]) # 日期
city = np.unique(data[:,[1,2]]) # 城市


# In[68]:


#####选取“收货量”相关指标

t1 =[] # 收货总量
t2 =[] # 日均收货量
t3 =[] # 单日最大收货量
t4 =[] # 日收货量极差      @
for i in range(city.shape[0]):
    if data[data[:,2]==city[i]].shape[0]!=0:
        t1+= [np.sum(data[data[:,2]==city[i]][:,-1])]
        t2+= [np.mean(data[data[:,2]==city[i]][:,-1])]
        t3+= [np.max(data[data[:,2]==city[i]][:,-1])]
        t4+= [np.ptp(data[data[:,2]==city[i]][:,-1])]
    else:
        t1+= [0]
        t2+= [0]
        t3+= [0]
        t4+= [0]
t1 = np.array(t1)[:,None]
t2 = np.array(t2)[:,None]
t3 = np.array(t3)[:,None]
t4 = np.array(t4)[:,None]
#######选取“发货量”相关指标
t5 =[] # 发货总量
t6 =[] # 日均发货量
t7 =[] # 单日最大发货量
t8 =[] # 日发货量极差        @
for i in range(city.shape[0]):
    if data[data[:,1]==city[i]].shape[0]!=0:
        t5+= [np.sum(data[data[:,1]==city[i]][:,-1])]
        t6+= [np.mean(data[data[:,1]==city[i]][:,-1])]
        t7+= [np.max(data[data[:,1]==city[i]][:,-1])]
        t8+= [np.ptp(data[data[:,1]==city[i]][:,-1])]
    else:
        t5+= [0]
        t6+= [0]
        t7+= [0]
        t8+= [0]
t5 = np.array(t5)[:,None]
t6 = np.array(t6)[:,None]
t7 = np.array(t7)[:,None]
t8 = np.array(t8)[:,None]
########选取"快递数量变化"相关指标

nd1 = np.zeros(shape=(date.shape[0],city.shape[0])) # 城市每日的发货
nd2 = np.zeros(shape=(date.shape[0],city.shape[0])) # 城市每日的收货
for i in range(date.shape[0]):
    d1 = data[data[:,0]==date[i]]
    for j in range(city.shape[0]):
        d2 = d1[d1[:,1]==city[j]] # 发
        d3 = d1[d1[:,2]==city[j]] # 收
        nd1[i,j] = np.sum(d2[:,-1])
        nd2[i,j] = np.sum(d3[:,-1])
nd11 = np.array([nd1[i+1]-nd1[i] for i in range(nd1.shape[0]-1)])
nd22 = np.array([nd2[i+1]-nd2[i] for i in range(nd2.shape[0]-1)])

t9 = nd11.max(axis=0)[:,None] # 发货量最大增幅
t10 = nd11.min(axis=0)[:,None] # 发货量最小增幅
t11 = nd11.mean(axis=0)[:,None] # 发货量平均增幅
t12 = nd11.std(axis=0)[:,None] # 发货量增幅标准差   @

t13 = nd22.max(axis=0)[:,None] # 收货量最大增幅
t14 = nd22.min(axis=0)[:,None] # 收货量最小增幅
t15 = nd22.mean(axis=0)[:,None] # 收货量平均增幅
t16 = nd22.std(axis=0)[:,None] # "收货量增幅标准差"   @

########选取"相关性"相关指标
t17 = [] # 上游发货城市总数
t18 = [] # 下游发货城市总数
for i in range(city.shape[0]):
    d1 = data[data[:,2]==city[i]][:,1]
    t17+=[np.unique(d1).shape[0]]
    d2 = data[data[:,1]==city[i]][:,2]
    t18+=[np.unique(d2).shape[0]]

md1 =  np.zeros(shape=(date.shape[0],city.shape[0])) # 每日上游城市数
md2 =  np.zeros(shape=(date.shape[0],city.shape[0])) # 每日下游城市数
for i in range(date.shape[0]):
    d1 = data[data[:,0]==date[i]]
    for j in range(city.shape[0]):
        md1[i,j] = np.unique(d1[d1[:,2]==city[j]][:,1]).shape[0]
        md2[i,j] = np.unique(d1[d1[:,1]==city[j]][:,2]).shape[0]
t19 = md1.max(axis=0)[:,None] # 单日最大上游城市数
t20 = md2.max(axis=0)[:,None] # 单日最大下游城市数


# In[71]:


datat = t1.copy()
for i in range(2,21):
    t = eval("t%d"%i)
    datat = np.c_["1",datat,t]


# In[73]:


col = ["收货总量","日均收货量","单日最大收货量","日收货量极差","发货总量","日均发货量","单日最大发货量","日发货量极差",
"发货量最大增幅","发货量最小增幅","发货量平均增幅","发货量增幅标准差","收货量最大增幅","收货量最小增幅","收货量平均增幅",
"收货量增幅标准差","上游发货城市总数","下游发货城市总数","单日最大上游城市数","单日最大下游城市数"]


# In[77]:


#pd.DataFrame(datat,index = city,columns=col).to_excel(r"C:UsersDesktop城市指标数据.xlsx")


# In[86]:


# 对数据进行正向化
t4 = (t4.max()-t4)/t4.ptp()
t8 = (t8.max()-t8)/t8.ptp()
t12 = (t12.max()-t12)/t12.ptp()
t16 = (t16.max()-t16)/t16.ptp()


# In[91]:


datat1 = t1.copy()
for i in range(2,21):
    t = eval("t%d"%i)
    datat1 = np.c_["1",datat1,t]


# In[92]:


# 对数据进行归一化
datat1 = (datat1-datat1.min(axis=0))/datat1.ptp()


# In[93]:


#pd.DataFrame(datat1,index = city,columns=col).to_excel(r"C:UsersMATH_MGDDesktop城市指标数据(正向化-标准化).xlsx")


# In[98]:


# 使用熵权法加权
def EWM(A):
    """
    熵权法 the entropy weight method
    参数说明:
    A :为原始数据矩阵A=a(i,j),表示第i个对象的j个指标,数据结构为np.array,shape=(n,m)
    返回值说明
    return ST,P,E,G,W,S
    ST : 得分排名从小到大
    P : 概率矩阵
    E : 指标的熵
    G : 指标混乱度
    W : 指标权重
    S : 评价对象得分
    """
    n,m = A.shape
    if 0 in A:
        A += 0.00001
    P = A/A.sum(axis=0)
    E = (-1/np.log(n))*np.sum(P*np.log(P),axis=0)
    G = 1-E
    W = G/G.sum()
    W = np.round(W,4)

    return W
w = EWM(datat1)


# In[99]:


datat2 = datat1*w


# In[100]:


# pd.DataFrame(datat2,index = city,columns=col).to_excel(r"C:UsersMATH_MGDDesktop城市指标数据(加权后).xlsx")


# In[101]:


def min_to_max(x):
    y = (np.max(x)-x)/(np.max(x)-np.min(x))
    return y.copy()
def mid_to_max(x,c):
    y = np.zeros_like(x)
    y[x>c] =1-(x[x>c]-c)/np.ptp(x)
    y[x<=c] =1-(c-x[x<=c])/np.ptp(x)
    return y.copy()

def range_to_max(x,a,b):
    y = np.ones_like(x)
    y[x>b] =1-(x[x>b]-b)/np.ptp(x)
    y[x<a] =1-(a-x[x<a])/np.ptp(x)
    return y.copy()
def TOPSIS(data,fm1=[],fm2=[],c=[],fm3=[],a=[],b=[],w=None):
    values = data.copy()
    if w == None:
        w = np.ones(shape=(1,values.shape[1]))
    for i in range(len(fm1)):
        values[:,fm1[i]] = min_to_max(values[:,fm1[i]])
    for i in range(len(fm2)):
        values[:,fm2[i]] = mid_to_max(values[:,fm2[i]],c[i])
    for i in range(len(fm3)):
        values[:,fm3[i]] = range_to_max(values[:,fm3[i]],a[i],b[i])
    values1 = (values-values.min(axis=0))/values.ptp(axis=0)
    values2 = w*values1
    M = values2.max(axis=0)
    m = values2.min(axis=0)
    D = np.sum((values2-M)**2,axis=1)**0.5
    d = np.sum((values2-m)**2,axis=1)**0.5
    f = d/(d+D)
    return f
TOPSIS(datat2)


# In[ ]:




第二问:

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense, LSTM
import datetime


# In[5]:


data = pd.read_excel(r"C:UsersDesktop2023-51MCM-Problem B附件1(Attachment 1)2023-51MCM-Problem B.xlsx").values


# In[13]:


lines = np.unique(np.array([i[0]+i[1]for i in data[:,[1,2]]]))
lines = np.array([[i[0],i[1]] for i in lines])


# In[29]:


all_pre = []


# In[30]:


for i in range(lines.shape[0]):
    y = data[np.logical_and(data[:,1]==lines[i,0],data[:,2]==lines[i,1])][:,-1].astype(np.float64)
    # 将数据划分为训练集和测试集
    train_size = int(len(y) * 0.8)
    train, test = y[:train_size], y[train_size:]

    # 数据归一化
    scaler = MinMaxScaler()
    train = scaler.fit_transform(train.reshape(-1, 1))
    test = scaler.transform(test.reshape(-1, 1))

    # 创建数据生成器
    def create_dataset(data, look_back=1):
        X, Y = [], []
        for i in range(len(data) - look_back):
            X.append(data[i:(i + look_back), 0])
            Y.append(data[i + look_back, 0])
        return np.array(X), np.array(Y)

    look_back = 7
    X_train, y_train = create_dataset(train, look_back)
    X_test, y_test = create_dataset(test, look_back)

    # 重塑数据以适应LSTM模型的输入格式
    X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
    X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))

    # 创建LSTM模型
    model = Sequential()
    model.add(LSTM(50, input_shape=(look_back, 1)))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')

    # 训练模型
    model.fit(X_train, y_train, epochs=100, batch_size=1, verbose=1)

    # 预测
    train_predict = model.predict(X_train)
    test_predict = model.predict(X_test)

    # 将预测结果转换回原始尺度
    train_predict = scaler.inverse_transform(train_predict)
    y_train = scaler.inverse_transform(y_train.reshape(-1, 1))
    test_predict = scaler.inverse_transform(test_predict)
    y_test = scaler.inverse_transform(y_test.reshape(-1, 1))

    # 计算预测准确性,例如使用均方误差(MSE)作为评估指标
    train_mse = np.mean((train_predict - y_train) ** 2)
    test_mse = np.mean((test_predict - y_test) ** 2)

    # 计算预测日期与最后一个训练日期之间的天数
    last_train_date = datetime.date(2019, 4, 17)
    start_pred_date = datetime.date(2019, 4, 18)
    end_pred_date = datetime.date(2019, 4, 20)
    days_to_predict = (end_pred_date-start_pred_date).days

    # 使用训练数据的最后一部分来开始预测
    input_data = train[-look_back:]

    predictions = []

    # 预测每一天的货量
    for i in range(days_to_predict):
        input_data_reshaped = input_data.reshape(1, look_back, 1)
        pred = model.predict(input_data_reshaped)
        predictions.append(pred[0, 0])

        # 更新输入数据,用预测值替换最早的值
        input_data = np.roll(input_data, -1)
        input_data[-1] = pred

    # 将预测值转换回原始尺度
    predictions = scaler.inverse_transform(np.array(predictions).reshape(-1, 1))

    tdays = []
    # 打印预测结果
    for i, pred in enumerate(predictions, start=1):
        pred_date = start_pred_date + datetime.timedelta(days=i - 1)
        tdays += [pred[0]]
    all_pre+=[tdays]


# In[41]:


all_pre = np.array(all_pre)
all_pre
#pd.DataFrame(np.c_["1",lines,all_pre],columns=["起点","终点","2023年4月28日","2023年4月29日"]).to_excel(r"C:UsersMATH_MGDDesktop第二问预测结果.xlsx")


# In[ ]:




第三问:

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense, LSTM
import datetime


# In[7]:


data = pd.read_excel(r"C:UsersDesktop2023-51MCM-Problem B附件2(Attachment 2)2023-51MCM-Problem B.xlsx").values


# In[14]:


lines = np.unique(np.array([i[0]+i[1]for i in data[:,[1,2]]]))
lines = np.array([[i[0],i[1]] for i in lines])
date = np.unique(data[:,0])


# In[15]:


d = np.zeros(shape=(lines.shape[0],date.shape[0]))
d1 = np.zeros(shape=(lines.shape[0],date.shape[0]))
for i in range(d.shape[0]):
    data1 = data[np.logical_and(data[:,1]==lines[i,0],data[:,2]==lines[i,1])]
    for j in range(d.shape[1]):
        data2 = data1[data1[:,0]==date[j]]
        if data2.shape[0]==0:
            d[i,j]=0
            d1[i,j]=0
        else:
            d[i,j]=1
            d1[i,j]=data2[0,-1]


# In[20]:


all_pre1 = []
def create_dataset(data, look_back=1):
    X, Y = [], []
    for i in range(len(data) - look_back):
        X.append(data[i:(i + look_back), 0])
        Y.append(data[i + look_back, 0])
    return np.array(X), np.array(Y)
for i in range(lines.shape[0]):
    y = d[i]
    # 将数据划分为训练集和测试集
    train_size = int(len(y) * 0.8)
    train, test = y[:train_size], y[train_size:]

    # 数据归一化
    scaler = MinMaxScaler()
    train = scaler.fit_transform(train.reshape(-1, 1))
    test = scaler.transform(test.reshape(-1, 1))

    # 创建数据生成器

    look_back = 7
    X_train, y_train = create_dataset(train, look_back)
    X_test, y_test = create_dataset(test, look_back)

    # 重塑数据以适应LSTM模型的输入格式
    X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
    X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))

    # 创建LSTM模型
    model = Sequential()
    model.add(LSTM(50, input_shape=(look_back, 1)))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')

    # 训练模型
    model.fit(X_train, y_train, epochs=20, batch_size=1, verbose=1)

    # 预测
    train_predict = model.predict(X_train)
    test_predict = model.predict(X_test)

    # 将预测结果转换回原始尺度
    train_predict = scaler.inverse_transform(train_predict)
    y_train = scaler.inverse_transform(y_train.reshape(-1, 1))
    test_predict = scaler.inverse_transform(test_predict)
    y_test = scaler.inverse_transform(y_test.reshape(-1, 1))

    # 计算预测准确性,例如使用均方误差(MSE)作为评估指标
    train_mse = np.mean((train_predict - y_train) ** 2)
    test_mse = np.mean((test_predict - y_test) ** 2)

    # 计算预测日期与最后一个训练日期之间的天数
    last_train_date = datetime.date(2019, 4, 17)
    start_pred_date = datetime.date(2019, 4, 18)
    end_pred_date = datetime.date(2019, 4, 20)
    days_to_predict = (end_pred_date-start_pred_date).days

    # 使用训练数据的最后一部分来开始预测
    input_data = train[-look_back:]

    predictions = []

    # 预测每一天的货量
    for i in range(days_to_predict):
        input_data_reshaped = input_data.reshape(1, look_back, 1)
        pred = model.predict(input_data_reshaped)
        predictions.append(pred[0, 0])

        # 更新输入数据,用预测值替换最早的值
        input_data = np.roll(input_data, -1)
        input_data[-1] = pred

    # 将预测值转换回原始尺度
    predictions = scaler.inverse_transform(np.array(predictions).reshape(-1, 1))

    tdays = []
    # 打印预测结果
    for i, pred in enumerate(predictions, start=1):
        pred_date = start_pred_date + datetime.timedelta(days=i - 1)
        tdays += [pred[0]]
    all_pre1+=[tdays]
all_pre1 = np.array(all_pre1)


# In[21]:


all_pre = []
def create_dataset(data, look_back=1):
    X, Y = [], []
    for i in range(len(data) - look_back):
        X.append(data[i:(i + look_back), 0])
        Y.append(data[i + look_back, 0])
    return np.array(X), np.array(Y)
for i in range(lines.shape[0]):
    y = d1[i]
    y[y==0]=y.mean()
    # 将数据划分为训练集和测试集
    train_size = int(len(y) * 0.8)
    train, test = y[:train_size], y[train_size:]

    # 数据归一化
    scaler = MinMaxScaler()
    train = scaler.fit_transform(train.reshape(-1, 1))
    test = scaler.transform(test.reshape(-1, 1))

    # 创建数据生成器

    look_back = 7
    X_train, y_train = create_dataset(train, look_back)
    X_test, y_test = create_dataset(test, look_back)

    # 重塑数据以适应LSTM模型的输入格式
    X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
    X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))

    # 创建LSTM模型
    model = Sequential()
    model.add(LSTM(50, input_shape=(look_back, 1)))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')

    # 训练模型
    model.fit(X_train, y_train, epochs=20, batch_size=1, verbose=1)

    # 预测
    train_predict = model.predict(X_train)
    test_predict = model.predict(X_test)

    # 将预测结果转换回原始尺度
    train_predict = scaler.inverse_transform(train_predict)
    y_train = scaler.inverse_transform(y_train.reshape(-1, 1))
    test_predict = scaler.inverse_transform(test_predict)
    y_test = scaler.inverse_transform(y_test.reshape(-1, 1))

    # 计算预测准确性,例如使用均方误差(MSE)作为评估指标
    train_mse = np.mean((train_predict - y_train) ** 2)
    test_mse = np.mean((test_predict - y_test) ** 2)

    # 计算预测日期与最后一个训练日期之间的天数
    last_train_date = datetime.date(2019, 4, 17)
    start_pred_date = datetime.date(2019, 4, 18)
    end_pred_date = datetime.date(2019, 4, 20)
    days_to_predict = (end_pred_date-start_pred_date).days

    # 使用训练数据的最后一部分来开始预测
    input_data = train[-look_back:]

    predictions = []

    # 预测每一天的货量
    for i in range(days_to_predict):
        input_data_reshaped = input_data.reshape(1, look_back, 1)
        pred = model.predict(input_data_reshaped)
        predictions.append(pred[0, 0])

        # 更新输入数据,用预测值替换最早的值
        input_data = np.roll(input_data, -1)
        input_data[-1] = pred

    # 将预测值转换回原始尺度
    predictions = scaler.inverse_transform(np.array(predictions).reshape(-1, 1))

    tdays = []
    # 打印预测结果
    for i, pred in enumerate(predictions, start=1):
        pred_date = start_pred_date + datetime.timedelta(days=i - 1)
        tdays += [pred[0]]
    all_pre+=[tdays]
all_pre = np.array(all_pre)


# In[23]:


all_pre1[all_pre1>0.5]=1


# In[25]:


all_pre1[all_pre1<=0.5]=0


# In[30]:


p2 = all_pre*all_pre1


# In[36]:


#pd.DataFrame(np.c_["1",lines,all_pre1,p2],columns=["起点","终点","28号是否开通","29号是否开通","28号预测值","29号预测值"]).to_excel(r"C:UsersDesktop第三问结果.xlsx")


# In[ ]:




第四问:

4(23)

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import numpy as np
import pandas as pd


# In[4]:


for i in range(1,82):
    pd.DataFrame([]).to_excel(r"C:UsersDesktop23{}.xlsx".format(i))


# In[9]:


data = pd.read_excel(r"C:UsersMATH_MGDDesktop23{}.xlsx".format(1),index_col=0).values.copy()
for i in range(2,82):
    data+=pd.read_excel(r"C:UsersMATH_MGDDesktop23{}.xlsx".format(i),index_col=0).values.copy()


# In[11]:


pd.DataFrame(data).to_excel(r"C:UsersDesktop23{}.xlsx".format("总"))


# In[17]:


R = pd.read_excel(r"C:UsersDesktop23额定装货量R.xlsx",index_col=0).values
F = pd.read_excel(r"C:UsersDesktop23固定成本F.xlsx",index_col=0).values


# In[19]:


np.sum((1+(data/R)**3)*F)


# In[ ]:




4(24)

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import numpy as np
import pandas as pd


# In[2]:


# for i in range(1,82):
#     pd.DataFrame([]).to_excel(r"C:UsersDesktop23{}.xlsx".format(i))


# In[7]:


data = pd.read_excel(r"C:UsersDesktop24{}.xlsx".format(1),index_col=0).values.copy()
for i in range(2,81):
    data+=pd.read_excel(r"C:UsersDesktop24{}.xlsx".format(i),index_col=0).values.copy()


# In[8]:


pd.DataFrame(data).to_excel(r"C:UsersDesktop24{}.xlsx".format("总"))


# In[9]:


R = pd.read_excel(r"C:UsersDesktop24额定装货量R.xlsx",index_col=0).values
F = pd.read_excel(r"C:UsersDesktop24固定成本F.xlsx",index_col=0).values


# In[10]:


np.sum((1+(data/R)**3)*F)


# In[ ]:


# 16432.059402286315
# 22715.650305793395

4(25)

#!/usr/bin/env python
# coding: utf-8

# In[11]:


import numpy as np
import pandas as pd


# In[12]:


# for i in range(1,82):
#     pd.DataFrame([]).to_excel(r"C:UsersDesktop23{}.xlsx".format(i))


# In[13]:


data = pd.read_excel(r"C:UsersDesktop25{}.xlsx".format(1),index_col=0).values.copy()
for i in range(2,81):
    data+=pd.read_excel(r"C:UsersDesktop25{}.xlsx".format(i),index_col=0).values.copy()


# In[14]:


pd.DataFrame(data).to_excel(r"C:UsersDesktop25{}.xlsx".format("总"))


# In[15]:


R = pd.read_excel(r"C:UsersDesktop24额定装货量R.xlsx",index_col=0).values
F = pd.read_excel(r"C:UsersDesktop24固定成本F.xlsx",index_col=0).values


# In[16]:


np.sum((1+(data/R)**3)*F)


# In[ ]:


# 16432.059402286315
# 22715.650305793395

4(26)4(27)

第五问:

#!/usr/bin/env python
# coding: utf-8

# In[68]:


import numpy as np
import pandas as pd
from sklearn.neighbors import KernelDensity
import matplotlib.pyplot as plt
# 中文的使用
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["kaiti"] # 设置中文字体
mpl.rcParams["axes.unicode_minus"]=False  # 设置减号不改变


# In[69]:


data = pd.read_excel(r"C:UsersDesktop22(7-9).xlsx").values

date = np.unique(data[:,0])

lines = np.unique([i[0]+i[1]for i in data[:,[1,2]]])
lines = np.array([[i[0],i[1]] for i in lines])

line_mean = []
line_min = []
xu = []
f_mean = []
f_std = []
mt = np.zeros(shape=(lines.shape[0],date.shape[0]))
for i in range(lines.shape[0]):
    d1 = data[np.logical_and(data[:,1]==lines[i,0],data[:,2]==lines[i,1])][:,-1]
    rq = data[np.logical_and(data[:,1]==lines[i,0],data[:,2]==lines[i,1])][:,0]
    line_mean+=[d1.mean()]
    line_min +=[d1.min()]
    gd =d1.mean()-2*d1.std()
    gd=0 if gd<0 else gd
    xu +=[gd]
    d2 = d1-(gd)
    f_mean += [d2.mean()]
    f_std += [d2.std()]
    for j in range(rq.shape[0]):
        mt[i,date==rq[j]] = d2[j]
xu = np.array(xu)
print("22年3季度固定需求",np.c_["1",lines,np.round(xu)])
print("22年3季度非固定需求均值标准差n",np.c_["1",lines,np.round(f_mean,4),np.round(f_std,4)])


# In[70]:


pd.DataFrame(np.c_["1",lines,np.round(xu)],columns=["起点","终点","固定需求"]).to_excel(r"C:UsersDesktop第五问_固定需求(22年3季度).xlsx")


# In[71]:


pd.DataFrame(np.c_["1",lines,np.round(f_mean,4),np.round(f_std,4)],columns=["起点","终点","均值","标准差"]).to_excel(r"C:UsersDesktop第五问_非固定需求(均值与标准差)(22年3季度).xlsx")


# In[72]:


pd.DataFrame(np.c_["1",lines,mt],columns=np.r_["0",["起点","终点"],date]).to_excel(r"C:UsersDesktop第五问_非固定需求(22年3季度).xlsx")


# In[73]:


sc = np.array([["V","N"],["V","Q"],["J","I"],["O","G"]])


# In[74]:


i=0
for i in range(2):
    d1 = data[np.logical_and(data[:,1]==sc[i,0],data[:,2]==sc[i,1])][:,-1]
    d2 = d1-(d1.mean()-d1.min())
    # 示例数据(请用实际非固定需求数据替换)
    sample_data = d2.reshape(-1, 1)

    # KDE模型实例化
    kde = KernelDensity(kernel='gaussian', bandwidth=5).fit(sample_data)

    # 指定评估点(根据实际需求调整范围和间隔)
    evaluation_points = np.linspace(d2.min(), d2.max(), num=300).reshape(-1, 1)

    # 评估KDE模型
    log_density = kde.score_samples(evaluation_points)
    density = np.exp(log_density)

    # 绘制KDE结果和直方图
    fig, ax = plt.subplots()
    ax.plot(evaluation_points, density, label='KDE')
    ax.hist(sample_data, bins=5, density=True, alpha=0.5, color='blue', label='直方图')

    ax.set_xlabel(f'{sc[i,0]}->{sc[i,1]}(非固定需求)',fontsize=14)
    ax.set_ylabel('概率密度',fontsize=14)
    ax.legend(fontsize=14)
    plt.show()
    pd.DataFrame(np.c_["1",evaluation_points,density[:,None]],columns=["非固定需求量","概率密度"]).to_excel(r"C:UsersDesktop{}_{}(非固定需求).xlsx".format(sc[i,0],sc[i,1]))


# In[75]:


data = pd.read_excel(r"C:UsersDesktop23(1-3).xlsx").values

date = np.unique(data[:,0])

lines = np.unique([i[0]+i[1]for i in data[:,[1,2]]])
lines = np.array([[i[0],i[1]] for i in lines])

line_mean = []
line_min = []
xu = []
f_mean = []
f_std = []
mt = np.zeros(shape=(lines.shape[0],date.shape[0]))
for i in range(lines.shape[0]):
    d1 = data[np.logical_and(data[:,1]==lines[i,0],data[:,2]==lines[i,1])][:,-1]
    rq = data[np.logical_and(data[:,1]==lines[i,0],data[:,2]==lines[i,1])][:,0]
    line_mean+=[d1.mean()]
    line_min +=[d1.min()]
    gd =d1.mean()-2*d1.std()
    gd=0 if gd<0 else gd
    xu +=[gd]
    d2 = d1-(gd)
    f_mean += [d2.mean()]
    f_std += [d2.std()]
    for j in range(rq.shape[0]):
        mt[i,date==rq[j]] = d2[j]
xu = np.array(xu)
print("23年1季度固定需求",np.c_["1",lines,np.round(xu)])
print("23年1季度非固定需求均值标准差n",np.c_["1",lines,np.round(f_mean,4),np.round(f_std,4)])


# In[76]:


pd.DataFrame(np.c_["1",lines,np.round(xu)],columns=["起点","终点","固定需求"]).to_excel(r"C:UsersDesktop第五问_固定需求(23年第1季度).xlsx")


# In[77]:


pd.DataFrame(np.c_["1",lines,np.round(f_mean,4),np.round(f_std,4)],columns=["起点","终点","均值","标准差"]).to_excel(r"C:UsersDesktop第五问_非固定需求(均值与标准差)(23年1季度).xlsx")


# In[78]:


pd.DataFrame(np.c_["1",lines,mt],columns=np.r_["0",["起点","终点"],date]).to_excel(r"C:UsersDesktop第五问_非固定需求(23年1季度).xlsx")


# In[79]:


for i in range(2,4):
    d1 = data[np.logical_and(data[:,1]==sc[i,0],data[:,2]==sc[i,1])][:,-1]
    d2 = d1-(d1.mean()-d1.min())
    # 示例数据(请用实际非固定需求数据替换)
    sample_data = d2.reshape(-1, 1)

    # KDE模型实例化
    kde = KernelDensity(kernel='gaussian', bandwidth=5).fit(sample_data)

    # 指定评估点(根据实际需求调整范围和间隔)
    evaluation_points = np.linspace(d2.min(), d2.max(), num=300).reshape(-1, 1)

    # 评估KDE模型
    log_density = kde.score_samples(evaluation_points)
    density = np.exp(log_density)

    # 绘制KDE结果和直方图
    fig, ax = plt.subplots()
    ax.plot(evaluation_points, density, label='KDE')
    ax.hist(sample_data, bins=5, density=True, alpha=0.5, color='blue', label='直方图')

    ax.set_xlabel(f'{sc[i,0]}->{sc[i,1]}(非固定需求)',fontsize=14)
    ax.set_ylabel('概率密度',fontsize=14)
    ax.legend(fontsize=14)
    plt.show()
    pd.DataFrame(np.c_["1",evaluation_points,density[:,None]],columns=["非固定需求量","概率密度"]).to_excel(r"C:UsersDesktop{}_{}(非固定需求).xlsx".format(sc[i,0],sc[i,1]))


# In[ ]:





# In[ ]:





# In[ ]: