? ? ? ? 今天学习课程第二节,进行如下记录。
? ? ? ? 1. 实现了图像转矩阵,理解了矩阵与图像的相关关系
? ? ? ? 2. 使用python实现了一些初步的操作,利用numpy画圆以及同心圆,求随机数等,对python代码有了熟练的使用,以及如何去绘制函数,实现了一些数学函数图像绘制
? ? ? ? 3. 数据清洗和特征选择。一般使用pandas处理数据,fuzztwuzzy、模糊查询与替换。首先要先进行数据预处理,找出数据中的异常值.
? ? ? ? 4. 实现了程序,环形路段车辆堵车模拟。
? ? ? ? 模型假设如下:
????????路面上有n辆车,以不同的速度向前行驶, 模拟堵车问题。 ????????有以下假设: ????????假设道路为环形封闭,即路面上的车不会少,也不会多,外面的车进不来,里面的也出不去。 ????????某辆车的当前速度是v。 ????????若前方可见范围内没车(即d>v),则它在下一秒的车速提高到v+1,直到达到规定的最高限速。 ????????若前方有车,前车的距离为d,若d < v,则它下一秒的车速降低到d-1 ,若d=v,则速度不变。 ????????每辆车会以概率p随机减速v-1。
具体代码如下:(代码转载于https://blog.csdn.net/weixin_44457930/article/details/115797612)
#!usr/bin/env python
# -*- coding:utf-8 -*-
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 对车辆的位移进行限制,当大于水平的公路长度时,则认为是该车进入了下一圈
def clip(x, path):
for i in range(len(x)):
if x[i] >= path:
x[i] %= path
if __name__ == "__main__":
# 文字转化
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
'''初始化定义'''
path = 5000 # 环形公路的长度
n = 100 # 公路中的车辆数目
v0 = 50 # 车辆的初始速度
p = 0.3 # 随机减速概率
Times = 1000 # 模拟时间
'''模拟车辆的位移和速度'''
np.random.seed(0)
# 模拟100辆车辆的位置
# np.random.rand(n)返回的是n个0-1之间均匀分布的随机数
x = np.random.rand(n) * path
# 根据车辆的位置进行排序,原地替换
x.sort()
# 将所有车辆的初速度定义为50,并设为float类型数据
v = np.tile([v0], n).astype(np.float)
'''画布大小'''
plt.figure(figsize=(8, 6))
'''模拟在时间范围内的堵车情况'''
for t in range(Times):
# 根据第t时刻每辆车的位置绘图
# x:车辆位置 [t]*n:时间,因为要保持横纵坐标的长度要相同
plt.scatter(x, [t] * n, s=1, c='b', alpha=0.05) # alpha表示点的透明度
'''计算每辆车第t时刻的速度和第t+1时刻的位置'''
for i in range(n):
# 计算前后车辆的距离
# 对于最后一辆车,即 x[n-1],它的前一辆车是 x[n]
# 但 x[n]会发生索引越界,因此使用 x[(i + 1) % n]代替 x[i+1]
if x[(i + 1) % n] > x[i]:
# 判断x[(i + 1) % n] > x[i],是为了判断前面的车是否已经进入下一圈
# 因为假定没有超车的情况发生,因此前面的车,永远在前面
d = x[(i + 1) % n] - x[i]
else:
d = x[(i + 1) % n] + path - x[i]
'''根据与前车的距离调整速度'''
if v[i] < d:
# v[i] < d 表示前方可见范围没车
# 若前方可见范围内没车,则它在下一秒的车速提高到v+1,直到达到规定的最高限速。
# 同时,每辆车会以概率p随机减速v-1。
if np.random.rand() > p:
v[i] += 1
else:
v[i] -= 1
elif v[i] > d:
# 若前方有车,前车的距离为d,且d < v,则它下一秒的车速降低到d-1 。
v[i] = d - 1
# 还有一种情况,若v[i] = d,则第 i 辆车的速度不做调整
# 限制速度,v<0,则将v定义为0;v>150,则将v定义为150
v = v.clip(0, 150)
# 车辆的位移在增加,车在往前开
x += v
# 调用clip,因为公路是环形封闭的,有些车已经进入下一圈了
clip(x, path)
'''限制坐标轴'''
# 对x轴的坐标进行限制
plt.xlim(0, path)
# 对y轴坐标进行限制
plt.ylim(0, Times)
'''标签'''
# 后面字符串以 Unicode 格式进行编码,一般用在中文字符串前面,
# 防止因为源码储存格式问题,导致再次使用时出现乱码。
# Python2.7需要在中文字符串前面加u,否则报错,Python3.X不需要
plt.xlabel(u'车辆位置', fontsize=16) # fontsize表示字体大小
plt.ylabel(u'模拟时间', fontsize=16)
plt.title(u'环形公路车辆堵车模拟', fontsize=20)
'''自动调整子图参数,使之填充整个图像区域'''
plt.tight_layout(pad=2)
'''画图'''
plt.show()
做如下几个测试用例:
(1)当随即减速概率为默认的0.3时,预测情况如下:
可以看出,时间刚开始时,堵车会比较频繁,而车辆位置越在后面,其堵车的频率也更为频繁。
(2)当设置p=0.15时?
可以看到,此时随着时间增加,车流量趋于平稳
(3)设置p=0.6时:
?
?5. 实现机器学习数据清洗
#!/usr/bin/python
# -*- encoding: utf-8
import numpy as np
import pandas as pd
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
def enum_row(row):
print(row['state'])
def find_state_code(row):
if row['state'] != 0:
print(process.extractOne(row['state'], states, score_cutoff=80))
def capital(str):
return str.capitalize()
def correct_state(row):
if row['state'] != 0:
state = process.extractOne(row['state'], states, score_cutoff=80)
if state:
state_name = state[0]
return ' '.join(map(capital, state_name.split(' ')))
return row['state']
def fill_state_code(row):
if row['state'] != 0:
state = process.extractOne(row['state'], states, score_cutoff=80)
if state:
state_name = state[0]
return state_to_code[state_name]
return ''
if __name__ == "__main__":
pd.set_option('display.width', 200)
pd.set_option('display.max_columns',200)
data = pd.read_excel('.\\sales.xlsx', sheet_name='sheet1', header=0)
print('data.head() = \n', data.head())#输出前五行
print('data.tail() = \n', data.tail())#输出后五行
print('data.dtypes = \n', data.dtypes)#输出每一列对应的是什么东西
print('data.columns = \n', data.columns)
for c in data.columns:
print(c, end=' ')
print()
data['total'] = data['Jan'] + data['Feb'] + data['Mar']
print(data.head())
print(data['Jan'].sum())
print(data['Jan'].min())
print(data['Jan'].max())
print(data['Jan'].mean())
print('=============')
# 添加一行
s1 = data[['Jan', 'Feb', 'Mar', 'total']].sum()
print(s1)
s2 = pd.DataFrame(data=s1)
print(s2)
print(s2.T)#转成一行
print(s2.T.reindex(columns=data.columns))
# 即:
s = pd.DataFrame(data=data[['Jan', 'Feb', 'Mar', 'total']].sum()).T
s = s.reindex(columns=data.columns, fill_value=0)
print(s)
data = data.append(s, ignore_index=True)
data = data.rename(index={15:'Total'})
print(data.tail())
# apply的使用
print('==============apply的使用==========')
data.apply(enum_row, axis=1)#每一行遍历出来,进行枚举
#简称
state_to_code = {"VERMONT": "VT", "GEORGIA": "GA", "IOWA": "IA", "Armed Forces Pacific": "AP", "GUAM": "GU",
"KANSAS": "KS", "FLORIDA": "FL", "AMERICAN SAMOA": "AS", "NORTH CAROLINA": "NC", "HAWAII": "HI",
"NEW YORK": "NY", "CALIFORNIA": "CA", "ALABAMA": "AL", "IDAHO": "ID",
"FEDERATED STATES OF MICRONESIA": "FM",
"Armed Forces Americas": "AA", "DELAWARE": "DE", "ALASKA": "AK", "ILLINOIS": "IL",
"Armed Forces Africa": "AE", "SOUTH DAKOTA": "SD", "CONNECTICUT": "CT", "MONTANA": "MT",
"MASSACHUSETTS": "MA",
"PUERTO RICO": "PR", "Armed Forces Canada": "AE", "NEW HAMPSHIRE": "NH", "MARYLAND": "MD",
"NEW MEXICO": "NM",
"MISSISSIPPI": "MS", "TENNESSEE": "TN", "PALAU": "PW", "COLORADO": "CO",
"Armed Forces Middle East": "AE",
"NEW JERSEY": "NJ", "UTAH": "UT", "MICHIGAN": "MI", "WEST VIRGINIA": "WV", "WASHINGTON": "WA",
"MINNESOTA": "MN", "OREGON": "OR", "VIRGINIA": "VA", "VIRGIN ISLANDS": "VI",
"MARSHALL ISLANDS": "MH",
"WYOMING": "WY", "OHIO": "OH", "SOUTH CAROLINA": "SC", "INDIANA": "IN", "NEVADA": "NV",
"LOUISIANA": "LA",
"NORTHERN MARIANA ISLANDS": "MP", "NEBRASKA": "NE", "ARIZONA": "AZ", "WISCONSIN": "WI",
"NORTH DAKOTA": "ND",
"Armed Forces Europe": "AE", "PENNSYLVANIA": "PA", "OKLAHOMA": "OK", "KENTUCKY": "KY",
"RHODE ISLAND": "RI",
"DISTRICT OF COLUMBIA": "DC", "ARKANSAS": "AR", "MISSOURI": "MO", "TEXAS": "TX", "MAINE": "ME"}
states = list(state_to_code.keys())
print(fuzz.ratio('Python Package', 'PythonPackage'))#两个字符串的相似度
print(process.extract('Mississippi', states))
print(process.extract('Mississipi', states, limit=1))#输出一个结果
print(process.extractOne('Mississipi', states))
data.apply(find_state_code, axis=1)
print('Before Correct State:\n', data['state'])
data['state'] = data.apply(correct_state, axis=1)
print('After Correct State:\n', data['state'])
data.insert(5, 'State Code', np.nan)
data['State Code'] = data.apply(fill_state_code, axis=1)
print(data)
# group by
print('==============group by================')
print(data.groupby('State Code'))
print('All Columns:\n')
print(data.groupby('State Code').sum())
print('Short Columns:\n')
print(data[['State Code', 'Jan', 'Feb', 'Mar', 'total']].groupby('State Code').sum())
# 写入文件
data.to_excel('sales_result.xls', sheet_name='Sheet1', index=False)
的程序,可以用pandas对数据进行统计
|