2014-04-16 09:28:04 oMuYeJingFeng1 阅读数 8509
  • Python数据分析实战-Pandas

    深度学习、机器学习和数据分析必须用pandas。pandas是在python直接流行的数据处理框架。可以说,如果不会使用pandas,就谈不上会用python做数据分析。本课程会使用奥林匹克一个真实的数据作为实验数据,从初级到各种pandas的常用操作,到常用的数据可视化,让你在短的时间内掌握好pandas,轻松愉快的玩转数据分析。

    2334 人正在学习 去看看 阿勒拉哈

最近大数据竞赛很火,本人python没学多久,想试着写一下,只是实现了数据的处理,主要用到了dict,list,file知识

还有一点要说,我也用matlab实现了,但是运行完要差不多两分钟,但是python秒处理,有木有啊,足见python处理文本功能之强大


文件里的数据格式:

clientid      shopingid      num    date

1111000   3873             2          4月5日

clientinfo = []
shopinginfo = {}
month={}
day={}
shopidflag = 0
clientstartflag = 0
total={}
tmpclientid=''
output= open('f:/a.txt','a')
with open('f:/s.txt','r') as data_file:
    for lineinfo in data_file:
        lineinfo = lineinfo.split()
        clientid = lineinfo[0]
        shopingid = lineinfo[1]
        num=[]
        num.append(lineinfo[2])
        data = lineinfo[3]
        data = data[:-1]
        data = data.split('月')
        monthvar=[]
        monthvar.append(data[0])
        dayvar=[]
        dayvar.append(data[1])
        
        if clientid in clientinfo and shopingid in shopinginfo and int(data[0])>=6:
            shopinginfo[shopingid].append(lineinfo[2])
            month[shopingid].append(data[0])
            day[shopingid].append(data[1])
        elif clientid in clientinfo and shopingid not in shopinginfo and int(data[0])>=6:
            shopinginfo[shopingid]=num
            month[shopingid]= monthvar
            day[shopingid] = dayvar
        elif clientid not in clientinfo :
            #if clientstartflag  == 1: 
            clientflag = 0
            shopinglink=''
            for (k, v) in shopinginfo.items():
                total={}
                vote=0
                for  i  in v:
                    if  i  in total:
                        total[i]+=1
                    else:
                        total[i]=1      
                for var in total:
                    if var == '0':
                        vote += total[var]
                    elif var == '1':
                        vote = 0
                        break 
                    elif var == '2':
                        vote += total[var]*2
                    else:
                        vote += total[var]*3
                    if vote >= 3:
                        if clientflag == 0:
                            output.write(tmpclientid+'\t')
                            clientflag =1
                        shopinglink+=k+','
            if clientflag == 1:
                output.write(shopinglink.strip(',')+'\r\n')
            shopinginfo={}
            month ={}
            day ={}
            clientinfo=[]
            tmpclientid=clientid
            clientinfo.append(clientid)
            shopinginfo[shopingid]=num
            month[shopingid] = monthvar
            day[shopingid] = dayvar
    shopinglink=''
    for (k, v) in shopinginfo.items():
        for  i  in v:
            if  i  in total:
                total[i]+=1
            else:
                total[i]=1
        total={}
        vote=0
        for  i  in v:
            if  i  in total:
                total[i]+=1
            else:
                total[i]=1      
        for var in total:
            if var == '0':
                vote += total[var]
            elif var == '1':
                vote = 0
                break 
            elif var == '2':
                vote += total[var]*2
            else:
                vote += total[var]*3
        if vote >= 3:
            if clientflag == 0:
                clientflag =1
            shopinglink+=k+','
    if clientflag == 1:
        output.write(tmpclientid+'\t')
        output.write(shopinglink.strip(','))
    data_file.close()
    output.close()


2019-05-27 19:13:25 Charein 阅读数 883
  • Python数据分析实战-Pandas

    深度学习、机器学习和数据分析必须用pandas。pandas是在python直接流行的数据处理框架。可以说,如果不会使用pandas,就谈不上会用python做数据分析。本课程会使用奥林匹克一个真实的数据作为实验数据,从初级到各种pandas的常用操作,到常用的数据可视化,让你在短的时间内掌握好pandas,轻松愉快的玩转数据分析。

    2334 人正在学习 去看看 阿勒拉哈

本书特色

用传统的电子表格来处理数据不仅效率低下,而且无法处理某些格式的数据,对于混乱或庞大的数据集更是束手无策。本书将教你如何利用语法简单、容易上手的Python轻松处理数据。作者通过循序渐进的练习,详细介绍如何有效地获取、清洗、分析与呈现数据,如何将数据处理过程自动化,如何安排文件编辑与清洗任务,如何处理更大的数据集,以及如何利用获取的数据来创作引人入胜的故事。学完本书,你的数据处理和分析能力将更上一层楼。

  • 快速了解Python基本语法、数据类型和语言概念
  • 概述数据的获取与存储方式
  • 清洗数据并格式化,以消除数据集中的重复值与错误
  • 学习何时对数据进行标准化,何时对数据清理进行测试并将其脚本化
  • 使用Scrapy写网络爬虫
  • 利用新的Python库和技术对数据集进行探索与分析
  • 使用Python解决方案将整个数据处理过程自动化

“如果你一直感觉电子表格(甚至关系型数据库)无法回答你想要提出的问题,或者除这些工具之外你准备进一步学习,那么这本书非常适合你。我一直在等待这本书的出现。”

——Derek Willis,ProPublica新闻应用开发者,OpenElections联合创始人

“所有新手数据科学家、数据工程师或其他技术方面的数据专家都应该读一读这本实践指南。数据处理领域正需要这样一本书,真希望我第一次开始用Python处理数据时就能有它指导。”

——Tyrone Grandison博士,Proficiency Labs Intl. CEO

目录

版权声明
O’Reilly Media, Inc.介绍
本书赞誉
前言
第 1 章 Python 简介
第 2 章 Python 基础
第 3 章 供机器读取的数据
第 4 章 处理 Excel 文件
第 5 章 处理 PDF 文件,以及用 Python 解决问题
第 6 章 数据获取与存储
第 7 章 数据清洗:研究、匹配与格式化
第 8 章 数据清洗:标准化和脚本化
第 9 章 数据探索和分析
第 10 章 展示数据
第 11 章 网页抓取:获取并存储网络数据
第 12 章 高级网页抓取:屏幕抓取器与爬虫
第 13 章 应用编程接口
第 14 章 自动化和规模化
第 15 章 结论
附录 A 编程语言对比
附录 B 初学者的 Python 学习资源
附录 C 学习命令行
附录 D 高级 Python 设置
附录 E Python 陷阱
附录 F IPython 指南
附录 G 使用亚马逊网络服务
关于作者
关于封面

下载

https://pan.baidu.com/s/1B2H_CxsXfnjRouxU6bCTRw

2018-08-23 18:41:45 a40850273 阅读数 236
  • Python数据分析实战-Pandas

    深度学习、机器学习和数据分析必须用pandas。pandas是在python直接流行的数据处理框架。可以说,如果不会使用pandas,就谈不上会用python做数据分析。本课程会使用奥林匹克一个真实的数据作为实验数据,从初级到各种pandas的常用操作,到常用的数据可视化,让你在短的时间内掌握好pandas,轻松愉快的玩转数据分析。

    2334 人正在学习 去看看 阿勒拉哈

Python 数据处理

数据的读取与保存

当路径或文件中包含中文时,需要额外指定 engine 为 python

import pandas as pd
data = pd.read_csv(data_path, sep=' ', header=None)
data.to_csv(rlt_path, header=0, index=0, sep=' ')

data = pd.read_csv(data_path, engine='python')

DataFrame 按列差分

只对于 Series 和 DataFrame 存在这个函数。对于 ndarray 可以先转成 Series 或 DataFrame 再进行处理。

d_vel = abs(data.diff()).fillna(method='bfill')

数据插值

interp1d 函数通过传入的横纵坐标数据拟合并返回一个函数。这个函数可以接受一个序列作为输入,并返回相应大小的拟合插值。

from scipy.interpolate import interp1d

function = interp1d(range(N), data[i], kind='quadratic') # interp1d(x, y) 一维插值
fdata = function(np.linspace(0, N-1, INSERT_N * N))

这个函数只能对给定值范围内的点进行插值,如果需要预测的点超过范围将返回 ValueError 异常。此时可以使用 interp 函数。

from scipy import interp, arange, exp

x = arange(0, 10)
y = exp(-x/3.0)


interp([9, 10], x, y)
# array([0.04978707, 0.04978707])

不过该函数只是将超过范围的预测值赋值为边缘的两个值。如果需要更复杂的要求,可以通过自行编写函数实现。

中值滤波

用该点周围指定范围内的值的中位数来代替该点的值

import scipy.signal as signal

x_med = signal.medfilt(x, 3) # 核为3

分位数计算

percentile 函数根据传入的数据,给出对应 25%、50%和75%的分位数

import numpy as np

per = np.percentile(x, [25, 50, 75])

离散信号的极值点

import scipy.signal as signal

extreme_geater = signal.argrelextrema(data, np.greater) # 给出的是位置标号
extreme_less = signal.argrelextrema(data, np.less)

绘图使用两个独立的坐标轴

import matplotlib.pyplot as plt

plt.figure()
ax1 = plt.subplot(111)
ax1.plot(range(N), f_data[12])
ax2 = ax1.twinx() # 独立两个y轴,x轴用twiny()
ax2.plot(range(N), data[12])

 

2019-06-16 13:28:17 kclax 阅读数 242
  • Python数据分析实战-Pandas

    深度学习、机器学习和数据分析必须用pandas。pandas是在python直接流行的数据处理框架。可以说,如果不会使用pandas,就谈不上会用python做数据分析。本课程会使用奥林匹克一个真实的数据作为实验数据,从初级到各种pandas的常用操作,到常用的数据可视化,让你在短的时间内掌握好pandas,轻松愉快的玩转数据分析。

    2334 人正在学习 去看看 阿勒拉哈

在这里插入图片描述

在数据分析领域,最热门的莫过于Python和R语言,此前有一篇文章《别老扯什么Hadoop了,你的数据根本不够大》指出:只有在超过5TB数据量的规模下,Hadoop才是一个合理的技术选择。这次拿到近亿条日志数据,千万级数据已经是关系型数据库的查询分析瓶颈,之前使用过Hadoop对大量文本进行分类,这次决定采用Python来处理数据:

硬件环境
CPU:3.5 GHz Intel Core i7
内存:32 GB HDDR 3 1600 MHz
硬盘:3 TB Fusion Drive
数据分析工具
Python:2.7.6
Pandas:0.15.0
IPython notebook:2.0.0
源数据如下表所示:

Table	Size	Desc
ServiceLogs	98,706,832 rows x 14 columns	8.77 GB	交易日志数据,
每个交易会话可以有多条交易

ServiceCodes	286 rows × 8 columns	20 KB	交易分类的字典表
数据读取
启动IPython notebook,加载pylab环境:

ipython notebook --pylab=inline

Pandas提供了IO工具可以将大文件分块读取,测试了一下性能,完整加载9800万条数据也只需要263秒左右,还是相当不错了。

import pandas as pd
reader = pd.read_csv('data/servicelogs', iterator=True)
try:
    df = reader.get_chunk(100000000)
except StopIteration:
    print "Iteration is stopped."
1百万条	1千万条	1亿条
ServiceLogs	1 s	17 s	263 s
使用不同分块大小来读取再调用 pandas.concat 连接DataFrame,chunkSize设置在1000万条左右速度优化比较明显。
loop = True
chunkSize = 100000
chunks = []
while loop:
    try:
        chunk = reader.get_chunk(chunkSize)
        chunks.append(chunk)
    except StopIteration:
        loop = False
        print "Iteration is stopped."
df = pd.concat(chunks, ignore_index=True)
下面是统计数据,Read Time是数据读取时间,Total Time是读取和Pandas进行concat操作的时间,根据数据总量来看,对5~50个DataFrame对象进行合并,性能表现比较好。

Chunk Size	Read Time (s)	Total Time (s)	Performance
100,000	224.418173	261.358521	
200,000	232.076794	256.674154	
1,000,000	213.128481	234.934142	√ √
2,000,000	208.410618	230.006299	√ √ √
5,000,000	209.460829	230.939319	√ √ √
10,000,000	207.082081	228.135672	√ √ √ √
20,000,000	209.628596	230.775713	√ √ √
50,000,000	222.910643	242.405967	
100,000,000	263.574246	263.574246


如果使用Spark提供的Python Shell,同样编写Pandas加载数据,时间会短25秒左右,看来Spark对Python的内存使用都有优化。

数据清洗
Pandas提供了 DataFrame.describe 方法查看数据摘要,包括数据查看(默认共输出首尾60行数据)和行列统计。由于源数据通常包含一些空值甚至空列,会影响数据分析的时间和效率,在预览了数据摘要后,需要对这些无效数据进行处理。

首先调用 DataFrame.isnull() 方法查看数据表中哪些为空值,与它相反的方法是 DataFrame.notnull() ,Pandas会将表中所有数据进行null计算,以True/False作为结果进行填充,如下图所示:
在这里插入图片描述
Pandas的非空计算速度很快,9800万数据也只需要28.7秒。得到初步信息之后,可以对表中空列进行移除操作。尝试了按列名依次计算获取非空列,和 DataFrame.dropna() 两种方式,时间分别为367.0秒和345.3秒,但检查时发现 dropna() 之后所有的行都没有了,查了Pandas手册,原来不加参数的情况下, dropna() 会移除所有包含空值的行。如果只想移除全部为空值的列,需要加上 axis 和 how 两个参数:

df.dropna(axis=1, how='all')

共移除了14列中的6列,时间也只消耗了85.9秒。

接下来是处理剩余行中的空值,经过测试,在 DataFrame.replace() 中使用空字符串,要比默认的空值NaN节省一些空间;但对整个CSV文件来说,空列只是多存了一个“,”,所以移除的9800万 x 6列也只省下了200M的空间。进一步的数据清洗还是在移除无用数据和合并上。

对数据列的丢弃,除无效值和需求规定之外,一些表自身的冗余列也需要在这个环节清理,比如说表中的流水号是某两个字段拼接、类型描述等,通过对这些数据的丢弃,新的数据文件大小为4.73GB,足足减少了4.04G!

数据处理
使用 DataFrame.dtypes 可以查看每列的数据类型,Pandas默认可以读出int和float64,其它的都处理为object,需要转换格式的一般为日期时间。DataFrame.astype() 方法可对整个DataFrame或某一列进行数据格式转换,支持Python和NumPy的数据类型。

df['Name'] = df['Name'].astype(np.datetime64)

对数据聚合,我测试了 DataFrame.groupby 和 DataFrame.pivot_table 以及 pandas.merge ,groupby 9800万行 x 3列的时间为99秒,连接表为26秒,生成透视表的速度更快,仅需5秒。

df.groupby(['NO','TIME','SVID']).count() # 分组
fullData = pd.merge(df, trancodeData)[['NO','SVID','TIME','CLASS','TYPE']] # 连接
actions = fullData.pivot_table('SVID', columns='TYPE', aggfunc='count') # 透视表

根据透视表生成的交易/查询比例饼图:
在这里插入图片描述
将日志时间加入透视表并输出每天的交易/查询比例图:

total_actions = fullData.pivot_table('SVID', index='TIME', columns='TYPE', aggfunc='count')
total_actions.plot(subplots=False, figsize=(18,6), kind='area')

在这里插入图片描述
除此之外,Pandas提供的DataFrame查询统计功能速度表现也非常优秀,7秒以内就可以查询生成所有类型为交易的数据子表:

tranData = fullData[fullData['Type'] == 'Transaction']

该子表的大小为 [10250666 rows x 5 columns]。在此已经完成了数据处理的一些基本场景。实验结果足以说明,在非“>5TB”数据的情况下,Python的表现已经能让擅长使用统计分析语言的数据分析师游刃有余。

2019-05-27 08:51:32 sunyaowu315 阅读数 194
  • Python数据分析实战-Pandas

    深度学习、机器学习和数据分析必须用pandas。pandas是在python直接流行的数据处理框架。可以说,如果不会使用pandas,就谈不上会用python做数据分析。本课程会使用奥林匹克一个真实的数据作为实验数据,从初级到各种pandas的常用操作,到常用的数据可视化,让你在短的时间内掌握好pandas,轻松愉快的玩转数据分析。

    2334 人正在学习 去看看 阿勒拉哈
def missing_delete_var(df, threshold=None):
    """
    df:数据集
    threshold:缺失率删除的阈值

    return :删除缺失后的数据集
    """
    df2 = df.copy()
    missing_df = missing_cal(df)
    missing_col_num = missing_df[missing_df.missing_pct >= threshold].shape[0]
    missing_col = list(missing_df[missing_df.missing_pct >= threshold].col)
    df2 = df2.drop(missing_col, axis=1)
    return df2


def missing_delete_user(df, threshold=None):
    """
    df:数据集
    threshold:缺失个数删除的阈值

    return :删除缺失后的数据集
    """
    df2 = df.copy()
    missing_series = df.isnull().sum(axis=1)
    missing_list = list(missing_series)
    missing_index_list = []
    for i, j in enumerate(missing_list):
        if j >= threshold:
            missing_index_list.append(i)
    df2 = df2[~(df2.index.isin(missing_index_list))]
    return df2


def const_delete(df, col_list, threshold=None):
    """
    df:数据集
    col_list:变量list集合
    threshold:同值化处理的阈值

    return :处理后的数据集
    """
    df2 = df.copy()
    const_col = []
    for col in col_list:
        const_pct = df2[col].value_counts().iloc[0] / df2[df2[col].notnull()].shape[0]
        if const_pct >= threshold:
            const_col.append(col)
    df2 = df2.drop(const_col, axis=1)
    return df2


def missing_cal(df):
    """
    df :数据集

    return:每个变量的缺失率
    """
    missing_series = df.isnull().sum() / df.shape[0]
    missing_df = pd.DataFrame(missing_series).reset_index()
    missing_df = missing_df.rename(columns={'index': 'col',
                                            0: 'missing_pct'})
    missing_df = missing_df.sort_values('missing_pct', ascending=False).reset_index(drop=True)
    return missing_df


def data_processing(df, target):
    """
    df:包含了label和特征的宽表

    return:
    df :清洗后的数据集
    """
    # 特征缺失处理
    df = missing_delete_var(df, threshold=0.8)
    # 样本缺失处理
    df = missing_delete_user(df, threshold=int(df.shape[1] * 0.8))
    col_list = [x for x in df.columns if x != target]
    # 常变量处理
    df = const_delete(df, col_list, threshold=0.9)
    desc = df.describe().T
    # 剔除方差为0的特征
    std_0_col = list(desc[desc['std'] == 0].index)
    if len(std_0_col) > 0:
        df = df.drop(std_0_col, axis=1)
    df.reset_index(drop=True, inplace=True)

    # 缺失值计算和填充
    miss_df = missing_cal(df)
    cate_col = list(df.select_dtypes(include=['O']).columns)
    num_col = [x for x in list(df.select_dtypes(include=['int64', 'float64']).columns) if x != 'label']

    # 分类型特征填充
    cate_miss_col1 = [x for x in list(miss_df[miss_df.missing_pct > 0.05]['col']) if x in cate_col]
    cate_miss_col2 = [x for x in list(miss_df[miss_df.missing_pct <= 0.05]['col']) if x in cate_col]
    num_miss_col1 = [x for x in list(miss_df[miss_df.missing_pct > 0.05]['col']) if x in num_col]
    num_miss_col2 = [x for x in list(miss_df[miss_df.missing_pct <= 0.05]['col']) if x in num_col]
    for col in cate_miss_col1:
        df[col] = df[col].fillna('未知')
    for col in cate_miss_col2:
        df[col] = df[col].fillna(df[col].mode()[0])
    for col in num_miss_col1:
        df[col] = df[col].fillna(-999)
    for col in num_miss_col2:
        df[col] = df[col].fillna(df[col].median())

    return df, miss_df


  对数据分析、机器学习、数据科学、金融风控等感兴趣的小伙伴,需要数据集、代码、行业报告等各类学习资料,可添加微信:wu805686220(记得要备注喔!),也可关注微信公众号:风控圏子(别打错字,是圏子,不是圈子,算了直接复制吧!)

关注公众号后,可联系圈子助手加入如下社群:

  • 机器学习风控讨论群(微信群)
  • 反欺诈讨论群(微信群)
  • python学习交流群(微信群)
  • 研习社资料(qq群:102755159)(干货、资料、项目、代码、报告、课件)

相互学习,共同成长。

Python 处理Excel数据

阅读数 247

python数据处理

阅读数 640

没有更多推荐了,返回首页