还是工作上遇到的问题,做Excel的“表哥”做了这么久,才试着用R和Python来提升效率,说来真惭愧,但是一旦接触了就好像打开了潘多拉的盒子,一发不可收拾(希望真的是这样,坚持下去。。。)
好了,废话不说。现在工作上遇到的一个问题背景是这样的:因为商品的ID与单价,需要根据最新的情况来修改,过去都是在excel上筛选出来再vlookup来做,做完还得重新算其他相关列的数据。
以下是用R和Python来实现这样的需求,直接上代码和注释。
(总结:对比下来,R的运行效率高太多了,可能是专门对excel这种数据的关系,或者是本人对Python功力低下的原因,如果有高人指点改进改进,随时欢迎!!!)
先来R 的:
#R语言脚本
#安装用到的包
#install.packages("sqldf")
#devtools::install_github(c("ramnathv/htmlwidgets", "smartinsightsfromdata/rpivotTable"))
#install.packages("plyr")
library(xlsx) #常规的写xlsx的库,但是对比openxlsx效率欠佳
library(readxl) #常规的读readxl的库,效率比openxlsx快,但是有的字段格式出错
library(reshape2) #一些透视功能的函数依赖的库,如melt acast dcast 等
library(plyr)
library(rpivotTable) #github上开源的专门数据透视的可视化的库,效果如excel的数据透视
library(openxlsx) #导入导出xlsx效率高,且格式正确
library(sqldf) #sql语句的库,能对数据框进行有效的sql语句
data1=data.frame(read.xlsx('C:/Users/lenovo/Desktop/数据源.xlsx',sheet='Sheet1'))
data2=as.data.frame(read.xlsx('C:\\Users\\lenovo\\Desktop\\CPA\\单价列表.xlsx',sheet='Sheet1'))
##以下是针对需要变动的应用单价进行修改
for(i in 1:length(data2$ID)){
ai=which(data1$ID==data2$ID[i])
if(length(ai>0)){
data1$单价[ai]=data2$实际价格[i]
data1$税前收入=data1$激活数*data1$单价
data1$税后收入=data1$税前收/1.06
data1$AA税后收入 =data1$税后收入*data1$AA下载用户数占比
data1$BB税后收入 =data1$税后收入*data1$BB下载用户数占比
data1$CC税后收入 =data1$税后收入*data1$CC下载用户数占比
data1$单下载量价值 =data1$税前收入/data1$下载量
}
}
month_sum=sqldf('select 月份, sum(税后收入) from data1 group by 月份')
colnames(month_sum)=iconv(colnames(month_sum),'UTF-8','GBK')#把字段名称转化为GBK编码,否则乱码
day_sum =sqldf('select 日期, sum(税后收入) from data1 group by 日期')
colnames(day_sum)=iconv(colnames(day_sum),'UTF-8','GBK') #把字段名称转化为GBK编码,否则乱码
sheets=list("数据源"=data1,"月汇总"=month_sum,"日汇总"=day_sum) #新建工作簿列表
write.xlsx(sheets,'C:/Users/lenovo/Desktop/修正版.xlsx') #这个是用openxlsx,效率较快
#a=as.data.frame(read_excel('C:/Users/lenovo/Desktop/数据源.xlsx',sheet='Sheet1'))
#typeof(a)
# selectresult=subset(data1,select=c(月份,日期,税后分成,合作类型,
# AA下载用户数占比,
# BB下载用户数占比,
# CC下载用户数占比))
#month_sum=rpivotTable(data = selectresult, rows ="月份", vals ="税后分成", aggregatorName ="Sum", rendererName ="Table", width="100%", height="400px")
#day_sum=rpivotTable(data = selectresult, rows ="日期", vals ="税后分成", aggregatorName ="Sum", rendererName ="Table", width="100%", height="400px")
#write.xlsx(sheets,file = paste('C:/Users/lenovo/Desktop/0730.xlsx')) #这个是用xlsx库的,但是效率比较慢
再来个Python的:
#以下是Python脚本
import time
import numpy as np
import pandas as pd
import openpyxl
start = time.clock() #开始计时
# fileNameStr =r'C:\Users\lenovo\Desktop\数据源.xlsx' #需要处理的文件路径
# fileNameStr2 =r'C:\Users\lenovo\Desktop\单价列表.xlsx' #需要处理的文件路径
#
# xls=pd.ExcelFile(fileNameStr) #第二个参数可以为,dtype='object'
# datasource=xls.parse('Sheet1') #指定处理的工作簿
# data1=pd.DataFrame(datasource) #导入数据到数据框
#
# xls2=pd.ExcelFile(fileNameStr2) #第二个参数可以为,dtype='object'
# datasource2=xls2.parse('Sheet1') #指定处理的工作簿
# data2=pd.DataFrame(datasource2) #导入数据到数据框
data1 = pd.read_excel(r'C:\Users\lenovo\Desktop\数据源.xlsx', sheet_name='Sheet1')
data2 = pd.read_excel(r'C:\Users\lenovo\Desktop\CPA\单价列表.xlsx', sheet_name='Sheet1')
for i in range(0, len(data2)):
data1.loc[data1.ID == data2.loc[:, 'ID'][i], '单价'] = data2.loc[:, '实际价格'][i]
data1.loc[data1.ID!=0 ,'税前收入']=data1.单价*data1.激活数 #根据修改后是单价重算税前收入
data1.loc[data1.ID!=0 ,'税后收入']=data1.单价*data1.激活数/1.06 #根据修改后是单价重算税后收入
#分别以月和日的维度统计汇总收入
month_sum=data1.pivot_table(values='税后收入',index='月份',aggfunc='sum') #数据透视表 columns='commercial'
day_sum =data1.pivot_table(values='税后收入',index='日期',aggfunc='sum') #数据透视表 columns='commercial'
print("OK")
#输出到excel文件
nan_excel=pd.DataFrame() #先建立一个空excel
nan_excel.to_excel(r'C:\Users\lenovo\Desktop\输出修正版.xlsx') #打开那个空excel
writer = pd.ExcelWriter(r'C:\Users\lenovo\Desktop\输出修正版.xlsx') #写入上面修改后的数据框
sheets=['datasource','month','day'] #定义工作簿名称列表
for sheet in sheets:
data1.to_excel(writer, sheet_name='datasource')
month_sum.to_excel(writer, sheet_name='month')
day_sum.to_excel(writer, sheet_name='day')
writer.save() #保存以上操作,这一步很重要!
elapsed = (time.clock() - start) #结算计时
print("Time used:",elapsed) #输出总用时