发表文章

[最新] python 数据处理笔记

a649344475 3月前 1

`1.打开文件,读取普通文件
一.使用open函数获取文件内容:
f=open("C:\\a.txt")
a=f.read() #读取所有
b=f.readline() #读取一行
c=f.readlines() #读取所有行
二.使用linecache模块获取文件内容:
import linecache
a=linecache.getline("C:\\a.txt",2)#读取第二行
b=linecache.getlines("C:\\a.txt")#读取全部内容
clearcache() #清除缓存

`2.从Microsoft Words Excel 与csv文件获取数据
一.从word读取数据:
from win32com import client
word=client.Dispatch('Word.Application')#创建对象
doc=word.Documents.Open(r'C:\a.doc') #打开
a=doc.content #把数据赋值给a
doc.Close()   #关闭
word.Quit()

二.从excel获取数据:
import xlrd
data=xlrd.open_workbook('C:\\a.xls')#打开
table=data.sheet_by_index(0) #通过索引顺序获取
nrows=table.nrows #获取第一张表的行数
ncols=table.ncols #...列数
row2=table.row_values(1)#获取第2行的值(数组)
col2=table.col_values(1)#获取第2列的值(数组)
使用pandas读取excel数据:
import pandas as pd
df=pd.read_excel('C:\\a.xls')

三.从csv文件读取数据:
import pandas as pd
df=pd.read_csv('C:\\a.csv')
df.tail #输出所有信息
df.describe() #描绘输出
df['name'].value_counts()#输出name的分类统计信息
或者:
import csv
date=csv.reader(open('C:\\sj\\a.csv','r'))

`2.1.从xml文件读取数据:
from xml.dom import minidom
dom=minidom.parse('C:\\sj\\a.xml') #打开xml文档
root=dom.documentElement #得到文档元素对象
print(root.nodeName) #节点名称
print(root.nodeValue) #节点的值
print(root.nodeType) #节点类型
print(root.ELEMENT_NODE)
tagname=root.getElementsByTagName('browser')#获得标签名

logins=root.getElementsByTagName("login")
username=logins[0].getAttribute('username')#获得属性值

citys=dom.getElementsByTagName('city')
c1=citys[0].firstChild.data #获得标签对的值

`3.从数据库获取数据
import pymssql
一.从Microsoft SQL Server获取数据:
conn=pymssql.connect(host='.',user='root',password='root',database='db')
cur=conn.cursor()
cur.execute("select * from tb")
row=cur.fetchone/fetchmany(size)/fetchall()
#读取一行/读取指定行/读取所有行
conn.close() #关闭数据库连接

二.从MySQL数据库获取数据:
import MySQLdb
conn=MySQLdb.connect("localhost","root","root","db")
#后续操作同一

三.从MongoDB获取数据
#面向文档,非关系型数据库,三元素:数据库,集合(表),文档(行)
from pymongo import MongoClient
conn=MongoClient.Connection(host='127.0.0.1',port=27017)
db=conn.dbs 或 db=conn['dbs'] #连接数据库dbs
account=db.Ac 或 account=db['Ac'] #连接集合Ac
db.collection_names()  #查看全部集合名称
db.Ac.find_one() #查看集合的一条记录
db.Ac.find_one({"UserName":"keyword"})

db.Ac.find_one({},{"UserName":1,"Email":1})
db.Ac.find_one({},{"UserName":1,"Email":1,"_id":0})
#查看聚集的字段

for item in db.Ac.find():
    item
for item in db.Ac.find({"UserName":"libing"}):
    item["UserName"]
#查看聚集的多条记录

db.Ac.find().count() #查看聚集的记录统计
db.Ac.find({"UserName":"libing"}).count()

db.Ac.find().sort("UserName") #聚集查询结果排序,升序
db.Ac.find().sort("UserName",pymongo.ASCENDING)#...升序
db.Ac.find().sort("UserName",pymongo.DESCENDING)#...降序
db.Ac.find().sort([("UserName",pymongo.ASCENDING),("Email",pymongo.DESCENDING)])#...多列排序

`4.Pandas中的数据结构
Series一维数组,只存储相同数据类型,常用
Time-Series以时间为索引的Series
DataFrame二维表格型数据结构,常用
Panel三维数组   Panel4D四维容器  PanelND多维容器
一.Series
from pandas import Series
s=Series([1,2,3.0,'abc']) #s[1]的值:2
s=Series(data=[1,3,5],index=['a','b','c'])
s.index的值:['a','b','c']
s.values的值:[1,3,5]
s['b']的值为:3
Series对象和它的index都含有一个name属性:
s.name='nihao'
s.index.name='id'

二.DataFrame
from pandas import DataFrame
data={'s':['Ohio','Ohio','Ohio','Nevada','Nevada'],'y':[2000,2001,2002,2001,2002],'p':[1.2,1.7,3.6,2.4,2.9]}
frame=DataFrame(data) #表格,'s','y','p'分别代表一列

frame2=DataFrame(data,columns=['y','s','p','d'])
#增加列'd',由于'd'不在data中,则值为NaN
frame2['d']=1 #设置了'd'的值,也可以=3,2,6,5,4
frame2=DataFrame(data,index=['一','二','三','四','五'])
#设置index,默认为0开始的整数
frame2['s']  #通过列名查询此列
frame2.ix['五'] #通过索引行名查询此行

`5.数据清洗
from pandas import Series,DataFrame
from numpy import nan as NA

一.处理缺失数据:
data=Series([1,NA,3.5,NA,7])
data.isnull()/data.isnull() #元素是空值?/不是空值?
data.dropna() #剔除包含NaN的行
data1=DataFrame([[1.,6,3],[1,NA,NA],[NA,NA,NA],[NA,6.5,4.]])
data1.dropna(axis=0,how='any',thresh=2)
#how可选值有any,all,all仅在切片元素全为NA时才抛弃该行(列),thresh=2表示在一行中至少有2个非NA值时才将其保留
data1.fillna(value=1,method=None,axis=0)#把所有NA填充为1
data1.fillna(0) #所有NA值填充为0
data1.fillna({1:0.5,2:-1}) #第2列填充为0.5,第3列填充为-1;

二.检测和过滤异常值:
import numpy as np
data=DataFrame(np.random.randn(1000,4))
data.describe() #描绘,形容
col=data[3]  #第4列
col[np.abs(col)>3] #找出此列中绝对值>3的项
data[(np.abs(data)>3).any(1)] #选出全部含有绝对值>3的行

三.移除重复数据:
import pandas as pd
import numpy as np
data=DataFrame({'k1':['one']*3+['two']*4,'k2':[1,2,1,3,3,4,4]})
data.duplicated() #是否是重复行
data.drop_duplicates() #移除了列组合重复行
data['k3']=range(7)  #增加了一列
data.drop_duplicates(['k1']) #移除指定列的重复行

四.数据集成:
import pandas as pd
df1=DataFrame({'key':['a','a','b','b'],"data1":range(4)})
df2=DataFrame({'key':['b','b','c','c'],"data2":range(4)})
pd.merge(df1,df2,left_index=True,right_index=True)
#df1和df2的列合起来(共4列),df1的key=key_x,df2的key=key_y

五.数据变换,替换值:
ser=Series(range(5)) #值为:0...4
ser.map(str).map(lambda x:x+'!') #值为:0!...4!
ser.map(lambda x:str(x)+'!') #值为:0!...4!
ser.replace([1,2],'x') #第2,3的值变为'x'

^6.导入向量(矩阵)数据,以进行数据挖掘:
若数据格式为:
Age height  buy   #年龄,身高,购买
29  168 1
34  180 0
... ... ...
import numpy as np
f=open("filename.txt")
f.readline()
data=np.loadtxt(f)
x=data[:,:2] #读取前两列,年龄,身高
y=data[:,-1] #读取最后一列,购买
示例:    
from sklearn import svm  #支持向量机分类
clf=svm.SVC()
clf.fit(x,y) #训练模型
clf.predict([31,176]) #判别新的数据是否购买

`7.Scikit-Learn模型接口
一.对所有模型提供的接口:
model.fit() #训练模型,监督模型2个参数,非监督模型1个参数
二.对监督模型提供的接口:
model.predict(X_new) #给定训练好的模型判别新的样本
model.predict() #返回具有最大概率的类标签
model.score()  #计算得分
三.对非监督模型提供的接口:
model.transform()  #从数据中学到新的'基空间'
model.fit_transform()#学到新的基,并按照这组基转换这个数据

`8.使用pickle保存模型clf
import pickle
s=pickle.dumps(clf) #保存到s
clf2=pickle.loads(s) #重新从s取出
clf2.predict(x[0])  #判别样本
with open('c:\\model.txt','w') as f:
  pickle.dump(clf,f) #保存模型到文件model.txt
with open('c:\\model.txt') as f:
  clf=pickle.load(f) #从文件中获取保存的模型

`9.Scikit-Learn常用算法
一.决策树Tree:
from sklearn import tree
clf=tree.DecisionTreeClassifier()
clf.fit(x,y) #训练模型

二.朴素贝叶斯Bayesian:
提供三种方法:GaussianNB,MultinomialNB,BernoulliNB
前两种适合离散数据,后一种适合特征属性是连续值时的情况
from sklearn.naive_bayes import GaussianNB
gnb=GaussianNB() #建模
gnb.fit(x,y)   #训练模型

三.K最近邻:
from sklearn import neighbors
clf=neighbors.KNeighborsClassifier(n_neighbors=15,weights='uniform') #最近邻数15,权重参数uniform
clf.fit(x,y) #训练KNN分类器 

四.线性回归:
from sklearn.linear_model import LinearRegression
mx=LinearRegression()
mx.fit(x,y) #训练

五.逻辑回归:
from sklearn.linear_model import LogisticRegression
mx=LogisticRegression(penalty='12')
mx.fit(x,y) #训练

六.随机森林:
from sklearn.ensemble import RandomForestClassifier
mx=RandomForestClassifier(n_estimators=8)
mx.fit(x,y) #训练

七.MLP神经网络:
from sklearn.neural_network import MLPClassifier
mx=MLPClassifier()
mx.fit(x,y) #训练

`10.iris数据集加载保存
import numpy as np
from sklearn import datasets
iris=datasets.load_iris()
datax=iris.data
datay=iris.target
datax.shape #查看有多少行,多少列
with open("c:\\sj\\iris.txt",'w') as f: #保存到iris文件
    f.write('x1   x2   x3   x4   y\n') #第一行
    for i in range(len(data)):
        s=str(np.hstack([datax[i],datay[i]]))#向右拼接;向下拼接为:(vstack)
        f.write(s[2:-2])
        f.write('\n')

数据切割:
from sklearn.cross_validation import train_test_split
x,y=data[:,:-1],data[:,-1] #把训练数据与结果分开
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.8,random_state=1)#随机打乱并分训练与测试集
#x为训练参数的集合,y为训练参数x对应的结果数据集合
 test_size是样本占比(此取80%),random_state是随机数种子

验证得分:
mx.score(x_test,y_test)

`11.使用Matplotlib绘制图形(绘图)
import numpy as np
import matplotlib.pyplot as pt
一.折线图:
x=np.arange(0,360)
y=np.sin(x*np.pi/180.0) #函数
z=np.cos(x*np.pi/180.0)
pt.plot(x,y,color="blue")#xy轴坐标,以及线的颜色
pt.plot(x,z,color="red")
pt.xlim(0,360) #x轴的取值范围
pt.ylim(-1.2,1.2) #y轴的取值范围
pt.title("SIN & COS function") #名称
pt.show() #显示图形
二.柱形图:
x=['a','b','c','d','e']
y=[100,200,300,200,500]
ind=np.arange(len(x)) #表示有几根柱子
pt.bar(ind,y)
pt.xticks(ind,x) #不加此句则柱底为0开始的数字
pt.title('mypt') #不加此句则没有名称
pt.show() #显示图形
三.饼状图:
speed_map = {
    'dog': (48, '#7199cf'),
    'cat': (45, '#4fc4aa'),
    'cheetah': (120, '#e1a7a2')
}
name=speed_map.keys() #宠物名称
speeds = [x[0] for x in speed_map.values()]# 奔跑速度
colors = [x[1] for x in speed_map.values()] # 对应颜色
labels = ['{}\n{} km/h'.format(animal, speed) for animal, speed in zip(name, speeds)] #设置标签
#画饼状图,并指定标签和对应颜色
pt.pie(speeds, labels=labels, colors=colors)
plt.show() #显示图形

四.K线图:
import matplotlib.pyplot as plt  
import matplotlib.finance as mpf
from matplotlib.pylab import date2num #把日期时间转换为天数
from datetime import datetime

quotes=[[date2num(datetime(2017,11,1)),16,18,15,16.4,6],
        [date2num(datetime(2017,11,2)),15.8,17,16,14.4,18],
        [date2num(datetime(2017,11,3)),17,20,18,19.4,69],
        [date2num(datetime(2017,11,4)),12,14,15,16.4,6],
        [date2num(datetime(2017,11,5)),17,19,18,16.4,56],
        [date2num(datetime(2017,11,6)),6,8,12,10.4,2]] #时间,开盘,最高,最低,收盘
fig, ax = plt.subplots(facecolor=(0.5, 0.5, 0.5))  
fig.subplots_adjust(bottom=0.2)  
ax.xaxis_date()  # 设置X轴刻度为日期时间   
plt.xticks(rotation=45) # X轴刻度文字倾斜45度
plt.title("股票代码:xxxK线图")
plt.xlabel("时间")  
plt.ylabel(u"股价(元)s") 
mpf.candlestick_ohlc(ax,quotes,width=1.2,colorup='r',colordown='green')  
plt.grid(True)  
plt.show()

`12.文件与目录的操作:
import os.path as o
o.abspath('a.txt') #返回当前的os.getcwd()+'a.txt'
  out: 'C:\\Python34\\a.txt'
o.basename('C:\\Python34\\a.txt') #返回最后一个文件名或目录
  out: 'a.txt'
o.dirname('C:\\Python34') #返回指定路径名的上层路径
  out: 'C:\\'
o.exists('C:\\Python34') #检查某一值得的路径或文件是否存在
  out: True
o.getsize('C:\\Python34\\NEWS.txt')#返回文件的大小(byte)
  out: 418267
o.isabs('C:\\Python34\\NEWS.txt')#检查指定路径是否绝对路径
  out: True
o.isfile('NEWS.txt')#检查指定路径是否为文件
  out: True
o.isdir('C:\\Python34') #检查指定路径是否为目录
  out: True
o.split('C:\\Python34\\NEWS.txt')#把绝对路径与文件名分开
  out: ('C:\\Python34', 'NEWS.txt')
o.splitdrive('C:\\Python34\\NEWS.txt')#把磁盘与绝对路径分开
  out: ('C:', '\\Python34\\NEWS.txt')
o.join('C:\\Python34', 'NEWS.txt')#把路径和文件名组成完整路径
  out: 'C:\\Python34\\NEWS.txt'

from glob import glob as g
g('py*3.exe') #使用通配符获取文件列表
  out: ['python3.exe', 'pythonw3.exe']

import os
file_sum=0
tree=os.walk(r'C:\Documents and Settings\Administrator\桌面\python\test')
for dirname,subdir,files in tree:
  print(dirname) #文件夹名
  print(subdir) #下一层文件夹列表
  print(files) #本文件夹内所有文件列表
  if files:
    file_sum+=len(files) #计算共有多少个文件
  print()

import shutil
os.chdir('C:\Documents and Settings\Administrator\桌面')
shutil.copyfile('a.txt','b.txt')#把a复制为b(不含属性)
shutil.copy('a.txt','b.txt') #把a复制为b(含有文件权限和属性)
shutil.copy2('a.txt','b.txt')#把a复制为b(含所有de文件属性)
shutil.copytree('s','d') #把整个s目录以及所有内容复制到d
shutil.rmtree('p') #删除p目录以及里面所有的内容
shutil.move('s','d') #把s这个目录或文件搬移到d

import sys
#新建'sys_argv.py'文件,内容如下
import sys
print('参数长度={}'.format(len(sys.argv)))
i=0
for arg in sys.argv:
    print('第{}个参数是:{}'.format(i,arg))
    i+=1
#在命令行输入:python3 sys_argv.py hello world
#输出结果为:
   参数长度=30个参数是:sys_argv.py
   第1个参数是:hello
   第2个参数是:world

import ast
ast.literal_eval('{1:87,2:65,3:99}') #把字符串转换为字典
  out: {1:87,2:65,3:99}

#{:>2}:左边空出一个空格,{:>.1f}:一位小数点
data=[5,6.4,10.9,17.1,21.8,25.7,29.6,29.2,24.8,19.1,15.1,7.5]
for i in range(12):
  print('{:>2}月平均气温:{:>.1f}度'.format(i+1,float(data[i])))

2017-12-10`
#numpy的使用:
import numpy as np
a=np.arange(24).reshape(4,6) #创建4个数组包含6个元素的2维numpy数组:
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]

print(a[:,0])
[ 0  6 12 18]

print(a.shape) #输出数组的结构:(4, 6)
a.shape=(6,4) #设置数组的结构为(6, 4)
print(a.ndim) #输出数组的维数:2
print(a.size) #输出数组元素的总个数:24
print(a.itemsize) #输出数组元素在内存中所占的字节数:4
a.resize(4,6) #再次设置数组的结构为(4, 6)
print(a.T) #输出原来结构的数组
a=a.tolist() #把a转换成列表,或这样:a=list(a)
a=np.array(a)#把a转换为numpy数组

np.save('is.txt',a) #把a写入到文件
a=np.loadtxt('is.txt') #读取文件(以浮点型读取)
c,v=np.loadtxt('data.csv',delimiter=',',usecols=(6,7),unpack=True) #读取CSV文件,逗号分隔,第6,7列分别赋值给c,v,unpack意思是分拆存储不同列的数据
def dateFmt(s):
    #return datetime.strptime(s.decode('utf-8'),'%Y-%m-%d').date().weekday() #返回星期几
    s1=s.decode('utf-8').split('-')
    if len(s1[1])<2:
        s1[1]='0'+s1[1]
    if len(s1[2])<2:
        s1[2]='0'+s1[2]
    return s1[0]+s1[1]+s1[2] #返回20170101
d,o=np.loadtxt(path,delimiter=',',usecols=(0,1),converters={0:dateFmt},unpack=True) #converters调用函数,处理指定列数据

#股票成交量加权平均价格(VWAP)与时间加权平均价格(TWAP)
with open('data.csv','r') as f:
    f.readline()
    c,v=np.loadtxt(f,delimiter=',',usecols=(4,6),unpack=True) #收盘价,交易量
vwap=np.average(c,weights=v) #得出vwap(成交量加权均价)
twap=np.average(c,weights=np.arange(len(c))) #得出twap

np.mean(c) #算术平均值函数,计算所收盘价的平均值
np.ptp(c) #返回数组元素最大值与最小值的差值
np.median(c) #中位数
c1=np.msort(c) #升序排序
np.var(c) #方差


2017-12-30`
Pandas学习:
本文网址:http://blog.csdn.net/q51522613/article/details/49404607
首先推荐一个比较好的Python pandas DataFrame学习网址
    网址: http://www.cnblogs.com/chaosimple/p/4153083.html
说明:
首先百度Python pandas DataFrame,下面列出DataFrame该数据结构的部分使用方法,并对其进行说明, DataFrame和Series作为padans两个主要的数据结构.

     如果你经常使用SQL数据库或者做过数据分析等相关工作,可以更快的上手python的pandas库,其pandas库的使用方法跟SQL语句的一些语法类似,只不过语言 变了而已.

正文:
import pandas as pd 引用pandas时使用pd名称就可

使用DataFrame查看数据(类似SQL中的select):

from pandas import DataFrame #从pandas库中引用DataFrame

df_obj = DataFrame() #创建DataFrame对象

df_obj.dtypes #查看各行的数据格式

df_obj.head() #查看前几行的数据,默认前5行

df_obj.tail() #查看后几行的数据,默认后5行

df_obj.index #查看索引

df_obj.columns #查看列名

df_obj.values #查看数据值

df_obj.describe #描述性统计

df_obj.T #转置

df_obj.sort(columns = ‘’)#按列名进行排序

df_obj.sort_index(by=[‘’,’’])#多列排序,使用时报该函数已过时,请用sort_values

df_obj.sort_values(by=['',''])同上

#使用DataFrame选择数据(类似SQL中的LIMIT):

df_obj[‘客户名称’] #显示列名下的数据

df_obj[1:3] #获取1-3行的数据,该操作叫切片操作,获取行数据

df_obj.loc[:0,['用户号码','产品名称']] #获取选择区域内的数据,逗号前是行范围,逗号后是列范围,注loc通过标签选择数据,iloc通过位置选择数据

df_obj['套餐'].drop_duplicates() #剔除重复行数据

使用DataFrame重置数据:

df_obj.at[df_obj.index,'支局_维护线']='自有厅' #通过标签设置新的值,如果使用iat则是通过位置设置新的值

使用DataFrame筛选数据(类似SQL中的WHERE):

alist = ['023-18996609823']

df_obj['用户号码'].isin(alist) #将要过滤的数据放入字典中,使用isin对数据进行筛选,返回行索引以及每行筛选的结果,若匹配则返回ture

df_obj[df_obj['用户号码'].isin(alist)] #获取匹配结果为ture的行

使用DataFrame模糊筛选数据(类似SQL中的LIKE):

df_obj[df_obj['套餐'].str.contains(r'.*?语音CDMA.*')] #使用正则表达式进行模糊匹配,*匹配0或无限次,?匹配0或1次

使用DataFrame进行数据转换(后期补充说明)

df_obj['支局_维护线'] = df_obj['支局_维护线'].str.replace('巫溪分公司(.{2,})支局','\\1')#可以使用正则表达式

df_obj['支局_维护线'].drop_duplicates() #返回一个移除重复行的数据

可以设置take_last=ture 保留最后一个,或保留开始一个.补充说明:注意take_last=ture已过时,请使用keep='last'

使用pandas中读取文本数据:

read_csv('D:\LQJ.csv',sep=';',nrows=2) #首先输入csv文本地址,然后分割符选择等等

使用pandas聚合数据(类似SQL中的GROUP BY 或HAVING):

data_obj['用户标识'].groupby(data_obj['支局_维护线'])

data_obj.groupby('支局_维护线')['用户标识'] #上面的简单写法

adsl_obj.groupby('支局_维护线')['用户标识'].agg([('ADSL','count')])

#按支局进行汇总对用户标识进行计数,并将计数列的列名命名为ADSL

使用pandas合并数据集(类似SQL中的JOIN):

merge(mxj_obj2, mxj_obj1 ,on='用户标识',how='inner')# mxj_obj1和mxj_obj2将用户标识当成重叠列的键合并两个数据集,inner表示取两个数据集的交集.
相关推荐
最新评论 (0)
返回
发表文章
a649344475
文章数
38
评论数
0
注册排名
1181770