Python的开始学习(1)


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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,270评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,489评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,630评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,906评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,928评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,718评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,442评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,345评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,802评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,984评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,117评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,810评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,462评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,011评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,139评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,377评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,060评论 2 355