如何系统的学习python 中有关数据分析和挖掘相关的库?
什么是系统的学习?系统的学习就是一个先搭建只是框架体系,然后不断填充知识看,不断更新迭代的过程。
Pandas,numpy,scipy,matplotlip,scikit-learn 就是知识框架体系中必备部分:
pandas 用来做数据处理,
numpy 用来做高纬度矩阵运算,
scipy 用来做科学计算,
matplotilib 用来做数据可视化,
scikit-learn 用来做数据挖掘与机器学习,它已经
覆盖了基本的算法,只需要调用即可,
上面这几个库也就搭建了做数据分析和挖掘的经典workflow;
拿到数据之后先做一个数据预处理(pandas + numpy+scipy)
接着会要对数据包含的特征做一些可视化输出(matplotlid)
之后需要提前特征和建模调参(numpy+scikit-learn),
有了模型与结果,最后归纳整理做presenttation 和report.
但目前数据挖掘竞赛比较火的技巧是模型融合 ,可以对很多模型进行融合,并且可以选择不同的模型融合方式
https://zhuanlan.zhihu.com/p/25836678
df == 任意的pandas DataFrame 数据框对象
s === 任意的pandans Series 数组的对象
pandas 和numpy 是Python做数据分析最基础且最核心的库
# 一 Pandas 数据存取********************
import pandas as pd
import numpy as np
"""
读取文件:从文件名、URL、文件对象中加载数据
数据的导入
pd.read_csv(filename) #导入csv格式文件中的数据 默认分隔符为逗号
pd.read_table(filename) # 导入有分隔符的文件(如TSY)中的数据 默认分隔符为\t(横向)
pd.read_excel #导入读取excel文件中的数据
pd.read_sql(query,connection_object) #导入SQL 数据表/数据框中的数据
pd.read_json(json_string) #导入JSON格式的字符,URL地址或者文件中的数据
pd.read_html(url) #导入经过解析的RUL地址中包含的数据框(DataFrame)数据
pd.read_clipboard() #导入系统粘贴板里面的数据
pd.DataFrame(dict) #导入python 字典(dict)里面的数据,其中key 是数据框的表头,value是数据框的内容
更 多格式,通过在ipython中输入pd.read_*? 查看
读取文件函数主要参数:
sep 指定分隔符,可用正则表达式如’\s+’
header=None 指定文件无列名,默认列名失效
names 指定列名 原文件无列名时,可通过这种方式指定,比如: names=[‘username’, ‘phone’, ‘email’]
index_col 指定某列作为索引 比如 index_col = 0 指定0列为索引
skip_row 指定跳过某些行
na_values 指定某些字符串表示缺失值,比如 na_values=[‘None’, ‘null’] 将这些字符串作为NaN
parse_dates 指定某些列是否被解析为日期,布尔值或列表
数据的导出
df.to_csv(filename) #将数据框(DataFrame)中的数据导入csv格式的文件中
df.to_excel(filename) #将数据框(DataFrame)中的数据导入Excel 格式的文件中
df.to_sql(table_name,connection_object) #将数据框(DataFrame)中的数据导入SQL数据表/数据库中
df.to_josn(filename) #将数据框(DataFrame)中的数据导入JSON 格式的文件中
---------------------
python \r \t \n 各种转义字符[转]
\(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\’ | 单引号 |
\” | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数yy代表的字符,例如:\o12代表换行 |
\xyy | 十进制数yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |
"""
# pandas 可以存取多种介质类型的数据,例如 内存,文本,CSV,JSON,HTML,Excel,HDF5.SQL
# 1 读取数据相关的参数介绍
# 如果数据有中文,编码可以修改,默认是ascii,改为utf-8
# 写入不修改编码则读取时需要修改
# df.to_csv(
# "xx.csv",# 存入数据
# index=False,# 不存储行索引
# header=False # 不存储列索引
# encoding = "utf-8"
# )
# 2 读取CSV,文件内汉字等特殊符号时,csv 文件变为应为 utf-8(无BOM)可默认正常读取
# 如果编码为ANSI ,加参数 enconding="gbk",
# 数据内有逗号时,左右加应为半角双引号,可以正常解析
#
# pd.read_csv(
# "xxx.csv",#文件名
# sep = ",", #指定分隔符,csv 默认逗号,如果是table表格数据一般为 \t(横向制表符)
# usecols=[0,2,4], #读取指定的列
# nrows = 10, #读取前几行
# header = None,#不将第一行设为表头
# names = ["a","dd"], #不使用csv 表头,自定义表头
# encoding = "utf-8" #编码,需要根据文本编码修改,默认是utf-8,可以指定为GBK/ascii
# )
# 3合并时间列及自定义某列为行索引==的具体 解析 parse_dates={"date_time":["data","time"]
# files = pd.read_csv(r"C:\Users\WY\Desktop\student2.csv")
# print(files)
# data time name age
# 0 20100101 10000 张三 18
# 1 20100101 230000 李,四 28
files1 = pd.read_csv(r"C:\Users\WY\Desktop\student2.csv",
parse_dates={"date_time":["data","time"]}, #合并两列 然后重新命名
)
# print(files1)
# date_time name age
# 0 2010-01-01 01:00:00 张三 18
# 1 2010-01-01 23:00:00 李,四 28
files2 = pd.read_csv(r"C:\Users\WY\Desktop\student2.csv",
parse_dates={"date_time":["data","time"]}, #合并两列 然后重新命名
index_col="date_time" #把这列设置为行索引 代替自动生成的数字 0 1 2(必须是这个date_time)
)
# print(files2)
# name age
# date_time
# 2010-01-01 01:00:00 张三 18
# 2010-01-01 23:00:00 李,四 28
# 4 Pandas 存取HDF5 暂时放置不太懂 ?????????????????
# 有中文,存储变得很大 很大啊
# files3 = pd.DataFrame.to_hdf(r"C:\Users\WY\Desktop\student2.h5",'w') #???
# files3 = pd.read_hdf(r"C:\Users\WY\Desktop\student2.h5",key='files3')
# print(files3)
# 5 pandas 存取Excel(xlsx)
# 5-1 读取Excel 数据
# na_values 指定某些字符串表示缺失值,比如 na_values=[‘None’, ‘null’] 将这些字符串作为NaN
files4 = pd.read_excel(r"C:\Users\WY\Desktop\111.xlsx",
"Sheet1",index_col=None,na_values=["NA"],header=None #不将第一行设为表头(此时这是列索引)
)
# print("file4",files4)
# file4 0 1
# 0 组长 王小1
# 1 组长 王小2
# 2 组长 王小3
# 以下是练习 详情去看我自己的博客关于查询的方法 冒号: 相当于行的取值
# data = files4[[0,1]] #取值前2列
# data = files4.loc[:,[0,1]] #取值前2列(标签索引)
# data = files4.iloc[:,[0,1]] #取值前2列(位置索引)
# data = files4.loc[:,0] #取值前1列
# data = files4.loc[0] #第一行的数据
# 5-2 写入Excel文件 会 把原文件福覆盖
# 需求以上取值所有人的名字
data = files4[[0]] #取第二列 另外还有两种方法
# print(data)
data.to_excel(
r"C:\Users\WY\Desktop\222.xlsx",
"Sheet1",
header=False,
index=False #不存入行索引,列索引为index_col
)
# 6 pandas 存取JSON数据
# 读取JSON
# pd.read_json("XX.json")
# 存入JSON
# data.to_json("xx.josn")
# 7pandas 从剪贴板(内存)读取数据(当你想要剪切板中复制后的东西 这个就可以打印出来了)
# 多用于将网页内容转换为 DataFrame
# data = pd.read_clipboard(header=None)
# print(data)
# 8 pandas 可以直接从数据库总写入或读取DataFrame 数据
# 方法
# pd.read_sql() 查询数据库,返回DataFrame d对象数据
# pd.to_sql() 将DataFrame 对象数据插入数据库
# 注意:to_sql() 直接调用 INSERT 语句完成任务,因此数据数据的传输速度较慢,如果将一个大型
# DataFrame 数据写入数据库中,最好先导出CSV 文件然后再导入数据库中
"""
# 以下是复制过来连接数据库的
from sqlalchemy import create_engine
# 连接MySQL数据库,需要安装Python连接库
# conda install -c anaconda pymysql
dbconnect = 'pymysql' # MySQL连接库,根据使用的连接库修改名称,这里用pymysql
dbname = 'aaa' # 数据库名
dbusername = 'root' # 数据库用户名
dbpwd = 'root' # 数据库密码
# 连接数据库
conn = create_engine('mysql+' + dbconnect + '://' + dbusername + ':' + dbpwd + '@localhost:3306/' + dbname + '?charset=utf8')
# 存取数据库数据
# 查询数据库
sql1 = 'SELECT * FROM ccc'
df1 = pd.read_sql( # pd.io.sql.read_sql()的快捷方式
sql1, # sql语句
conn, # 数据库连接
index_col='id' # 选定某列做行索引,可选
)
df1
# 插入数据库
a
pd.io.sql.to_sql(
a, # 插入的数据,注意格结构应和MySQL表一致
'ccc', # 表名
con=conn, # 数据库连接
if_exists='append', # 注释见下
index=False # 不将列索引插入数据库中,否则会出错
"""
# 二 Pandas 统计分析 ********************
# pandas 数据的基本统计分析和numpy 的函数近似
"""
numpy.random.rand(a,dn) 函数根据给定维度生成[0,a)之间的数据,包含0,不包含a
dn表格每个维度 (几行)
返回值为指定维度的array
"""
dates = pd.date_range("20180927",periods=10) #获取最近10天的日期时间
# print(dates)
# DatetimeIndex(['2018-09-27', '2018-09-28', '2018-09-29', '2018-09-30',
# '2018-10-01', '2018-10-02', '2018-10-03', '2018-10-04',
# '2018-10-05', '2018-10-06'],
# dtype='datetime64[ns]', freq='D')
df = pd.DataFrame(np.random.randn(10,5),index=dates,columns=["a","b","c","d","e"])
# print(df) #随机生成0,10 之间的数据 但是以下 好像不是??????????
# a b c d e
# 2018-09-27 -0.258745 0.037599 0.721864 -0.211030 -1.059286
# 2018-09-28 -0.054321 1.128499 1.655691 0.224175 -0.772732
# 2018-09-29 -1.268385 0.432739 -1.279300 -1.473420 -1.611057
# 2018-09-30 -0.671130 0.432911 -0.471831 0.366561 -0.102837
# 2018-10-01 1.489147 0.195784 0.129284 -0.519119 -0.652858
# 2018-10-02 -0.525051 -0.147583 -0.393632 -0.607596 1.015660
# 2018-10-03 0.628974 -0.846290 -1.531452 1.029872 -1.886281
# 2018-10-04 -0.268511 -0.179644 -1.006786 0.468539 1.254019
# 2018-10-05 -0.349232 0.006306 -0.017473 0.978961 -0.101312
# 2018-10-06 -0.011932 -0.659007 -1.271695 -0.719069 0.232689
# print(df.describe()) #快速统计结果
# print(df.mean())#按列求平均值
# print(df.mean(1)) #按行求平均值
# ==
a1 = pd.Series([2,3,4,5],index=["a","b","c","d"])
# print(a1)
# a 2
# b 3
# c 4
# d 5
# dtype: int64
# b1 = pd.DataFrame(np.arange(4).reshape(1.4),index=["A","B","C","D"])
b1 = pd.DataFrame(np.arange(20).reshape(4,5),index=["A","B","C","D"])
# print(b1)
# 0 1 2 3 4
# A 0 1 2 3 4
# B 5 6 7 8 9
# C 10 11 12 13 14
# D 15 16 17 18 19
# print(a1.describe(),type(a1.describe()))
# count 4.000000
# mean 3.500000
# std 1.290994
# min 2.000000
# 25% 2.750000
# 50% 3.500000
# 75% 4.250000
# max 5.000000
# dtype: float64 <class 'pandas.core.series.Series'>
# print(a1.describe()["mean"]) #3.5
# 返回横行的数据 ????????????
# print(b1.describe().loc["min"])
# print(b1.describe().loc[3])
#返回横行数据,series
# b.describe().loc['max']
# b.describe().iloc[7]
#
# #返回一列值,这里第2列
# b.describe()[2]
# #b.describe()[2]
# b.describe().loc[:,2]
#1读取所有数据
student = pd.read_csv("C:\\Users\\WY\\Desktop\\student2.csv") #和pd.io.parsers/read_csv
# print(student)
""" a,b
0 我不是毛2,我不是我2,哈哈哈哈2
1 我不是毛3,我不是我3,哈哈哈哈3
2 我不是毛4,我不是我4,哈哈哈哈4
3 我不是毛11,我不是我11,哈哈哈哈11
4 我不是毛22,我不是我22,哈哈哈哈22
5 我不是毛33,我不是我33,哈哈哈哈33
6 我不是毛44,我不是我44,哈哈哈哈44
"""
# 读取前5行 和后5行的数据
# print(student.head()) # 获取数据前五行的数据
# 出错了 不回了 ????????????文件的本身的问题 换了文件就好了
# print(student.tail()) #获取数据后5行的数据
# a,b
# 2 我不是毛4,我不是我4,哈哈哈哈4
# 3 我不是毛11,我不是我11,哈哈哈哈11
# 4 我不是毛22,我不是我22,哈哈哈哈22
# 5 我不是毛33,我不是我33,哈哈哈哈33
# 6 我不是毛44,我不是我44,哈哈哈哈44
# 3 查询指定的行 这里的ix 索引标签函数必须是中括号[]
# print(student.ix[[0,2,4]])
# a,b
# 0 我不是毛2,我不是我2,哈哈哈哈2
# 2 我不是毛4,我不是我4,哈哈哈哈4
# 4 我不是毛22,我不是我22,哈哈哈哈22
# 4 查询指定的列 卡主了 不知道列索引的用法
# print(stude????????????????????????????????????????????/
# print(student[["b"]].head())
# =================?????????????????????????????????不会
# 四、统计分析********
# pandas 模块维我们提供好了非常多的描述性分析的指标函数,如总和,均值
# 最大值、最小值等。我们来具体查看以下这些函数:
# 首先随机生成三组数据
# np.random.seed(1234)
# d1 = pd.Series(2*np.random.normal(size=100)+3)
# d1 = pd.Series(2*np.random.normal(size=100))
# print(d1)