【问题标题】:Python data calculation over dataframe基于数据框的 Python 数据计算
【发布时间】:2021-05-05 11:22:24
【问题描述】:

我有一个数据框,其列等于日期、安全性和价格。

从这张表中,对于每个日期,我想为三种证券的每种可能组合计算价格公式。

如果我有证券 X、Y、Z、...N,我想计算 2*Price(x) - Price(y) -Price(z)....并对每三种可能的证券执行此操作.

初始数据帧:

Date Security Price(P)
1/3/19 X 0.8
1/3/19 Y 0.9
1/3/19 Z 0.95
.
.
.
2/3/19
2/3/19

结果:

Date Combo Result
1/3/19 XYZ 2Px - Py - Pz
1/3/19 YZX 2Py - Pz - Px
.
.
.
2/3/19 XYZ 2Px - Py - Pz

【问题讨论】:

  • for every three possible securities 你到底是什么意思? X, Y, Z 的可能排列将是 6 ?您创建combo 的精确度如何?

标签: python pandas dataframe iteration permutation


【解决方案1】:

这是一种方法。我认为“安全”列的所有项目都是 1 个字符的长度:

result=pd.DataFrame(columns=['Date', 'Combo', 'Result'])

for i in set(df.Date):
    temp=df[df.Date==i]
    vals={i:k for i,k in zip(df['Security'], df['Price(P)'])}
    d={''.join(i):0 for i in itertools.permutations(temp['Security'],3)}
    for k in d:
        d[k]=2*vals[k[0]]-vals[k[1]]-vals[k[2]]
    res=pd.DataFrame({'Date':[i]*len(d), 'Combo':d.keys(), 'Result':d.values()})
    result=pd.concat([result, res])

result.reset_index(drop=True, inplace=True)

例子:

df=pd.DataFrame({'Date':['2019-10-05']*4+['2020-09-10']*3, 'Security':['X', 'Y', 'Z', 'W', 'X', 'Y', 'X'], 'Price(P)':[2, 3, 1, 5, 1.2, 8, 3.9]})

>>> print(df)
         Date Security  Price(P)
0  2019-10-05        X    2.0
1  2019-10-05        Y    3.0
2  2019-10-05        Z    1.0
3  2019-10-05        W    5.0
4  2020-09-10        X    1.2
5  2020-09-10        Y    8.0
6  2020-09-10        X    3.9

运行上述代码后:

>>>print(result)

          Date Combo  Result
0   2019-10-05   XYZ    -1.2
1   2019-10-05   XYW    -5.2
2   2019-10-05   XZY    -1.2
3   2019-10-05   XZW     1.8
4   2019-10-05   XWY    -5.2
5   2019-10-05   XWZ     1.8
6   2019-10-05   YXZ    11.1
7   2019-10-05   YXW     7.1
8   2019-10-05   YZX    11.1
9   2019-10-05   YZW    10.0
10  2019-10-05   YWX     7.1
11  2019-10-05   YWZ    10.0
12  2019-10-05   ZXY    -9.9
13  2019-10-05   ZXW    -6.9
14  2019-10-05   ZYX    -9.9
15  2019-10-05   ZYW   -11.0
16  2019-10-05   ZWX    -6.9
17  2019-10-05   ZWY   -11.0
18  2019-10-05   WXY    -1.9
19  2019-10-05   WXZ     5.1
20  2019-10-05   WYX    -1.9
21  2019-10-05   WYZ     1.0
22  2019-10-05   WZX     5.1
23  2019-10-05   WZY     1.0
24  2020-09-10   XYX    -4.1
25  2020-09-10   XXY    -4.1
26  2020-09-10   YXX     8.2

如果“安全”列中的项目超过 1 个字符,您最好使用元组。 在这种情况下,只需替换它:

d={''.join(i):0 for i in itertools.permutations(temp['Security'],3)} 

通过这个:

d={i:0 for i in itertools.permutations(temp['Security'],3)}

【讨论】:

  • 谢谢!...如果安全性是文本会不会有太大的不同?所以你有一个名为“Xxx”、“Yyy”和“Zzz”的证券......结果将被称为“XxxYyyZzz” 另外我应该提到我可以排除任何具有重复证券的组合,例如 ZYY 或XXX
  • 不,不会有太大不同。你最好使用元组而不是字符串,它会更清楚。在这种情况下,你可以用这个替换:d={''.join(i):0 for i in itertools.permutations(temp['Security'],3)}d={i:0 for i in itertools.permutations(temp['Security'],3)}
猜你喜欢
  • 2019-11-08
  • 2021-03-05
  • 2023-01-26
  • 2020-11-30
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
相关资源
最近更新 更多