Python 基于另一个数据帧的数据帧计算
Python Dataframe calculations based on another dataframe
我有 2 个数据框。
Datraframe1
Dataframe2
我想使用以下计算将 DF2 中的数据填充到 DF1 列。
Prev_close 列:对于每个(符号,日期)作为 df1 中的键,在 df2 中查找(符号,日期)并获取前一行“CLOSE”列值并填充到 DF1“prev_close”列中。
以下其余列采用 % 格式。
D1L 列:对于每个(符号,日期)作为 df1 中的键,在 df2 中查找(符号,日期)并获取“LOW”列值并作为公式填充到 DF1“D1L”列中(“low”-“prev_close") / (prev_close)
D1H 列:对于 df1 中的每个(符号,日期)作为键,在 df2 中查找(符号,日期)并获取“HIGH”列值并作为公式填充到 DF1“D1H”列中(“high” - "prev_close" ) / (prev_close)
D2L 列:对于每个(符号,日期)作为 df1 中的键,在 df2 中查找(符号,日期)并在查找行(当前行 + 1)“LOW”列值后获取第二行并填充到 DF1 “D2L”列作为公式 (“low” - “prev_close”) / (prev_close)
D2H 列:对于每个(符号,日期)作为 df1 中的键,在 df2 中查找(符号,日期)并在查找行(当前行 + 1)“HIGH”列值后获取第二行并填充到 DF1 中“D2H”列作为公式 ("high" - "prev_close" ) / (prev_close)
D3L 列:对于每个(符号,日期)作为 df1 中的键,在 df2 中查找(符号,日期)并在查找行(当前行 + 2)“LOW”列值后获取第 3 行并填充到 DF1 中“D3L”列作为公式 (“low” - “prev_close”) / (prev_close)
D3H 列:对于每个(符号,日期)作为 df1 中的键,在 df2 中查找(符号,日期)并在查找行(当前行 + 2)“HIGH”列值后获取第 3 行并填充到 DF1 “D3H”列作为公式 ("high" - "prev_close" ) / (prev_close)
最后,我期待输出如下,感谢您提供的任何帮助或代码。
Expected output of Dataframe1
我试着把它分解 step-by-step 以便更容易理解。
df1
和 df2
是您提供的。
groupby
函数确保我们不会混淆每个符号。
shift
函数获取上一行或下一行。
apply
部分用于在无效时将结果转换为空白,或在有效时将百分比转换为小数点后 3 位。 {:.3%}
您可以更改此数字以更改所需的小数位数。
merge
函数是仅获取您需要的行和计算的最后一步。
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'Symbol': ['SPX', 'SPX', 'SPX', 'AAPL', 'AAPL', 'AAPL', 'AAPL', 'AAPL', 'AAPL'],
'open': [2665.69, 2689.6, 2692.165, 123.5402, 128.1923, 124.5984, 121.5435, 120.7749, 120.7249],
'high': [2712.81, 2722.22, 2712.31, 127.7131, 128.5017, 125.4968, 123.3904, 121.7332, 120.7948],
'low': [2656.505, 2667.57, 2668.65, 122.5818, 124.798, 121.6334, 118.4189, 117.3706, 116.0129],
'close': [2697.82, 2683.36, 2695.03, 127.5733, 124.9078, 121.853, 119.9263, 121.2141, 116.1627],
'volume': [1483784, 1231996, 1198337, 1.16E+08, 1.02E+08, 1.13E+08, 1.78E+08, 1.54E+08, 1.54E+08],
'date': [20220301, 20220302, 20220303, 20220301, 20220302, 20220303, 20220304, 20220305, 20220306]})
df2 = pd.DataFrame({'Symbol': ['SPX', 'AAPL'], 'date': [20220302, 20220304]})
dfcal = df1
dfcal['Prev_Close'] = df1.groupby(['Symbol'])['close'].shift(1)
dfcal['D1L'] = ((dfcal.groupby(['Symbol'])['low'].shift(0) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dfcal['D1H'] = ((dfcal.groupby(['Symbol'])['high'].shift(0) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dfcal['D2L'] = ((dfcal.groupby(['Symbol'])['low'].shift(-1) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dfcal['D2H'] = ((dfcal.groupby(['Symbol'])['high'].shift(-1) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dfcal['D3L'] = ((dfcal.groupby(['Symbol'])['low'].shift(-2) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dfcal['D3H'] = ((dfcal.groupby(['Symbol'])['high'].shift(-2) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dfcal['D4L'] = ((dfcal.groupby(['Symbol'])['low'].shift(-3) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dfcal['D4H'] = ((dfcal.groupby(['Symbol'])['high'].shift(-3) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dffinal = pd.merge(df2, dfcal[['Symbol', 'date', 'Prev_Close', 'D1L', 'D1H', 'D2L', 'D2H', 'D3L', 'D3H', 'D4L', 'D4H']], on = ['Symbol', 'date'], how = 'left')
dffinal
我有 2 个数据框。
Datraframe1 Dataframe2
我想使用以下计算将 DF2 中的数据填充到 DF1 列。 Prev_close 列:对于每个(符号,日期)作为 df1 中的键,在 df2 中查找(符号,日期)并获取前一行“CLOSE”列值并填充到 DF1“prev_close”列中。
以下其余列采用 % 格式。 D1L 列:对于每个(符号,日期)作为 df1 中的键,在 df2 中查找(符号,日期)并获取“LOW”列值并作为公式填充到 DF1“D1L”列中(“low”-“prev_close") / (prev_close)
D1H 列:对于 df1 中的每个(符号,日期)作为键,在 df2 中查找(符号,日期)并获取“HIGH”列值并作为公式填充到 DF1“D1H”列中(“high” - "prev_close" ) / (prev_close)
D2L 列:对于每个(符号,日期)作为 df1 中的键,在 df2 中查找(符号,日期)并在查找行(当前行 + 1)“LOW”列值后获取第二行并填充到 DF1 “D2L”列作为公式 (“low” - “prev_close”) / (prev_close)
D2H 列:对于每个(符号,日期)作为 df1 中的键,在 df2 中查找(符号,日期)并在查找行(当前行 + 1)“HIGH”列值后获取第二行并填充到 DF1 中“D2H”列作为公式 ("high" - "prev_close" ) / (prev_close)
D3L 列:对于每个(符号,日期)作为 df1 中的键,在 df2 中查找(符号,日期)并在查找行(当前行 + 2)“LOW”列值后获取第 3 行并填充到 DF1 中“D3L”列作为公式 (“low” - “prev_close”) / (prev_close)
D3H 列:对于每个(符号,日期)作为 df1 中的键,在 df2 中查找(符号,日期)并在查找行(当前行 + 2)“HIGH”列值后获取第 3 行并填充到 DF1 “D3H”列作为公式 ("high" - "prev_close" ) / (prev_close)
最后,我期待输出如下,感谢您提供的任何帮助或代码。 Expected output of Dataframe1
我试着把它分解 step-by-step 以便更容易理解。
df1
和 df2
是您提供的。
groupby
函数确保我们不会混淆每个符号。shift
函数获取上一行或下一行。apply
部分用于在无效时将结果转换为空白,或在有效时将百分比转换为小数点后 3 位。{:.3%}
您可以更改此数字以更改所需的小数位数。merge
函数是仅获取您需要的行和计算的最后一步。
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'Symbol': ['SPX', 'SPX', 'SPX', 'AAPL', 'AAPL', 'AAPL', 'AAPL', 'AAPL', 'AAPL'],
'open': [2665.69, 2689.6, 2692.165, 123.5402, 128.1923, 124.5984, 121.5435, 120.7749, 120.7249],
'high': [2712.81, 2722.22, 2712.31, 127.7131, 128.5017, 125.4968, 123.3904, 121.7332, 120.7948],
'low': [2656.505, 2667.57, 2668.65, 122.5818, 124.798, 121.6334, 118.4189, 117.3706, 116.0129],
'close': [2697.82, 2683.36, 2695.03, 127.5733, 124.9078, 121.853, 119.9263, 121.2141, 116.1627],
'volume': [1483784, 1231996, 1198337, 1.16E+08, 1.02E+08, 1.13E+08, 1.78E+08, 1.54E+08, 1.54E+08],
'date': [20220301, 20220302, 20220303, 20220301, 20220302, 20220303, 20220304, 20220305, 20220306]})
df2 = pd.DataFrame({'Symbol': ['SPX', 'AAPL'], 'date': [20220302, 20220304]})
dfcal = df1
dfcal['Prev_Close'] = df1.groupby(['Symbol'])['close'].shift(1)
dfcal['D1L'] = ((dfcal.groupby(['Symbol'])['low'].shift(0) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dfcal['D1H'] = ((dfcal.groupby(['Symbol'])['high'].shift(0) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dfcal['D2L'] = ((dfcal.groupby(['Symbol'])['low'].shift(-1) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dfcal['D2H'] = ((dfcal.groupby(['Symbol'])['high'].shift(-1) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dfcal['D3L'] = ((dfcal.groupby(['Symbol'])['low'].shift(-2) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dfcal['D3H'] = ((dfcal.groupby(['Symbol'])['high'].shift(-2) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dfcal['D4L'] = ((dfcal.groupby(['Symbol'])['low'].shift(-3) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dfcal['D4H'] = ((dfcal.groupby(['Symbol'])['high'].shift(-3) - dfcal['Prev_Close'] ) / dfcal['Prev_Close']).apply(lambda x: '' if np.isnan(x) else "{:.3%}".format(x))
dffinal = pd.merge(df2, dfcal[['Symbol', 'date', 'Prev_Close', 'D1L', 'D1H', 'D2L', 'D2H', 'D3L', 'D3H', 'D4L', 'D4H']], on = ['Symbol', 'date'], how = 'left')
dffinal