[英]Python help optimize this function
data =
Symbol Value Day
0 AACG 1.8708 1
1 AACG 1.8500 2
2 AACG 1.8869 3
3 AACG 1.8200 4
4 AACG 1.8578 5
... ... ... ...
3407024 ZYXI 5.25 1
3407025 ZYXI 4.96 2
3407026 ZYXI 4.99 3
3407027 ZYXI 4.99 4
3407028 ZYXI 4.95 5
... ... ... ...
3407250 ZYXI 8.1500 227
3407251 ZYXI 8.2600 228
3407252 ZYXI 8.3900 229
3407253 ZYXI 8.1200 230
3407254 ZYXI 8.0700 231
import pandas as pd
import numpy as np
for index, row in data.iterrows():
for i in range(1, 91):
cstr = 'day-' + str(i)
val = 'NaN'
try:
val = float(data[np.logical_and(data['Symbol'] == row['Symbol'],
data['Day'] == row['Day'] - i)].Value)
except:
val = 'NaN'
data.loc[index,cstr] = val
function 循環遍歷數據幀中的每一行
對於數據框中的每一行,它循環 90 次 (i)
對於每個循環,它會添加一個帶有值的列
value 是數據框中的值,其符號與行相同,但天為行中的天減去 i
output =
Symbol Value Day day-1 day-2 day-3 day-4... day-89 day-90
0 AACG 1.8708 1 NaN NaN NaN NaN
1 AACG 1.8500 2 1.8708 NaN NaN NaN
2 AACG 1.8869 3 1.8500 1.8708 NaN NaN
3 AACG 1.8200 4 1.8869 1.8500 1.8708 NaN
4 AACG 1.8578 5 1.8200 1.8869 1.8500 1.8708
5 AACG 1.8709 6 1.8578 1.8200 1.8869 1.8500
6 AACG 1.8700 7 1.8709 1.8578 1.8200 1.8869
7 AACG 1.8800 8 1.8700 1.8709 1.8578 1.8200
8 AACG 1.8000 9 1.8800 1.8700 1.8709 1.8578
9 AACG 1.7900 10 1.8000 1.8800 1.8700 1.8709
嘗試使用shift
和pd.concat
N = 5
df_new = pd.DataFrame()
for i,grp in df.groupby('Symbol'):
l = pd.concat([grp['Value'].shift(i).rename(f'Day_{i}') for i in range(1,N)], axis=1)
final_df = pd.concat([grp, l], axis=1)
df_new = df_new.append(final_df)
或者
def f(x):
x['Day-0'] = x['Value']
for i in range(1,N+1):
x[f'Day-{i}'] = x[f'Day-{i-1}'].shift()
x.drop('Day-0', inplace=True ,axis=1)
return x
final_df = df.groupby('Symbol').apply(f)
**final_df:"
您可以執行以下操作:
Day_
+ str(i)
,其中 i 的范圍從 1 到 90。np.NaN
作為值。groupby(Symbol)
之后執行Value
的 shift(1)執行此操作的代碼是:
c = ['Symbol','Value','Day']
d = [['AACG',1.8708,1],
['AACG',1.8500,2],
['AACG',1.8869,3],
['AACG',1.8200,4],
['AACG',1.8578,5],
['ZYXI',5.25,1],
['ZYXI',4.96,2],
['ZYXI',4.99,3],
['ZYXI',4.99,4],
['ZYXI',4.95,5]]
import pandas as pd
import numpy as np
df = pd.DataFrame(d,columns=c)
cols = {'Day_'+str(i):np.NaN for i in range(1,91)}
df = pd.concat([df,pd.DataFrame(cols,index=df.index)], axis=1)
for i in range (1,91):
df['Day_'+str(i)] = df.groupby(['Symbol'])['Value'].transform(lambda x:x.shift(i))
print (df)
output 將是:
Symbol Value Day Day_1 Day_2 ... Day_86 Day_87 Day_88 Day_89 Day_90
0 AACG 1.8708 1 NaN NaN ... NaN NaN NaN NaN NaN
1 AACG 1.8500 2 1.8708 NaN ... NaN NaN NaN NaN NaN
2 AACG 1.8869 3 1.8500 1.8708 ... NaN NaN NaN NaN NaN
3 AACG 1.8200 4 1.8869 1.8500 ... NaN NaN NaN NaN NaN
4 AACG 1.8578 5 1.8200 1.8869 ... NaN NaN NaN NaN NaN
5 ZYXI 5.2500 1 NaN NaN ... NaN NaN NaN NaN NaN
6 ZYXI 4.9600 2 5.2500 NaN ... NaN NaN NaN NaN NaN
7 ZYXI 4.9900 3 4.9600 5.2500 ... NaN NaN NaN NaN NaN
8 ZYXI 4.9900 4 4.9900 4.9600 ... NaN NaN NaN NaN NaN
9 ZYXI 4.9500 5 4.9900 4.9900 ... NaN NaN NaN NaN NaN
我將為AACG
創建一個包含 90 多行的 dataframe 並向您展示結果,以便您可以看到 Day_90 將具有正確的值。
我添加了幾條記錄,以顯示 90 天列已填滿。
>>> df.iloc[80:100]
Symbol Value Day Day_1 Day_2 ... Day_86 Day_87 Day_88 Day_89 Day_90
80 AACG 1.8659 81 1.8658 1.8657 ... NaN NaN NaN NaN NaN
81 AACG 1.8660 82 1.8659 1.8658 ... NaN NaN NaN NaN NaN
82 AACG 1.8661 83 1.8660 1.8659 ... NaN NaN NaN NaN NaN
83 AACG 1.8662 84 1.8661 1.8660 ... NaN NaN NaN NaN NaN
84 AACG 1.8663 85 1.8662 1.8661 ... NaN NaN NaN NaN NaN
85 AACG 1.8664 86 1.8663 1.8662 ... NaN NaN NaN NaN NaN
86 AACG 1.8665 87 1.8664 1.8663 ... 1.8708 NaN NaN NaN NaN
87 AACG 1.8666 88 1.8665 1.8664 ... 1.8500 1.8708 NaN NaN NaN
88 AACG 1.8667 89 1.8666 1.8665 ... 1.8869 1.8500 1.8708 NaN NaN
89 AACG 1.8668 90 1.8667 1.8666 ... 1.8200 1.8869 1.8500 1.8708 NaN
90 AACG 1.8669 91 1.8668 1.8667 ... 1.8578 1.8200 1.8869 1.8500 1.8708
91 AACG 1.8670 92 1.8669 1.8668 ... 1.8584 1.8578 1.8200 1.8869 1.8500
92 AACG 1.8671 93 1.8670 1.8669 ... 1.8585 1.8584 1.8578 1.8200 1.8869
93 AACG 1.8672 94 1.8671 1.8670 ... 1.8586 1.8585 1.8584 1.8578 1.8200
94 AACG 1.8673 95 1.8672 1.8671 ... 1.8587 1.8586 1.8585 1.8584 1.8578
95 ZYXI 5.2500 1 NaN NaN ... NaN NaN NaN NaN NaN
96 ZYXI 4.9600 2 5.2500 NaN ... NaN NaN NaN NaN NaN
97 ZYXI 4.9900 3 4.9600 5.2500 ... NaN NaN NaN NaN NaN
98 ZYXI 4.9900 4 4.9900 4.9600 ... NaN NaN NaN NaN NaN
99 ZYXI 4.9500 5 4.9900 4.9900 ... NaN NaN NaN NaN NaN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.