前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >驱使Python蟒蛇为自己工作

驱使Python蟒蛇为自己工作

作者头像
张俊红
发布2019-05-30 21:40:40
1.3K0
发布2019-05-30 21:40:40
举报
文章被收录于专栏:张俊红张俊红

00|花园里的驱蛇者

驱使Python蟒蛇为自己工作的奇幻之旅

那是一个寻常的下午,他困了。

"飞碟瓜,最近战事紧张,多个植物花园发生了激烈的战斗,麻烦你统计一下上个月的战斗成果,看一下植物战士们的战斗力有没有提高。今天晚上向我汇报。“火炬树桩交待了这个任务,就去指挥战斗了。

"When can I leave work and go home?" 他一遍遍的问自己:“我什么时候可以下班回家?”

飞碟瓜还没有把工作做完,而这导致他目前无法下班。怎么办呢? 向日葵老师发来微信了,刚好问一下她。

后来,经过一个月的学习,飞碟瓜成为了数据分析的熟练工。他偶尔还是会想起那个令他绝望的下午。

以前,他每天的工作,就是数据的罗列,报表的生成,以及分类汇总,他曾经是植物花园里,远近闻名的”表哥”。但是,从那个下午开始,他开始尝试,把一些每月例行的重复工作,写成脚本文件,让python蟒蛇来进行办公自动化的操作。“这像是一个奇幻之旅。”飞碟瓜说。

在1996年5月20日,全世界有3000多万人使用微软Excel,而且平均每分钟新增5个用户。根据pythonanywhere.com网站博客文章的估算,世界上大约有180万至280万的python程序员。2019年2月印刷的一本《对比Excel,轻松学习Python数据分析》引起了这两个庞大的用户群体的热烈追捧。在这本书里,围绕数据分析的流程,作者数据分析师张俊红先生,详细介绍了每个步聚中,用Excel如何实现,用Python如何实现。

『 事务千万件,流程第一件。不按流程走,返工流眼泪 』。这是向日葵老师反复强调的事情,也是飞碟瓜长期工作的经验。

现在,飞碟瓜就按照数据分析的基本流程,一步步的开始分析了。

01|明确目的

根据各个花园上报的这样的明细数据

僵尸ID

僵尸类别ID

战场编号

僵尸等级

僵尸数量

战斗日期

战斗ID

统计战斗成果,每月例行填写下列表格:

本月累计

上月同期

去年同期

环比

同比

战功

战斗次数

每场战功

其中,战功就是僵尸等级乘以僵尸数量。打败的僵尸越多,打败的僵尸的等级越高,战功越大。

02|熟悉工具

飞碟瓜去这个网址,下载了Python蟒蛇的集成开发环境Anaconda。

然后他念起了咒语:『 天灵灵,地灵灵,Python蟒蛇快显灵。拿出熊猫工具包,日期时间包也要。帮我解决大难题,你的好处少不了 』。

Python蟒蛇回答说:『 SyntaxError: invalid character in identifier 』语法错误:标识符中的字符无效。

向日葵老师提醒道:『 你想驱使Python蟒蛇帮你干活,必须是你去学习蛇语,而不是蟒蛇学习咒语。好在蛇语不难学,跟英语挺相似的 』。

飞碟瓜无奈的打开了Anaconda里面的jupyter notebook软件,给大蟒蛇下达了指令。

代码语言:javascript
复制
from datetime import datetime
import pandas as pd

03|获取数据

飞碟瓜继续下达指令:

蟒蛇,战斗成果的原始数据文件的位置,放在了"d:\documents\temp1\"的文件夹里面,文件名字叫做"battle.xlsx"。

有一个叫做“战斗日期”的列,是记录日期的,你可不要以为是数值,你拿出你的日期时间工具包,把它处理一下,要保证理解为日期的值。

文件的编码是GBK编码的,别搞乱码了。

把文件取出之后,放在一个DataFrame数据框架里面,并且起个名字叫做data“ (DataFrame是由一组数据与一对索引(行索引和列索引)组成的表格型数据结构)

代码语言:javascript
复制
data=pd.read_excel(r'd:\documents\temp1\battle.xlsx',parse_dates=['战斗日期'],encoding='gbk')

04|熟悉数据

『 弄好了吗 』,显示dataframe的前五行数据,给我看看吧。

代码语言:javascript
复制
print (data.head())

蟒蛇回复:

代码语言:javascript
复制
  僵尸ID     僵尸类别ID  战场编号  僵尸等级  僵尸数量       战斗日期                     战斗ID
0  30006206  915000003  CDNL     4         1             2018-01-01          20170103CDLG000210052759
1  30163281  914010000  CDNL     1         2             2018-01-02          20170103CDLG000210052759
2  30200518  922000000  CDNL     2         1             2018-01-03          20170103CDLG000210052759
3  29989105  922000000  CDNL     1         3             2018-01-04          20170103CDLG000210052759
4  30179558  915000100  CDNL     4         1             2018-01-05          20170103CDLG000210052759

05|处理数据

看一下是否有缺失值,各个列的数据类型是什么

代码语言:javascript
复制
print (data.info())

蟒蛇应答:

代码语言:javascript
复制
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3478 entries, 0 to 3477
Data columns (total 7 columns):
僵尸ID      3478 non-null int64
僵尸类别ID    3478 non-null int64
战场编号      3478 non-null object
僵尸等级      3478 non-null int64
僵尸数量      3478 non-null int64
战斗日期      3478 non-null datetime64[ns]
战斗ID      3478 non-null object
dtypes: datetime64[ns](1), int64(4), object(2)
memory usage: 190.3+ KB
None

飞碟瓜看了一下,注意到

  • 所有的列都是3478行,全都没有空值(non-null)
  • 而且”战斗日期"的数据格式为datetime64[ns],符合要求。

查一下是否有异常的数值,比方说,僵尸数量为负数,僵尸等级大于5,目前如果存在这类数据,就属于异常值。

代码语言:javascript
复制
print(data.describe())

蟒蛇回答:

代码语言:javascript
复制
 僵尸ID        僵尸类别ID         僵尸等级         僵尸数量
count     3.478000e+03  3.478000e+03  3478.000000  3478.000000
mean      3.004899e+07  9.214786e+08     2.526164     1.478723
std       7.303804e+04  9.653496e+06     1.109625     1.901963
min       2.998902e+07  9.100000e+08     1.000000     1.000000
25%       2.998915e+07  9.140701e+08     2.000000     1.000000
50%       3.001310e+07  9.220000e+08     3.000000     1.000000
75%       3.010167e+07  9.230000e+08     4.000000     2.000000
max       3.021483e+07  9.600000e+08     4.000000    45.000000

06|分析数据

本月累计

上月同期

去年同期

环比

同比

战功=僵尸等级*僵尸数量

战斗次数=战斗ID去重计数

每场战功=战功/战斗次数

筛选出本月累计、上月同期、去年同期 这三个时间段范围内,对应的数据框架DataFrame。

代码语言:javascript
复制
This_data=data[(data['战斗日期']>=datetime(2018,2,1))&(data['战斗日期']<=datetime(2018,2,28))]
Last_data=data[(data['战斗日期']>=datetime(2018,1,1))&(data['战斗日期']<=datetime(2018,1,31))]
Same_data=data[(data['战斗日期']>=datetime(2017,2,1))&(data['战斗日期']<=datetime(2017,2,28))]

编写函数,输入的参数为 各个时间段的数据框架DataFrame, 输出的值为 战功,战斗次数,每场战功的数据。

代码语言:javascript
复制
def get_month_data(perioddata):
    contribution=(perioddata['僵尸等级']*perioddata['僵尸数量']).sum()
    number_of_battles=perioddata['战斗ID'].drop_duplicates().count()
    s_t=(contribution/number_of_battles)
    print (contribution,number_of_battles,s_t)
    return (contribution,number_of_battles,s_t)

调用函数,计算出需要的数据

代码语言:javascript
复制
contribution_1,number_of_battles_1,a_n_1=get_month_data(This_data)   #分别计算本月的战功,战斗次数,每场战功
contribution_2,number_of_battles_2,a_n_2=get_month_data(Last_data)   #分别计算上月的战功,战斗次数,每场战功
contribution_3,number_of_battles_3,a_n_3=get_month_data(Same_data)   #分别计算上年同期的战功,战斗次数,每场战功

合并三个时间段的指标到同一个DataFrame数据框架里面

  • 设定DataFrame的行名称是['战功','战斗次数','每场战功']
  • 设定DataFrame的列名称为['本月累计','上月同期','去年同期']
  • 第1行的数据项填充为'contribution_1(本月战功),contribution_2(上月战功),contribution_3(上年同期战功)
  • 第2行的数据项填充为'number_of_battles_1(本月战斗次数),number_of_battles_2(上月战斗次数),number_of_battles_3(上年同期战斗次数)
  • 第3行的数据项填充为'a_n_1(本月每场战功),a_n_2(上月每场战功),a_n_3(上年同期每场战功)
代码语言:javascript
复制
report=pd.DataFrame([[contribution_1,contribution_2,contribution_3],[number_of_battles_1,number_of_battles_2,number_of_battles_3],[a_n_1,a_n_2,a_n_3]],columns=['本月累计','上月同期','去年同期'],index=['战功','战斗次数','每场战功'])

增加环比和同比指标。

代码语言:javascript
复制
report['环比']=report['本月累计']/report['上月同期']-1
report['同比']=report['本月累计']/report['去年同期']-1

查看数据,并且导出文件到本地。

代码语言:javascript
复制
print(report)
report.to_excel(r'd:\documents\temp1\report.xlsx')

蟒蛇回复:

代码语言:javascript
复制
       本月累计 上月同期 去年同期 环比 同比
战功     4433 4237 4331 0.046259 0.023551
战斗次数 343 315 262 0.088889 0.30916
每场战功 12.9242 13.45079 16.53053 -0.03915 -0.21816

从此以后,每当有其他的植物花园发送来战斗情况表的时候,飞碟瓜只需要召唤一下,Python蟒蛇就会刷刷刷的算好需要的数据,贴心地生成Excel文件。飞碟瓜就再也不用加班啦。

07|完整的Python代码

代码语言:javascript
复制
from datetime import datetime
import pandas as pd
data=pd.read_excel(r'd:\documents\temp1\battle.xlsx',parse_dates=['战斗日期'],encoding='gbk')
print (data.head())
print (data.info())
print(data.describe())
def get_month_data(perioddata):
    contribution=(perioddata['僵尸等级']*perioddata['僵尸数量']).sum()
    number_of_battles=perioddata['战斗ID'].drop_duplicates().count()
    s_t=(contribution/number_of_battles)
    print (contribution,number_of_battles,s_t)
    return (contribution,number_of_battles,s_t)
This_data=data[(data['战斗日期']>=datetime(2018,2,1))&(data['战斗日期']<=datetime(2018,2,28))]
Last_data=data[(data['战斗日期']>=datetime(2018,1,1))&(data['战斗日期']<=datetime(2018,1,31))]
Same_data=data[(data['战斗日期']>=datetime(2017,2,1))&(data['战斗日期']<=datetime(2017,2,28))]
contribution_1,number_of_battles_1,a_n_1=get_month_data(This_data)   #分别计算本月的战功,战斗次数,每场战功
contribution_2,number_of_battles_2,a_n_2=get_month_data(Last_data)   #分别计算上月的战功,战斗次数,每场战功
contribution_3,number_of_battles_3,a_n_3=get_month_data(Same_data)   #分别计算上年同期的战功,战斗次数,每场战功
report=pd.DataFrame([[contribution_1,contribution_2,contribution_3],[number_of_battles_1,number_of_battles_2,number_of_battles_3],[a_n_1,a_n_2,a_n_3]],columns=['本月累计','上月同期','去年同期'],index=['战功','战斗次数','每场战功'])
report['环比']=report['本月累计']/report['上月同期']-1
report['同比']=report['本月累计']/report['去年同期']-1
print(report)
report.to_excel(r'd:\documents\temp1\report.xlsx')
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 俊红的数据分析之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 00|花园里的驱蛇者
  • 01|明确目的
  • 02|熟悉工具
  • 03|获取数据
  • 04|熟悉数据
  • 05|处理数据
  • 06|分析数据
  • 07|完整的Python代码
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档