您好,登錄后才能下訂單哦!
esproc:
A | |
1 | =now() |
2 | =file("C:\\Users\\Sean\\Desktop\\esproc_vs_python\\EMPLOYEE.txt") |
3 | =A2.import@t() |
4 | =A3.derive(age(BIRTHDAY):Age,NAME+""+SURNAME:Fullname) |
5 | =interval@ms(A1,now()) |
A4:我們用T表示序表。T.derive()表示增加字段。這里用age(日期)計算出年齡,作為Age字段。用NAME,SURNAME得到Fullname。
A5:計算運算時間(interval:計算時間間隔。@ms表示以毫秒為單位)
python:
import time
import pandas as pd
import datetime
s = time.time()
data = pd.read_csv("C:/Users/Sean/Desktop/esproc_vs_python/EMPLOYEE.txt",sep="\t")
today = datetime.datetime.today().year
data["Age"] = today-pd.to_datetime(data["BIRTHDAY"]).dt.year
data["Fullname"]=data["NAME"]+data["SURNAME"]
print(data)
e = time.time()
print(e-s)
計算出BIETHDAY字段的值(日期)距今天的年數,作為年齡字段。用NAME+SURNAME作為Fullname字段
結果
esproc:
python:
耗時 | |
esproc | 0.008 |
python | 0.020 |
esproc:
A | |
1 | =now() |
2 | =file("C:\\Users\\Sean\\Desktop\\esproc_vs_python\\EMPLOYEE.txt") |
3 | =A2.import@t() |
4 | =A3.new(#1,#2,#3).to(3:10) |
5 | =interval@ms(A1,now()) |
A4:T.new()表示新建序表。這里以第1,2,3個字段作為新表的字段。T.A,表示取出序列中包含的行號。
python:
import time
import pandas as pd
import datetime
s = time.time()
data = pd.read_csv("C:/Users/Sean/Desktop/esproc_vs_python/EMPLOYEE.txt",sep="\t")
data = data.iloc[2:10,:3]
print(data)
e = time.time()
print(e-s)
使用df.iloc[]切片獲得3~10條記錄,前三個字段(dataframe的字段號和記錄號都是從0開始計數的)。
結果:
esproc:
python:
耗時 | |
esproc | 0.008 |
python | 0.010 |
esproc:
A | |
1 | =now() |
2 | =file("C:\\Users\\Sean\\Desktop\\esproc_vs_python\\EMPLOYEE.txt") |
3 | =A2.import@t() |
4 | =A3.select(STATE=="California") |
5 | =interval@ms(A1,now()) |
A4:T.select()篩選符合條件的記錄。這里是篩選STATE=="California"為真的記錄
python:
import time
import pandas as pd
import datetime
s = time.time()
data = pd.read_csv("C:/Users/Sean/Desktop/esproc_vs_python/EMPLOYEE.txt",sep="\t")
data = data[data['STATE']=="California"]
print(data)
e = time.time()
print(e-s)
取出data['STATE']=="California"的記錄
結果:
esproc:
python:
耗時 | |
esproc | 0.007 |
python | 0.028 |
A | |
1 | =now() |
2 | =file("C:\\Users\\Sean\\Desktop\\esproc_vs_python\\EMPLOYEE.txt") |
3 | =A2.import@t() |
4 | =A3.min(SALARY) |
5 | =A3.max(SALARY) |
6 | =A3.avg(SALARY) |
7 | =A3.sum(SALARY) |
8 | =A3.(SALARY).median() |
9 | =A3.(float(SALARY)).variance() |
10 | =interval@ms(A1,now()) |
A4:T.min()計算字段最小值
A5:T.max()計算字段最大值
A6:T.avg()計算字段平均值
A7:T.sum()計算字段總和
A8:計算字段中位數。A.median(k:n)函數,參數全省略時,如果序列長度是奇數返回中間位置值;如果序列長度是偶數返回中間兩個值的平均值。
A9:T.variance()計算字段方差。
python
s = time.time()
data = pd.read_csv("C:/Users/Sean/Desktop/esproc_vs_python/EMPLOYEE.txt",sep="\t")
min = data["SALARY"].min()
max = data["SALARY"].max()
avg = data["SALARY"].mean()
sum = data["SALARY"].sum()
median = data["SALARY"].median()
var = data["SALARY"].var()
print(min,max,avg,sum,median,var)
e = time.time()
print(e-s)
df[字段名]表示取得字段。min(),max(),mean(),sum(),median(),var()分別計算最小值,最大值,平均數,總和,中位數,方差。
結果
常用計算 | esproc | python | 說明 |
最小值 | 3000 | 3000 | |
最大值 | 16000 | 16000 | |
平均值 | 7395 | 7395.0 | |
總和 | 3697500 | 3697500 | |
中位數 | 7000.0 | 7000.0 | |
方差 | 5324475 | 5335145.29 | 總體方差和樣本方差的區別 |
耗時 | 0.004 | 0.007 |
esproc:
A | |
1 | =now() |
2 | =file("C:\\Users\\Sean\\Desktop\\esproc_vs_python\\EMPLOYEE.txt") |
3 | =A2.import@t() |
4 | =A3.groups(DEPT:Dept;count(GENDER=="M"):Mcount, count(GENDER=="F"):Fcount) |
5 | =interval@ms(A1,now()) |
A4:T.groups()表示以DEPT分組,計算GENDER==“M”或GENDER==“F”的值,得到各部門男女員工的數量。
python
s = time.time()
data = pd.read_csv("C:/Users/Sean/Desktop/esproc_vs_python/EMPLOYEE.txt",sep="\t")
group = data.groupby(['DEPT','GENDER']).size()
print(group)
e = time.time()
print(e-s)
截取GENDER==‘M’或者GENDER==‘F’的切片以DEPT通過goupby()函數得到以DEPT的分組。最后用size()函數得到結果。
結果:
esproc:
python:
耗時 | |
esproc | 0.004 |
python | 0.008 |
esproc:
A | |
1 | =now() |
2 | =file("C:\\Users\\Sean\\Desktop\\esproc_vs_python\\EMPLOYEE.txt") |
3 | =A2.import@t() |
4 | =A3.groups(GENDER;avg(age(BIRTHDAY)):Age) |
5 | =interval@ms(A1,now()) |
A4:T.groups()用來分組,avg()計算平均值,age()根據日期計算時間間隔。
python
s = time.time()
data = pd.read_csv("C:/Users/Sean/Desktop/esproc_vs_python/EMPLOYEE.txt",sep="\t")
data["Age"] = today-pd.to_datetime(data["BIRTHDAY"]).dt.year
avg_age = data.groupby('GENDER')['Age'].mean()
print(avg_age)
e = time.time()
print(e-s)
計算得到Age字段。然后用groupby()函數以GENDER分組,最后通過mean()函數得到平均值。
結果:
esproc:
python:
耗時 | |
esproc | 0.005 |
python | 0.008 |
esproc:
A | |
1 | =now() |
2 | =file("C:\\Users\\Sean\\Desktop\\esproc_vs_python\\EMPLOYEE.txt") |
3 | =A2.import@t() |
4 | =a=0,A3.max(a=if(SALARY>SALARY[-1],a+1,0)) |
5 | =interval@ms(A1,now()) |
A4:if(condition,x1,x2)表示如果條件成立,if語句的值為x1,否則值為x2,在這兒計算如果SALARY比前一個員工薪水高的話a=a+1。從而得到A3.(a),其中a隨著if語句不斷的變化。最后得到一個序列,max()函數得到最大值。
python
s = time.time()
data = pd.read_csv("C:/Users/Sean/Desktop/esproc_vs_python/EMPLOYEE.txt",sep="\t")
a=0 ; m=0
for i in data['SALARY'].shift(0)>data['SALARY'].shift(1):
a=0 if i==False else a+1
m = a if m < a else m
print(m)
e = time.time()
print(e-s)
df.shift(0)表示當前記錄,df.shift(n)表示前面第n條記錄,data['SALARY'].shift(0)>data['SALARY'].shift(1) 得到pandas的series結構。循環如果為假(False)表示當前記錄小于或等于上一條記錄,把a置0,如果為真則加1。m的作用:當m<a時,把a賦值給m,否則m不變,最終得到a的最大值。
結果:
最大人數 | 耗時 | |
esproc | 4 | 0.005 |
python | 4 | 0.008 |
esproc:
A | B | |
1 | =now() | |
2 | =file("C:\\Users\\Sean\\Desktop\\esproc_vs_python\\EMPLOYEE_nan.txt") | |
3 | =A2.import@t() | |
4 | for A3.fno() | >A3.sort(rand()).to(5+rand(6)).field(A4,null) |
5 | =interval@ms(A1,now()) |
A4:T.fno()得到序表的字段數量。
B4:T.field(f,x)將x序列中的成員依次賦值給A中第F個字段的字段值或者字符串參數F的值。F<0時從后往前排。F越界和不存時不執行
python:
s = time.time()
data = pd.read_csv("C:/Users/Sean/Desktop/esproc_vs_python/EMPLOYEE.txt",sep="\t")
for i in data.columns:
for j in range(random.randint(5,10)):
data[i][random.randint(0,500)]=np.nan
print(data)
e = time.time()
print(e-s)
循環所有的字段,隨機循環5~10次,將字段的某個隨機值設置成np.nan
結果:
耗時 | |
esproc | 0.008 |
python | 0.710 |
esproc:
A | |
1 | =now() |
2 | =file("C:\\Users\\Sean\\Desktop\\esproc_vs_python\\EMPLOYEE_nan.txt") |
3 | =A2.import@t() |
4 | =A3.select(!~.array().pos(null)) |
5 | =interval@ms(A1,now()) |
A4:篩選null所在位置為空的記錄,即不包含null的記錄。用r表示記錄,r.array()表示把r中的字段值返回成序列。A.pos()獲得序列成員序號。
python:
s = time.time()
data = pd.read_csv("C:/Users/Sean/Desktop/esproc_vs_python/EMPLOYEE_nan.txt",sep="\t")
data = data.dropna()
print(data)
e = time.time()
print(e-s)
使用dropna()函數得到不包含np.nan的記錄
結果:
耗時 | |
esproc | 0.003 |
python | 0.033 |
esproc:
A | B | |
1 | =now() | |
2 | =file("C:\\Users\\Sean\\Desktop\\esproc_vs_python\\EMPLOYEE_nan.txt") | |
3 | =A2.import@t() | |
4 | >A3.field("EID",to(A3.len())) | |
5 | for 2,A3.fno() | =A3.select(!~.field(A5) ) |
6 | =A3\B5 | |
7 | >B5.run(~.field(A5,B6(rand(B6.len())+1).field(A5))) | |
8 | =interval@ms(A1,now()) |
A4:T.field(F,A) 將A序列中的成員依次賦值給T中第F個字段的字段值或者字符串參數F的值。
B5:篩選字段為null的記錄
B6:差集,得到不為null的記錄
B7:這里需要特別注意一下field()函數,r.field(F)取得記錄的第F個字段的字段值或者字符串參數F的值。r.field(F,X) 修改記錄r中第F個字段的字段值或者字符串參數F的值為x。A3.select(#${A5}==null)取出A3中某個字段為null的記錄序列,用run()函數循環修改該序列中的每條記錄。
python:
s = time.time()
data = pd.read_csv("C:/Users/Sean/Desktop/esproc_vs_python/EMPLOYEE_nan.txt",sep="\t")
data['EID']=pd.Series([i for i in range(1,len(data)+1)])
for col in data.columns:
nonan_list = list(data[col][~pd.isna(data[col])])
fill_list = [nonan_list[random.randint(0,len(nonan_list))] for i in range(len(data[col][pd.isna(data[col])]))]
data[col][pd.isna(data[col])]=fill_list
e = time.time()
print(e-s)
將字段名為EID的值修改為遞增的序列。這里用pd.Series()生成。
循環所有字段。df[col][pd.isna(df)]得到df中包含nan的值。~表示非。nonan_list表示當前列不包含nan的所有值組成的list。fill_list表示隨機生成的要填充nan的值的list。
將fill_list中的值賦值給包含nan的記錄。
結果:
esproc:
python
耗時 | |
esproc | 0.008 |
python | 0.144 |
esproc:
A | B | |
1 | =now() | |
2 | =file("C:\\Users\\Sean\\Desktop\\esproc_vs_python\\EMPLOYEE_nan.txt") | |
3 | =A2.import@t() | |
4 | >A3.field("EID",to(1,A3.len())) | |
5 | for 2,A3.fno()-1 | =A3.group(!~.field(A5)) |
6 | =B5(1).(~.field(A5)) | |
7 | >B5(2).run(~.field(A5,B6(rand(B6.len())+1))) | |
8 | =A3.avg(SALARY) | |
9 | =A3.select(!SALARY).run(~.field("SALARY",A8)) | |
10 | =interval@ms(A1,now()) |
上例中,B5,B6的運算會導致把序列遍歷兩遍,這里進行了改進
B5:A.group(xi) 將序列/排列按照一個或多個字段/表達式進行等值分組,結果為組集構成的序列。這里是將序表分成兩組,第一組為該字段不包含null的,第二組為包含null的。
B6:取得該字段去重后的字段值
B7:這里需要特別注意一下field()函數,r.field(F)取得記錄的第F個字段的字段值或者字符串參數F的值。r.field(F,X) 修改記錄r中第F個字段的字段值或者字符串參數F的值為x。r.run(xi,…),針對記錄r計算表達式x,最后返回記錄r。此函數通常用于修改r的字段值
B9:和B7的原理一樣,利用field()函數修改SALARY的字段值為A8中計算出來的平均值。
python:
s = time.time()
data = pd.read_csv("C:/Users/Sean/Desktop/esproc_vs_python/EMPLOYEE_nan.txt",sep="\t")
data['EID']=pd.Series([i for i in range(1,len(data)+1)])
for col in list(data.columns)[1:-1]:
nonan_list = list(data[col][~pd.isna(data[col])])
fill_list = [nonan_list[random.randint(0,len(nonan_list))] for i in range(len(data[col][pd.isna(data[col])]))]
data[col][pd.isna(data[col])]=fill_list
data['SALARY'].fillna(data['SALARY'].mean(),inplace=True)
print(data.loc[180:190])
print(e-s)
將字段名為EID的值修改為遞增的序列。這里用pd.Series()生成。
循環所有字段第一到倒數第二個字段。df[col][pd.isna(df)]得到df中包含nan的值。~表示非。nonan_list表示當前列不包含nan的所有值組成的list。fill_list表示隨機生成的要填充nan的值的list。
將fill_list中的值賦值給包含nan的記錄。
df.fillna(df[s].mean())表示用字段s的平均值填充缺失值。
結果:
esproc:
python
耗時 | |
esproc | 0.006 |
python | 0.165 |
小結:本節我們用11個例子對數據進行簡單的計算,esproc和python都用到了比較多的函數,還用到了一些相對復雜的組合應用,這就不得不說esproc現階段的一個缺點了,查閱資料和使用案例相對于python太少了,原因就是使用者太少。但是在描述效率和執行效率方面,esproc的優勢太明顯了,因此我們要多使用esproc提高工作效率,同時也可以完善esproc的缺點。esproc中的函數功能很強大,需要不斷的使用,來充分理解函數的用法,達到熟能生巧最終精通的地步。
EMPLOYEE.txt
EMPLOYEE_nan.txt
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。