驱使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如何实现。
『 事务千万件,流程第一件。不按流程走,返工流眼泪 』。这是向日葵老师反复强调的事情,也是飞碟瓜长期工作的经验。
现在,飞碟瓜就按照数据分析的基本流程,一步步的开始分析了。
根据各个花园上报的这样的明细数据
僵尸ID | 僵尸类别ID | 战场编号 | 僵尸等级 | 僵尸数量 | 战斗日期 | 战斗ID |
---|---|---|---|---|---|---|
统计战斗成果,每月例行填写下列表格:
本月累计 | 上月同期 | 去年同期 | 环比 | 同比 | |
---|---|---|---|---|---|
战功 | |||||
战斗次数 | |||||
每场战功 |
其中,战功就是僵尸等级乘以僵尸数量。打败的僵尸越多,打败的僵尸的等级越高,战功越大。
飞碟瓜去这个网址,下载了Python蟒蛇的集成开发环境Anaconda。
然后他念起了咒语:『 天灵灵,地灵灵,Python蟒蛇快显灵。拿出熊猫工具包,日期时间包也要。帮我解决大难题,你的好处少不了 』。
Python蟒蛇回答说:『 SyntaxError: invalid character in identifier 』语法错误:标识符中的字符无效。
向日葵老师提醒道:『 你想驱使Python蟒蛇帮你干活,必须是你去学习蛇语,而不是蟒蛇学习咒语。好在蛇语不难学,跟英语挺相似的 』。
飞碟瓜无奈的打开了Anaconda里面的jupyter notebook软件,给大蟒蛇下达了指令。
from datetime import datetime
import pandas as pd
飞碟瓜继续下达指令:
蟒蛇,战斗成果的原始数据文件的位置,放在了"d:\documents\temp1\"的文件夹里面,文件名字叫做"battle.xlsx"。
有一个叫做“战斗日期”的列,是记录日期的,你可不要以为是数值,你拿出你的日期时间工具包,把它处理一下,要保证理解为日期的值。
文件的编码是GBK编码的,别搞乱码了。
把文件取出之后,放在一个DataFrame数据框架里面,并且起个名字叫做data“ (DataFrame是由一组数据与一对索引(行索引和列索引)组成的表格型数据结构)
data=pd.read_excel(r'd:\documents\temp1\battle.xlsx',parse_dates=['战斗日期'],encoding='gbk')
『 弄好了吗 』,显示dataframe的前五行数据,给我看看吧。
print (data.head())
蟒蛇回复:
僵尸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
看一下是否有缺失值,各个列的数据类型是什么
print (data.info())
蟒蛇应答:
<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
飞碟瓜看了一下,注意到
查一下是否有异常的数值,比方说,僵尸数量为负数,僵尸等级大于5,目前如果存在这类数据,就属于异常值。
print(data.describe())
蟒蛇回答:
僵尸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
本月累计 | 上月同期 | 去年同期 | 环比 | 同比 | |
---|---|---|---|---|---|
战功=僵尸等级*僵尸数量 | |||||
战斗次数=战斗ID去重计数 | |||||
每场战功=战功/战斗次数 |
筛选出本月累计、上月同期、去年同期 这三个时间段范围内,对应的数据框架DataFrame。
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, 输出的值为 战功,战斗次数,每场战功的数据。
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)
调用函数,计算出需要的数据
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数据框架里面
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')
蟒蛇回复:
本月累计 上月同期 去年同期 环比 同比
战功 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文件。飞碟瓜就再也不用加班啦。
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')
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有