java 单机接口限流处理方案
451
2022-08-27
python数据分析与挖掘笔记(从零开始学python数据分析与挖掘 pdf)
参考书
1 数据分析与挖掘区别
从定义说明:数据分析采用统计学方法,对获取的数据进行描述性和探索性分析,并从分析结论中发现数据间存在的价值,价值大多通过图的形式呈现。数据挖掘则是采用统计学,机器学习,人工智能的方法,对获取的数据,进行提炼、转化(类似于赌石),从数据中发掘出表象看不到的价值和规律从工作侧重点:数据分析更侧重于实际业务,贴合业务展开分析工作,而数据挖掘更侧重于技术,通过更前进更换的算法,去提炼出更有价值的东西从输出结果出来:数据分析更多是统计描述的呈现,比如总体样本的趋势。数据挖掘更多是模型和规则的输出
2 数据挖掘流程
3 python基础知识
数据结构及方法
列表
列表索引:正向索引、负向索引、切片索引、无限索引列表操作:元素增加:append、extend、insert
list=[1,10,100,1000,10000]#append 在末尾添加数字list.append(2)print(list)out:[1,10,100,1000,10000,2]#extend在末尾添加多个元素list.extend([20,200,2000,20000])print(list)out:[1,10,100,1000,10000,20,200,2000,20000]#insert在指定位置插入新值list.insert(2,11)print(list)out:[1,10,11,100,1000,10000]
元素删除:pop、remove、clear
list=[1,10,11,100,1000,10000]#pop默认删末尾元素,也可以指定位置删除list.pop()print(list)out:[1,10,11,100,1000]list.pop(2)print(list)out:[1,10,100,1000,10000]#remove删除指定值,但只能删除列表中第一次出现指定值list.remove(11)print(list)out:[1,10,100,1000,10000]#clear清空列表list.clear()print(list)out:[]
列表计数、查询位置、逆转、排序
list=[7,3,9,11,4,6,10,3,7,4,4,3,6,3]#计算列表元素3的个数print(list.count(3))#找出元素6所在位置print(list.index(6))#元素颠倒print(list.reverse())#列表元素降序print(list.sort(reverse=True))
元组
元组与列表操作类似,但最大区别是元组是一种不变的类型的数据结构,简单说元组不能实现元素删除,修改,插入,但可以删除整个元组
字典
字典操作字典元素增加:setdefault、update和键索引
dict={'姓名':'张三','年龄':33,'性别':'男','子女':{'儿子':'张四','女儿':'张美'},'兴趣':{'踢球','游泳','唱歌'}}#增加元素dict.setdefault('户籍','合肥')dict.update(('学历':'硕士'))dict['身高']=178
字典元素删除:pop、popitem、clear
#删除指定值dict.pop('户籍')dict['子女'].pop('女儿')#删除字典中任意的一个元素dict.popitem()#清空元素dict.clear()
字典其他方法:get(),keys(),values(),items()
#get从字典中取出键对应的值print(dict.get('年龄'))#keys取出所有键print(dict.keys())#values取出字典所有值print(dict.values())#items取出所有值对print(dict.items())
字符串处理方法
字符串的常用方法
方法 | 使用说明 |
string[start: end :step] | 字符串的切片 |
string.split | 字符串分割 |
string.strip | 删除首尾空白 |
string.rstrip | 删除字符串右边空白 |
string.lstrip | 删除字符串左边空白 |
string.index | 返回子串首次出现的位置 |
string.replace | 字符串替换 |
sep.join | 将可迭代对象按sep分割符拼接为字符串 |
string.count | 对字符串 的子串计数 |
string.find | 返回子串首次出现位置 |
string.startwith | 字符串是否以什么开头 |
string.endwith | 字符串是否以什么结尾 |
正则表达式
符号 | 含义 | 示例 |
. | 可以匹配任意字符,但不包含换行符’\n’ | pyt.on~python |
\ | 转义符,一般用于保留字符中特殊元字符 | 10\ .3~10 .3 |
丨 | 逻辑或 | 人a丨A~人a或者人A |
[] | 用于匹配一组字符 | m[aA]n~man或者mAn |
\d与\D | \d匹配任意数字,\D代表非\d | 今天\d号~今天3号 |
\s与\S | \s匹配任意空白字符,\S代表非\s | 你\s好~你 好 |
\w与\W | \w匹配字母数字和下划线,\W代表非\w | p\wy~pay |
* | 匹配前一个字0到无穷次 | OK*~O或者OK或者OKK |
+ | 匹配前一个字符1到无穷次 | OK+~OK或者OKK |
? | 匹配前一个字符0到1次 | OK?~0或者OK |
{m} | 匹配前一个字符m次 | OK{3}~OKKK |
{m,n} | 匹配前一个字符m到n次 | OK{1,2}~OK或者OKK |
(.*?) | 用于分组,默认返回括号内匹配内容 |
匹配查询函数findall(pattern,string,flags=0),获取字符串所有匹配的子串,并返回一个列表结果匹配替换函数sub(pattern,rel,string,count=0,flags=0),该函数根据正则表达式把满足匹配的内容替换为repl匹配分割函数split(pattern,string,maxsplit=0,flags=0),按照指定正则表达式分隔字符
自定义函数
自定义函数可变参数(*args,**kwargs)
*args:可以接纳任意多个实参,接受多个实参,进行捆绑,并组装到元组中 **kwargs:可以把多个实参指定给各自的实参名
def adds(*args): print(args) s=sum(args) return(s)print('和为%d'%adds(10,13,7,8,2))def info_collection(tel,birthday,**kwargs): user_info={} user_info['tel']=tel user_info[birthday]=birthday user_info.update(kwargs) return(user_info) info_collection(1214,'1990-11-11',nickname='yewe',gender='nan')
区别*args是用来发送一个非键值对的可变数量的参数列表给一个函数,**kwargs将不定长度的键值对,作为参数传递给一个函数
应用爬虫案例
项目目的为了获取城市的历史天气数据。字段包含日期、最低气温、最高气温、风向、风力、天气状况、空气质量指标值、空气质量等级和空气质量说明
# 导入第三方包import requestsimport timeimport randomimport pandas as pdimport re# 生成请求头headers = {'Accept':'*/*','Accept-Encoding':'gzip, deflate','Accept-Language':'zh-CN,zh;q=0.9','Connection':'keep-alive','Cookie':'widget_dz_id=54511; widget_dz_cityValues=,; timeerror=1; defaultCityID=54511; defaultCityName=%u5317%u4EAC; Hm_lvt_a3f2879f6b3620a363bec646b7a8bcdd=1516245199; Hm_lpvt_a3f2879f6b3620a363bec646b7a8bcdd=1516245199; addFavorite=clicked','User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3236.0 Safari/537.36'}# 生成所有需要抓取的链接urls = []for year in range(2011,2018): for month in range(1,13): if year <= 2016: urls.append('%(year,month)) else: if month<10: urls.append('%(year,month,year,month)) else: urls.append('%(year,month,year,month))urls# 循环并通过正则匹配获取相关数据info = []for url in urls: seconds = random.randint(3,6) response = requests.get(url, headers = headers).text ymd = re.findall("ymd:'(.*?)',",response) high = re.findall("bWendu:'(.*?)℃',",response) low = re.findall("yWendu:'(.*?)℃',",response) tianqi = re.findall("tianqi:'(.*?)',",response) fengxiang = re.findall("fengxiang:'(.*?)',",response) fengli = re.findall(",fengli:'(.*?)'",response) aqi = re.findall("aqi:'(.*?)',",response) aqiInfo = re.findall("aqiInfo:'(.*?)',",response) aqiLevel = re.findall(",aqiLevel:'(.*?)'",response) # 由于2011~2015没有空气质量相关的数据,故需要分开处理 if len(aqi) == 0: aqi = None aqiInfo = None aqiLevel = None info.append(pd.DataFrame({'ymd':ymd,'high':high,'low':low,'tianqi':tianqi,'fengxiang':fengxiang,'fengli':fengli,'aqi':aqi,'aqiInfo':aqiInfo,'aqiLevel':aqiLevel})) else: info.append(pd.DataFrame({'ymd':ymd,'high':high,'low':low,'tianqi':tianqi,'fengxiang':fengxiang,'fengli':fengli,'aqi':aqi,'aqiInfo':aqiInfo,'aqiLevel':aqiLevel})) time.sleep(seconds)# 生成数据表weather = pd.concat(info)# 数据导出weather.to_csv('weather.csv',index = False)
4.python数值计算工具-numpy
数组获取[rows,cols]
数据常用属性
在numpy模块汇总,可以通过genfromtxt函数读取外部文本文件数据
# 读入数据stu_score = np.genfromtxt(fname = r'C:\Users\Administrator\Desktop\stu_socre.txt',delimiter='\t',skip_header=1)# 查看数据结构print(type(stu_score))# 查看数据维数print(stu_score.ndim)# 查看数据行列数print(stu_score.shape)# 查看数组元素的数据类型print(stu_score.dtype)# 查看数组元素个数print(stu_score.size)
数组的形状处理
方法:reshape、resize、ravel、flatten、vstack、hstack、row_stack、column_stack reshape、resize都是对数组进行形状改变 reshape的改变只是预览,没有直接改变数组形状 resize方法不会返回预览,而是直接改变数组形状
如果需要将多维数组降维一维数组,利用ravel、flatten、reshape三种方法
arr4 = np.array([[1,10,100],[2,20,200],[3,30,300]])print('原数组:\n',arr4)# 默认排序降维print('数组降维:\n',arr4.ravel())print(arr4.flatten())print(arr4.reshape(-1))# 改变排序模式的降维print(arr4.ravel(order = 'F'))print(arr4.flatten(order = 'F'))print(arr4.reshape(-1, order = 'F'))
vstack,row_stack纵向堆叠数组 hstack,column_stack横向堆叠数组
线性代数相关计算
函数 | 说明 |
np.zeros | 生成零矩阵 |
np.eyes | 生成单位矩阵 |
np.dot | 数组点积 |
np.diag | 矩阵主对角线与一维数组间的转化 |
np.ones | 生成所有元素为1矩阵 |
np.transpose | 矩阵转置 |
np.inner | 计算两个数组内积 |
np.trace | 矩阵主对角线元素的和 |
np.linalg.det | 计算矩阵行列式 |
np.linalg.eig | 计算矩阵特征根与特征向量 |
np.linalg.eigvals | 计算方阵特征根 |
np.linalg.inv | 方阵逆 |
np.linalg.pinv | 计算伪逆 |
np.linalg.solve | 计算Ax=b的线性方程组的解 |
np.linalg.lstsq | 计算Ax=b的最小二乘解 |
np.linalg.qr | QR分解 |
np.linalg.svd | 奇异值分解 |
np.linalg.norm | 计算向量或矩阵的范数 |
python数据处理工具-pandas
pandas对应的数据构造和数据读取这里不再阐述
数据类型转换及描述统计
通常拿到数据后,观看数据的shape以及的dtypes 修改数据类型,数值类型修改,时间类型修改 对数值类型数据进行统计描述,对离散型数据进行统计描述
# 数据类型转换及描述统计# 数据读取sec_cars = pd.read_table(r'C:\Users\Administrator\Desktop\sec_cars.csv', sep = ',')# 预览数据的前五行sec_cars.head()# 查看数据的行列数print('数据集的行列数:\n',sec_cars.shape)# 查看数据集每个变量的数据类型print('各变量的数据类型:\n',sec_cars.dtypes)# 修改二手车上牌时间的数据类型sec_cars.Boarding_time = pd.to_datetime(sec_cars.Boarding_time, format = '%Y年%m月')# 修改二手车新车价格的数据类型sec_cars.New_price = sec_cars.New_price.str[:-1].astype('float')# 重新查看各变量数据类型sec_cars.dtypes# 数据的描述性统计sec_cars.describe()# 数据的形状特征# 挑出所有数值型变量num_variables = sec_cars.columns[sec_cars.dtypes !='object'][1:]# 自定义函数,计算偏度和峰度def skew_kurt(x): skewness = x.skew() kurtsis = x.kurt() # 返回偏度值和峰度值 return pd.Series([skewness,kurtsis], index = ['Skew','Kurt'])# 运用apply方法sec_cars[num_variables].apply(func = skew_kurt, axis = 0)# 离散型变量的统计描述sec_cars.describe(include = ['object'])# 离散变量频次统计Freq = sec_cars.Discharge.value_counts()Freq_ratio = Freq/sec_cars.shape[0]Freq_df = pd.DataFrame({'Freq':Freq,'Freq_ratio':Freq_ratio})Freq_df.head()# 将行索引重设为变量Freq_df.reset_index(inplace = True)Freq_df.head()
字符与日期数据的处理
改变出生日期birthday和手机号tel两个字段的数据类型根据出生日期birthday和开始工作日期start_work两个字段新增年龄和工龄两个字段将手机号tel的中间四位隐藏根据邮箱信息新增邮箱域名字段基于other字段取出每个人员的专业信息
# 数据读入df = pd.read_excel(r'C:\Users\Administrator\Desktop\data_test03.xlsx')# 各变量数据类型print(df.dtypes)# 将birthday变量转换为日期型df.birthday = pd.to_datetime(df.birthday, format = '%Y/%m/%d')# 将手机号转换为字符串df.tel = df.tel.astype('str')# 新增年龄和工龄两列df['age'] = pd.datetime.today().year - df.birthday.dt.yeardf['workage'] = pd.datetime.today().year - df.start_work.dt.year# 将手机号中间四位隐藏起来df.tel = df.tel.apply(func = lambda x : x.replace(x[3:7], '****'))# 取出邮箱的域名df['email_domain'] = df.email.apply(func = lambda x : x.split('@')[1])# 取出用户的专业信息df['profession'] = df.other.str.findall('专业:(.*?),')# 去除birthday、start_work和other变量df.drop(['birthday','start_work','other'], axis = 1, inplace = True)df.head()
# 常用日期处理方法dates = pd.to_datetime(pd.Series(['1989-8-18 13:14:55','1995-2-16']), format = '%Y-%m-%d %H:%M:%S')print('返回日期值:\n',dates.dt.date)print('返回季度:\n',dates.dt.quarter)print('返回几点钟:\n',dates.dt.hour)print('返回年中的天:\n',dates.dt.dayofyear)print('返回年中的周:\n',dates.dt.weekofyear)print('返回星期几的名称:\n',dates.dt.weekday_name)print('返回月份的天数:\n',dates.dt.days_in_month)
数据清洗方法
重复观测处理
df.drop_duplicates(inplace=True)
缺失值处理
当遇到缺失值NaN表示时,采用三种方法处置:
替换法:均值、中位数替换删除法:当缺失数据比例在5%以内插补法:回归插补法、K近邻插补、拉格朗日插补
# 数据读入df = pd.read_excel(r'C:\Users\Administrator\Desktop\data_test05.xlsx')# 缺失观测的检测print('数据集中是否存在缺失值:\n',any(df.isnull()))# 删除法之记录删除df.dropna()# 删除法之变量删除df.drop('age', axis = 1)# 替换法之前向替换df.fillna(method = 'ffill')# 替换法之后向替换df.fillna(method = 'bfill')# 替换法之常数替换df.fillna(value = 0)# 替换法之统计值替换df.fillna(value = {'gender':df.gender.mode()[0], 'age':df.age.mean(), 'income':df.income.median()})
异常值处理
对于异常值检测,采用两种方法:
数据子集获取
iloc、loc、ix(它们的语法可以表示成[row_select,cols_select])
name | gender | age | |
0 | 张三 | 男 | 23 |
1 | 李四 | 女 | 25 |
2 | 王二 | 女 | 23 |
3 | 丁一 | 女 | 21 |
4 | 李五 | 男 | 20 |
df1=pd.DataFrame({'name':['张三','李四','王二','丁一','李五'], 'gender':['男','女','女','女','男'], 'age':[23,25,23,21,20],columns=['name','gender','age']})df1.iloc[1:4,[0,2]]df1.loc[1:3,['name','age']]df1.ix[1:3,[0,2]]
name | age | |
1 | 李四 | 25 |
2 | 王二 | 23 |
3 | 丁一 | 21 |
透视表功能
生成透视表函数
pd.pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',fill_value=None,margins=False,dropna=True,margins_name='All')
data:指定需要构造透视表的数据集 values:指定需要拉入的数值的字段列表index:指定拉入的行标签的字段列表columns:指定拉入列标签的字段列表aggfunc:指定数值统计函数fill_value:指定一个标量。用于填充缺失值margins:bool类型参数,是否需要显示行或列的总计值dropna:bool参数,是否需要删除整列缺失字段margins_name:指定行或列的总计名称
挖掘算法实践
线性回归模型
一元线性回归模型
import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns# 导入数据集income = pd.read_csv(r'C:\Users\Administrator\Desktop\Salary_Data.csv')# 绘制散点图sns.lmplot(x = 'YearsExperience', y = 'Salary', data = income, ci = None)# 显示图形plt.show()# 简单线性回归模型的参数求解# 样本量n = income.shape[0]# 计算自变量、因变量、自变量平方、自变量与因变量乘积的和sum_x = income.YearsExperience.sum()sum_y = income.Salary.sum()sum_x2 = income.YearsExperience.pow(2).sum()xy = income.YearsExperience * income.Salarysum_xy = xy.sum()# 根据公式计算回归模型的参数b = (sum_xy-sum_x*sum_y/n)/(sum_x2-sum_x**2/n)a = income.Salary.mean()-b*income.YearsExperience.mean()# 打印出计算结果print('回归参数a的值:',a)print('回归参数b的值:',b)# 导入第三方模块import statsmodels.api as sm# 利用收入数据集,构建回归模型fit = sm.formula.ols('Salary ~ YearsExperience', data = income).fit()# 返回模型的参数值fit.params
多元线性回归模型
回归模型的假设检验
模型的显著性检验-F检验1.提出假设
KNN模型应用
算法思想:
确定未知样本近邻的个数k值根据某种度量样本间相似度的指标(如欧式距离)将每个未知类别的样本的最近k个已知样本搜寻出来,形成一个个簇对搜寻出来的已知样本进行投票,将各簇下类别最多的分类用作未知样本点的预测
最佳k值选择:
设置k近邻样本投票权重采用多重交叉验证,将选择k个不同的值,在每种值下执行m重交叉验证,最后选出平均误差最小的k值
相似度度量方法
朴素贝叶斯模型
SVM模型应用
GBDT模型应用
待更新。。。。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~