title: Python的开始学习(1)
tags: Python
引入
主要想说下,为什么自己要学python, 其实这个从上年已经开始想要学习,也学了一部分,只是每次都没有将其应用于自己实际的数据分析中(一直坚持R~)。
但是呢,准备下半年上一个Pyhton的机器学习课程,所以又又又开始学习了,先为后面课程做个基础学习。
当然,还有其它原因,都说其运行的快,还有导师说我们需要用的一个数据库,与其可以连接更方便。
基于以上原因,就又开始了学习python之路。 但是这里想说下,个人想学习Julia。
并且这次学习经历了一个月多,中间参考多本书籍和其他人写的材料,再次表示感谢。
现在整理出其中一部分,对于Numpy和Pandas的细说部分,等再次再整理。
初认
基础
数据类型
整数(int), 浮点(float) 和字符串(str)
type() # 查看数据类型
类型的转换:
str()
int()
float()
内置函数
print()
len() #查看长度
input() # 输入
识别字符串方法
is.X 字符串方法
X可以是以下几个函数:
isalpha() 是否只含字母
isalnum() 是否只有数字或字母
isdecimal() 是否只有数字
isspace() 是否只有空格制表符换行
istitle() 是否字符串为大写开头, 后面均为小写字母
计算符号
== 表示等于
!=表示不等于
&表示和
% 表示求余数,也可以作为格式符号
not / and / or 同样可以用于python分析
A|B 表示A 或B = A or B
re.compile([AB]) :表示括号中的A或B可以可以任意取值去匹配
导入模块
import random as rd# 当多个模块时, 使用 , 隔开
or
from random import randint
数据的读写
CSV文件
import numpy as np
import pandas as pd
import os # 改变目录的工具
os.chdir('')
df1 = pd.read_csv(' ', encoding = 'utf-8', dtype = ['variable1':str, 'variable2':str])
#默认第一行为表头,一般使用utf-8编码,中文使用gbk, dtype对数据类型规定
excel文件
df2 = pd.read_excel(' ', encoding = 'utf-8', sheet_name = ' ')
# 读取excel时需要注明具体哪一个工作簿,否则就是第一个
数据库文件
导入数据库
import pymysql
from sqlalchemy import create_engine
建立连接
conn = create_engine('mysql+pymysql://root:ly200689081@localhost:3306/test01')
conn = create_engine("mysql+pymysql://{}:{}@{}:{}/{}?charset=gbk".format('root', 'ly200689081', 'localhost', '3306', 'test01'))
按实际情况依次填写MySQL的用户名、密码、IP地址、端口、数据库名
读数据
sql = 'select * from meal_order_info' #选择数据库中表名称
df1 = pd.read_sql(sql,conn) #df1 是个dataframe格式
函数形式
def query(table):
host = 'localhost'
user = 'root'
password = 'ly200689081'
database = 'test01'
port = 3306
conn = create_engine("mysql+pymysql://{}:{}@{}:{}/{}".format(user, password, host, port, database)) #SQL语句,可以定制,实现灵活查询
sql = 'select * from ' + table #选择数据库中表名称
results = pd.read_sql(sql,conn) # 使用pandas 的read_sql函数,可以直接将数据存放在dataframe中
return results
df3 = query('')
保存数据
保存csv文件
df1.to_csv(' ', encoding = 'utf-8', index = False) #
保存excel文件
df2.to_excel(' ', sheet_name = ' ', index = False) #
保存到数据库
选择存储目录
import os
os.chdir(' ')
存入
try:
df.to_sql('testdf',con = conn, index= False,if_exists= 'replace')
except:
print('error')
数据分析常用工具
在python数据分析中,最常用的两个包是numpy和pandas。 特别需要注意python的引索是从0开始
Numpy
数组创建
import numpy as np
arr1 = np.array([-9, 7, 4, 3], dtype = float) # 对数加入类型
其他函数
np.arange(0, 10, 1)
np.linspace([1, 10, 10])
np.zeros([4, 5])
arr1 + 1 # 矩阵计算
数组的方法
arr1.ndim
arr1.shape
arr1.dtype
arr1[1] # 访问第二行
arr1[1,2] = arr1[1][2]
arr1[2:,2:10]
排序
np.sort(arr1, axis = 0) # 0 代表行, 1为列
sorted(arr1, reverse = True) #降序
np.argsort(arr1) # 返回的是排序后,在原数据的中的引索值
np.where(x > 2, 1, -1) # 满足条件的,赋值为1, 不满足的为-1. 可用于连续变量改为分类数据
np.extract(x > 3, x)#提出满足条件的数据
Pandas
介绍两种数据结构
seires序列
import pandas as pd
seriesl = pd.Series([1, 2, 3])
series2 = pd([2, 3, 4], index = ['a', 'b', 'c'], name = '这是一个seires')
series.values
series.index
dafaframe
是一个数据框, 其他使用与数组的相同
df2 = pd.DataFrame({'姓名':['张三','李四','王二'],'年龄':[23,27,26],'性别':['男','女','女']}) #使用字典,字典的键被当成列名
数据处理
import pandas as pd
import numpy as np
df = pd.read_csv()
数据筛选
df.info() # 查看数据
df.describe() # 描述性统计数据
df['variable1'][1:5]# 查看数据变量1的2到5行
df[['variable1', 'variable2']] # 多个变量
df.loc[3:4, ['variable1', 'variable2']] # 根据行引索选择, 3,4行均包含, 只选出变量1, 变量2列
df.loc[(df.user_id = ' ')|(df.user_id = ' '), ['user_id', 'day']] ##多条件筛选
df.iloc[2:4, [0:2]] # 根据位置选择,只包含2,3没有4
数据增加与删除
添加
df['变量1'] = np.where(df['buy_mount'] > 3, '高', ‘低’) # 增加一列
增加行在append方法 在dataframe末尾添加
an_id = df['auc_id'] # 将变量赋值给an_id
del df['auc_id'] # 删去变量auc_id
df.insert(0, 'auc_id', an_id) #df数据中加入an_id
删除
加入 inplace = True 参数时,表示在原文中进行删除, labels 表示删除的数据, axis 表示轴,一样0为行操作,1为列操作
如果没加inplace, 则返回的是视图,并没对原始数据操作
df.drop(labels = ['variable1', 'variable2'], axis = 1, inplace = True) ##删除‘1,2’列
df.drop(labels = [1, 2], inplace = True, axis =0)
or
df.drop(labels = range(1, 2), inplace = True)
修改
df.loc[df['variable1'== '1'], 'variable1'] = '0' ## 将变量为1的数据改为0
df.rename(colnums = {'variable1': one, 'variable2': two}, inplace = True)#修改列名
df.rename(index = {1:'one', 2:'two'}, inplace = True)# 修改行名
查找
df[df.variable1 > 10] #筛选变量1大于10的数据
df[~(df.variable1 > 10)] # ~代表非
df[(df.variable1 > 10) & (df.variable2 >30)] #多条件筛选
df[df['variable1'].isin([1, 2, 3])] #变量1包含的数据1,2,3
连接
通过循环方式进行合并
basic = pd.DataFrame()
for i in sheet_name:
basic_i = pd.read_excel('data.xlsx', header = 0,sheet_name=i,encoding='utf-8')
basic = pd.concat([basic,basic_i],axis=0)
df3 = pd.merge(left = df1, right = df2, how = 'inner', left_on = 'variable1', right_on = 'variable1')
层次化引索
df = pd.read_csv('data1.csv', encoding='utf-8',dtype={'id':str},index_col=[0,1])#将数据第1列和第2列当成索引
df.loc[2]# 使用第一层引索
df.loc[2].loc[23, 12]# 使用第二层引索
df.loc[1, [22,33], ['variable1', 'variable2']] # 使用两个引索,并选择变量1,2
处理重复
df[df.dupicated()] # 查看重复数据
np.sum(df.duplicated()) #计算重复数量
df.drop_duplicated() #删除重复数据,只是给出视图
df.drop_duplicated(subset = ['variable1', 'variable2'], inplace = True) # 按照变量1,2重复值来去重
缺失值处理
df[df[‘variable1’].isnull()] #查看变量1是否有缺失值
直接删除缺失值
df.apply(lambda x: sum(x, isnull()/len(x), axis = 0)) # 计算缺失比例
df.dropna()#直接删除
df.dropna(how = 'any', axis = 0) # 只要有缺失值, 就删除这一行( 等价于df.dropna() ), 改为axis = 1, 就为删除列,这个不多用
df.dropna(how = 'any', axis = 0, subset = ['variable1', variable2]) #基于这变量1,2进行缺失值的行删除
替换缺失值
df.variable1.fillna(df.variable1.mean()) #使用variable1的平均值填补缺失值,
也可以将mean改为 median, mode, 中位数,众数进行填充
当然多变量可以同时进行不同的填充
df.fillna(value = {'variable1':df.variable1.mode()[0], 'variable2':df.variable2.mean()})
df.fillna(100)# 全用用100填充缺失值
df['variable1'].fillna(method = 'ffill') #按照变量1,向前填充, 当改为method = ‘bfill’, 变为向后补充
异常值处理
异常值判断这里用两种方法检查: 1 不在均值的2.5SD范围内 2 使用箱形图(四分位数差方法)
第一种
xmean = df.variable1.mean()
xstd = df.variable1.std()
any(df.variable1 > xmean + 2.5 * xstd)
any(df.variable1 < xmean - 2.5 * xstd)
第二种
Q1 = df.variable1.quantile(q = 0.25)
Q3 = df.variable1.quantile(q = 0.75)
IQR = Q3 - Q1
any(df.variable1 > Q3 + 1.5 * IQR)
any(df.variable1 < Q1 - 1.5 * IQR)
图形展示
import matplotlib.pyplot as plt
%matplotlib inline
df.variable1.plot(kind = 'box')
数据分组展示
主要使用pd.cut()函数进行分组展示,
df['variable1_bin'] = pd.cut(df['variable1'], 5, labels = range(5))
df['variable1_bin'].hist()
日期格式数据处理
日期提取
df['variable1'].dt.year ## 对时间格式的数据,提出年,还有对应的month, day.
时间差值
df['diff_data'] = pd.datetime.now() - df1['variable1']
得到的差值由天数, 小时 和毫秒组成
df['diff_data'].dt.days #提取天, 同样还可以提取: seconds, microseconds
时间转换
df['day'] = df['diff_data']/pd.Timedelta('1 D') #转化为天, 也可将其改为分钟, ‘1 M’
or
df['diff_data'].astype('timedelta64[D]') # 同样可以转为天, M 代表月, Y代表年
df[diff_data].round(decimals = 3) # 显示为3位小数
字符串处理
df['variable1'].str[0:4] # 字符串切片
df['variable1'].astype(float) #转换为数值型, 可以不成功
or 先要去除一些符号, 在转换
df['variable1'] = df['variable1'].str.strip('$') # 字符串去除$
df['variable1'] = df['variable1'].str.replace(',', '') # 将 ,进行取代
df['variable1'].str.split(',') #使用字符串进行分割, 用于对文本的处理
df['variable1'].str.len() #计算字符串长度
交叉表
pd.crosstab(index = df['variable1'], colums = df['variable2'], margins = True, normalize = 'all') #margins 表示需要计算总和, normalize是对行和列都进行百分比计算
高阶函数
map
df['variable1'] = df['variable2'].map({'0':'one', '1':'two'})
apply
提取和替换
df['variable1'].apply(lambda x: x.replace(x[1:3], '**')) # 结合lambda 替换
df['variable1'].apply(lambda x: str(x)[0:4]) # 提取年份
统计计算
grouped = df.groupby('variable1') # 根据变量1进行分组
grouped.apply(np.mean)[['variable1', variable2]] # 分组后,对变量1,2 求平均值
df.colums #查看列名
var_name = ['1', '2', '3']
df['sum'] = df[var_name].apply(np.sum, axis = 0) # 相当于计算每列的和, 当改为axis =1时, 相当于计算每行的总和
var_name.append('sum')
df[var_name].apply(lambda x; x[0] - x[1], axis = 1) # df的第一列减去第二列
groupby
主要使用groupby()函数数据分组
grouped = df.groupby('variable1') # 根据变量1进行分组
grouped.mean() # 直接按分组的求平均值
grouped.sum()['variable2'] #按分组后的类别,分别计算变量2的和
grouped = df.groupby(by = ['variable1', 'variable2']) #按照变量1和2进行一起分组
grouped.sum()['variable3'] # 按照变量1,2分类后, 计算变量3的和
agg
agg函数作用于series和DataFrame的函数, 同样对分组后的数据进行函数计算
grouped = df.groupby('variable1') # 先分组
grouped.agg([np.mean, np.min]) # 对分组后的对象,计算平均值和最小值
grouped.agg({'variable2':np.mean, 'variable3':[np.mean, np.median]}) # 分组后,对变量2,3分别计算了平均值, 并且对变量3还计算了中位数
df[['variable1', 'variable2']].agg([np.mean, np.sum]) #也可以直接对变量2,3 分别求平均值和求和
自定义函数
字符串转变为数值型数据
def f(x):
if ‘ ’ in str(x):
x = str(x).strip('')
x = str(x).replace(',', '')
else:
x = str(x).replace(',', '')
return float(x)
### 数值取代
def f(x):
if ‘ ’ in x:
return ''
elif ' ' in x:
return ''
else:
return ''
df['variable2'] = df['variable1'].apply(f)