当前位置:   article > 正文

数学建模笔记总结_数学模型笔记

数学模型笔记

   在这里插入图片描述

1️⃣数模比赛论文模版/项目推荐:

GitHub - BetterBench/Math_Model

2️⃣数模常用方法介绍:

一份简短又全面的数学建模技能图谱:常用模型&算法总结

数学建模中常用的方法 - 知乎

3️⃣建模比赛问题汇总:

数学建模(所有问题汇总) - 知乎


数学建模三大模型

1、预测模型

预测模型:神经网络预测、灰色预测、拟合插值预测(线性回归)、时间序列预测、马尔科夫链预测、微分方程预测、Logistic 模型等等。

应用领域:人口预测、水资源污染增长预测、病毒蔓延预测、竞赛获胜概率预测、月收入预测、销量预测、经济发展情况预测等在工业、农业、商业等经济领域,以及环境、社会和军事等领域中都有广泛的应用。

预测模型:难度中等。

拟合插值预测:基础简单、容易理解。

  • 拟合算法:matlab拟合工具箱、准确...
  • 插值算法:短期预测、完善补全数据、插值函数、拉格朗日插值法、三次样条插值法...

神经网络预测:现代优化算法、考验编程能力。

人口预测:灰色预测、Logistic 模型...

2、优化模型

优化模型:规划模型(目标规划、线性规划、非线性规划、整数规划、动态规划)、图论模型、排队论模型、神经网络模型、现代优化算法(遗传算法、模拟退火算法、蚁群算法、禁忌搜索算法)等等。

应用领域:快递员派送快递的最短路径问题、水资源调度优化问题、高速路口收费站问题、军事行动避空侦察的时机和路线选择、物流选址问题、商区布局规划等各个领域。

优化模型:偏难。

切割木料、地板,使损耗最低、利润最高。

自然水管道铺设问题:图论模型(迪杰斯特拉算法 Dijkstra、克鲁斯卡尔算法 Kruskal)

3、评价模型

评价模型:模糊综合评价法、层次分析法、聚类分析法、主成分分析评价法、灰色综合评价法、人工神经网络评价法等等。

应用领域:某区域水资源评价、水利工程项目风险评价、城市发展程度评价、足球教练评价、篮球队评价、水生态评价、大坝安全评价、边坡稳定性评价。

预测模型:偏简单。

数学建模的十大常用算法

    

遗传算法、模拟退火算法重要


数学建模方法导图:

 四大模型


Python数据分析  

一、生成pandas


生成pandas作用
pd.Series()生成pandas,一维数组
pd.DataFrame()生成pandas,二维的,有行列标签的

(1) pd.Series

  1. import numpy as np
  2. import pandas as pd
  3. a = pd.Series([1, 3, 6, 'orange'])
  4. print('pandas和字典有点像', a)

(2) pd.DataFrame

  • (a)以数组形式生成
  1. # 生成6个日期行索引号
  2. datas = pd.date_range('20190403', periods=6)
  3. # 生成有64列行索引(index)和列索引(columns)的pandas
  4. df = pd.DataFrame(np.random.random(size=(6, 4)), index=datas, columns=['a', 'b', 'c', 'd'])
  5. print('生成有6行4列行索引(index)和列索引(columns)的pandas:\n', df)

生成有6行4列行索引(index)和列索引(columns)的pandas:![a         b         c         d2019-04-03  0.738911  0.879335  0.999508  0.5268412019-04-04  0.953549  0.241815  0.766645  0.4044902019-04-05  0.828219  0.438556  0.410837  0.6045862019-04-06  0.773841  0.206463  0.106903  0.2269362019-04-07  0.642087  0.493921  0.694423  0.7053992019-04-08  0.263436  0.842878  0.242580  0.874247](https://img-blog.csdnimg.cn/c0062eaece764496a9778c875ef1b46b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVsbG9iaWdvcmFuZ2U=,size_9,color_FFFFFF,t_70,g_se,x_16)

  • (b)以字典形式生成
  1. # 以字典方式生成pandas,其中AB为列索引
  2. df2 = pd.DataFrame({'A': 1, 'B': 2.}, index=np.arange(2))
  3. print('以字典方式生成pandas\n', df2)

在这里插入图片描述

二、dataframe的基本属性


pandas作用
df.index行索引号
df.columns列索引号
df.valuespandas数值
df.shape形状
df.dtypes查看每一列的数据类型
s.index.is_unique是否有重复索引,返回值为Bool值

三、索引值和修改dataframe


pandas索引作用
df[‘a’]或df.a索引a列
df.loc[:,“a”]对标签进行索引,返回’a’标签所在列
df.iloc[:,0]对位置进行索引,返回第0列
df[2:4]索引2、3行
df.tail(3)返回后三行
df.head(5)返回前5行
df.ix标签和位置混合索引,不建议使用
df.iat[1,1]位置索引,索引第1行第1列的值
df[df>0]索引df>0的元素,小于0的返回NaN
df.insert(1,‘bar’,np.nan)在第0、1列之间插入一列nan,列标签为’bar’
df.assign(Ratio=lambda x:x.a-x.b)增加新列一列标签为Ratio的,值为df.a-df.b
df.reindex(index=range(8),method=‘ffill’)重建行索引标签0-7,method='ffill’新增行的值我们用上一行的填充,method只对行有效
df.reindex(columns=range(8),fill_value=0)重建列索引标签0-7,fill_value=0表示对于新增列的值设为0
df.drop([‘A’,‘B’], axis=0,inplce=True)丢掉行A、B
  1. # 1、pandas索引
  2. print('选中df的a列\n', df['a'], df.loc[:, 'a'], df.iloc[:, 0], df[0])
  3. print('选中df的第0行\n', df.iloc[0], df.loc['2019-04-03'],df[0:1])
  4. print('选df的135行,12列', df.iloc[[1, 3, 5], 1:3], df.ix[[1, 3, 5], ['a', 'b']])
  5. print('索引df的a列中大于0.5对应的行', df[df['a'] > 0.5])
  6. # 2、通过索引改变pandas的值
  7. df.iloc[2, 2] = 'orange'
  8. df.iat[2,2] = 'orange'
  9. df.loc['2019-04-03', 'a'] = 'apple'
  10. # 3、将df的b列大于0.3对应的行令为0
  11. df[df.b > 0.3] = 0
  12. # 4、将df的d列大于0.5对应的元素令为0
  13. df.d[df.d > 0.5] = 0
  14. # 5、增加一列e和f
  15. df['e'] = 6
  16. # 6、增加一行
  17. s2 = pd.Series(np.arange(4), index=df.columns)
  18. res = df3.append(s2, ignore_index=True)

四、运算(排序、统计、累加、判等)


pandas运算作用
df.describe()描述个数、均值、方差、分位数
df.T转置
df.sort_index(axis=1,ascending=False)对列索引号排序,降序
df.sort_values(by=‘d’)对d列的值的大小进行排序
s.value_counts()查看每个数有多少个,s为Series类型
s.rank()排名,最小值排第一名,依次往后
df.mean()按列取平均值
df.mean(axis=1)按行取平均值
df.cumsum()或df.apply(np.cumsum)对每一列进行累加
s.mode()产生次数最多的数字,s为Series类型
(df1==df).all().all()判断df1和df的值是否完全相等
df.apply(lambda x:x.max()-x.min(),axis=0)求每一列的max-min
s.isin([‘a’,‘c’])s的值是否在[‘a’,‘c’]里

五、处理丢失数据(如nan数据)


pandas处理丢失数据作用
df.dropna(axis=1, how=‘any’)丢掉nan所在的列
df.dropna()或 df.dropna(axis=0, how=‘any’)丢掉nan所在的行
df.fillna(value=5)填充nan的数据为5
df.isnull()判断是否有空数据,返回值为布尔型
df3.isnull().any().any()或np.any(df.isnull()) == True)存在任一丢失数据,返回True
  1. 注意: 1.how='any'存在任意一个nan就丢,how='all'该列全部为nan才丢
  2. 2.NaN值不参与计算

六、合并


pandas合并数据作用
pd.concat([df1, df2], axis=0,ignore_index=True,join=‘inner’)上下合并,忽略原来的行索引,join='inner’表示只合并df1、df2的共有列;不写就表示
pd.merge(left, right, on=‘key’)以列索引key为基准进行左右合并
df3.append([df4,df5], ignore_index=True)将df4,df5合并到df3,忽略原来的行索引。
  注意:在concat里面axis=0,上下合并;axis=1,左右合并,不写默认axis=0; concat既可以上下又可以左右合并, append只能上下合并, merge只能左右合并

1、concat和append

  1. df4 = pd.DataFrame(np.ones((3, 4)), columns=['a', 'b', 'c', 'd'], index=[1, 2, 3])
  2. df5 = pd.DataFrame(np.ones((3, 4))*2, columns=['b', 'c', 'd', 'e'], index=[2, 3, 4])
  3. res1 = pd.concat([df4, df5],axis=0, ignore_index=True)
  4. res2 = pd.concat([df4, df5], join='inner')
  5. print("res1:上下合并,忽略原索引,缺失补Nan:\n",res1, '\n', "res2:上下合并,只合并共有列:\n",res2, '\n')
  6. res3 = pd.concat([df4, df5], join='inner',axis=1)
  7. print("res3:左右合并,忽略原索引,缺失补Nan:\n",res3)
  8. res4 = df4.append([df4,df5], ignore_index=True)
  9. print("append方式上下合并:\n",res4)
  10. s2 = pd.Series(np.arange(4), index=df4.columns)
  11. res5 = df4.append(s2, ignore_index=True)
  12. print("append方式增加一行:\n",res5)

在这里插入图片描述

2、merge合并,左右合并

  1. # 只有一个key
  2. left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
  3. 'A': ['A0', 'A1', 'A2', 'A3'],
  4. 'B': ['B0', 'B1', 'B2', 'B3']})
  5. right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
  6. 'C': ['C0', 'C1', 'C2', 'C3'],
  7. 'D': ['D0', 'D1', 'D2', 'D3']})
  8. # 以keycolumns为基准合并
  9. res6 = pd.merge(left, right, on='key')
  10. print(res6)
  11. # 考虑有两个key
  12. left1 = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
  13. 'key2': ['K0', 'K1', 'K0', 'K1'],
  14. 'A': ['A0', 'A1', 'A2', 'A3'],
  15. 'B': ['B0', 'B1', 'B2', 'B3']})
  16. right1 = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
  17. 'key2': ['K0', 'K0', 'K0', 'K0'],
  18. 'C': ['C0', 'C1', 'C2', 'C3'],
  19. 'D': ['D0', 'D1', 'D2', 'D3']})
  20. # how='inner'合并key1key2都相同的,how='outer'都合并,没有补nan
  21. res7 = pd.merge(left1, right1, on=['key1', 'key2'], how='inner')
  22. print(res7)
  23. # 以key为基准合并,但考虑相同索引可能背后意义不同,故予以分别显示、
  24. boys = pd.DataFrame({'K': ['K0', 'K1', 'K2'],
  25. 'age': [1, 2, 3]})
  26. girls = pd.DataFrame({'K': ['K0', 'K0', 'K3'],
  27. 'age': [4, 5, 6]})
  28. res9 = pd.merge(boys, girls, on='K', suffixes=['boy_age', 'girl_age'], how='inner')
  29. print(res9)

运行结果:

  1. 只有一个key, pd.merge(left, right, on=‘key’)
    在这里插入图片描述2)有2个key(key1,key2), pd.merge(left1, right1, on=[‘key1’, ‘key2’], how=‘inner’)
    how='inner'合并key1key2都相同的,how='outer'都合并,没有补nan
    在这里插入图片描述
  2. 按照行索引合并
    在这里插入图片描述
    补充:merge合并小技巧
    比如特征一个是以小时为粒度的,如天气预报,一个以15min为粒度,我们需要将两个特征合并,就需要对天气做扩充,merge的小技巧就是提取二者时间的小时,做合并,这样天气数据就会自动填充为15min
  1. left1 = pd.DataFrame({'time':['2021-01-02 00:00:00', '2021-01-02 00:15:00'],
  2. 'time_hour': ['2021-01-02 00', '2021-01-02 00'],
  3. 'pelec': [2,2.5]})
  4. right1 = pd.DataFrame({'time': ['2021-01-02 00:00:00'],
  5. 'time_hour': ['2021-01-02 00'],
  6. 'pelec': ['晴']})
  7. res7 = pd.merge(left1, right1, on=['time_hour'], how='inner')
  8. print(res7)

在这里插入图片描述

七、文件的存取


pandas文件存取作用
pd.read_excel(‘文件路径’)读取excel文件
pd.read_csv(‘文件路径’)读取csv文件
pd.read_pickle(‘文件路径’)读取pickle文件到pandas
df.to_csv(‘文件路径’)将df写到csv文件
data1.to_pickle(‘文件路径’)将df写到pickle

1)读取,第一行作为列名称
在这里插入图片描述
2)原文件没有列名称,自己指定列名称
在这里插入图片描述
3)指定原文件中的某一列做行索引
在这里插入图片描述 注意:修改index_col=['orange','m']可以生成多级行索引
4)若分割符不标准
有多个长度不等的空格分割,我们采用正则表达式
pa.read_t
在这里插入图片描述
在这里插入图片描述
6)保存文件:
index=False不写入行索引,header=None不写列标签,columns=['a','b']只写ab列,sep='|'以竖线分割
在这里插入图片描述
在这里插入图片描述

八、时间日期:

8.1 生成时间序列

时间日期在Pandas里的作用:

  • 分析金融股票交易数据
  • 分析服务器日志

pandas时间序列作用
pd.date_range(‘20191011’,periods=600,freq=‘s’)创建600个以秒为间隔的时间序列
s.resample(‘2Min’,how=‘sum’)对s序列进行每2min采样求和,返回新的pandas序列
pd.period_range(‘2000Q1’,‘2016Q1’,freq=‘Q’)以季度(3个月)为单位,生成的从2000q1到2016Q1的时间序列
pd.Timestamp(‘20160301’)-pd.Timedelta('days=5)计算5天前的日期

1) pd.date_range 生成时间戳时间序列
pandas生成时间序列,可作为DataFrame或Series的index
在这里插入图片描述
2)pd.period创建时期序列,及时期序列的频率转换
在这里插入图片描述

8.2 时间重采样

  • 高频——>低频:降采样,例:5Min股票交易数据转为日交易数据
  • 低频——>高频:升采样
  • 其他重采样:每周三(W-WED)转换为每周五(W-FRI)
重采样作用
s.to_period()将时间戳时间序列转换为时期的时间序列
pts.to_timestamp(how=‘end’)转为时间戳的时间序列
ts.resample(‘5min’,how=‘sum’,label=‘right’)将分钟采样变为5min采样,若不加label=‘right’,则标签为采样开始时间
ts.resample(‘5min’,how=‘ohlc’)返回列标签有——开盘价,最高价,最低价,收盘价
df.resample(‘A-DEC’).sum()重采样,以年为单位, 'A-DEC’以年为单位,12月为一年的结束
adf.resample(‘Q-DEC’).mean()重采样,以季度为单位
ts.resample(‘D’,fill_method=‘ffill’,limit=3)以周为单位,转为以天为单位,向前插值,最多前插三个
df=pd.read_csv(‘1.csv’,index_col=True,parse_dates=True)从文件中解析时间数据,parse_dates=True python会尽可能的解析时间日期
  1. 注意:降采样,一般要带上方法,如.sum,how='mean'
  2. 升采样要带上插值方法

在这里插入图片描述在这里插入图片描述

  1. """重采样"""
  2. """分钟股票交易数据"""
  3. ts=pd.Series(np.random.randint(0,50,60),index=pd.date_range('2016-4-25 09:30',periods=60,freq='T'))
  4. ///降采样
  5. ///1)1天一采变为5天采样
  6. ts.resample('5min',how='sum',label='right')
  7. ts.resample('5min',how='ohlc')
  8. ///2)"""将天改为月份重采样"""
  9. ts=pd.Series(np.random.randint(0,50,100),index=pd.date_range('2016-4-25',periods=100,freq='D'))
  10. //方法1:lambda函数
  11. ts.groupby(lambda x:x.month).sum()
  12. //方法2:将时间戳转为时期
  13. ts.groupby(ts.index.to_period('M')).sum()
  14. """升采样"""
  15. ///"""'W-FRI以周为单位,周五为一周的结束"""
  16. ts=pd.Series(np.random.randint(0,50,2),index=pd.date_range('2016-4-2',periods=2,freq='W-FRI'))
  17. ///以周为单位,转为以天为单位,向前插值,最多前插三个
  18. ts.resample('D',fill_method='ffill',limit=3)
  19. """其他重采样"""
  20. ///"""将每周五时间转为每周一"""
  21. ts.resample('W-MON',fill_method='ffill')

九、groupby分组计算

分组函数
df.groupby(索引列表).sum()列表分组
支持迭代for 组名, 组 in df.groupby(索引列表):
通过字典映射分组mapping = {‘a’:red, ‘b’:‘red’, ‘c’:blue, ‘d’:‘orange’, ‘e’:‘blue’},df.groupby(mapping, axis =1)
通过函数分组df.groupby(len)
多级索引通过索引级别分组df.groupby(level=, axis= )

在这里插入图片描述
在这里插入图片描述

十、聚合函数

1)内置聚合函数
上图中的.mean()就是聚合函数,此外还有

  • df.groupby().describe()# 包含所有内置函数结果
  • df.groupby().min()
  • df.groupby().max()
  • df.groupby().mean()
  • df.groupby().sum()

2)自定义聚合函数
在这里插入图片描述
3)应用多个聚合函数
在这里插入图片描述
4)不同列应用不同的聚合函数
在这里插入图片描述

5)将分组转换为和原来的df一样的格式(行索引相同)

调用groupby().transform(聚合函数)

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/887477
推荐阅读
相关标签
  

闽ICP备14008679号