我有一个看起来像这样的矩阵
时间 | Col_A | Col_B | Col_C | Col_D | 价格 |
---|---|---|---|---|---|
123 | A1 | B1 | C2 | D6 | 23.43 |
124 | A5 | B3 | C7 | D1 | 14.63 |
125 | A3 | B2 | C3 | D2 | 343.43 |
126 | A2 | B1 | C2 | D6 | 43.43 |
127 | A1 | B1 | C7 | D2 | 6.63 |
现在我想创建一个 5 维矩阵。我认为这叫做张量?
问题1)这个张量可以用Pandas做吗,或者有更好的Python库吗?您有 API 手册的链接以便我可以阅读更多内容吗?
张量的维度为“time”、“Col_A”、“Col_B”、“Col_C”、“Col_D”。该单元格将包含标量“价格”。
所以我希望能够设置单元格,也许是这样的:
my_matrix[time=123, Col_A = A1, Col_B = B1, Col_C = C2, Col_D = D6] = 23.43
问题2)那么设置标量的语法是什么?我如何读取标量?
我还想对维度进行求和。假设我想像下面这样总结。当我写“*”时,我的意思是星号是通配符。
Matrix[time = *, Col_A = A1, Col_B = B1 and B2 and B3, Col_C = *, Col_D = D6 and D2]
问题 3)如何对不同维度求和?我需要for循环吗?我可以使用其他操作,例如除法吗?
实际上,我想在每个单元格中放入几个数字。也许我想将“时间”和“价格”放入每个单元格中。我正在考虑字符串连接“time_Price”,但是要做一个大的求和,会有很多子串提取,这可能很耗时?因此,我正在考虑创建几个相同的张量。一个张量可能在每个单元格中包含“价格”,而另一个张量可能在每个单元格中包含“时间”。因此,如果我想检查价格的时间,我将在两个张量中使用相同的坐标。
问题 4)我想使用每个单元格包含单个值的多个张量比使用包含许多变量的单个张量(即一长串串联变量)更快?或者有更好的办法吗?
PS。有人可以帮我正确编辑矩阵吗?当我预览时,矩阵看起来不错,但当我发布问题时,矩阵看起来很糟糕。
数据框似乎已经是适合您的数据的结构。回答您的问题:
# set up df
df = pd.DataFrame({
'time': [123, 124, 125, 126, 127],
'Col_A': ['A1', 'A5', 'A3', 'A2', 'A1'],
'Col_B': ['B1', 'B3', 'B2', 'B1', 'B1'],
'Col_C': ['C2', 'C7', 'C3', 'C2', 'C7'],
'Col_D': ['D6', 'D1', 'D2', 'D6', 'D2'],
'Price': [23.43, 14.63, 343.43, 43.43, 6.63]
})
# set the index to the `Col_*` columns and sort for performance
df = df.set_index(['Col_A','Col_B','Col_C','Col_D']).sort_index()
现在我们有一个数据框,其中
Col_*
值是索引
time
和 Price
值位于“单元格”中。
这基本上就是问题1的答案。
time Price
Col_A Col_B Col_C Col_D
A1 B1 C2 D6 123 23.43
C7 D2 127 6.63
A2 B1 C2 D6 126 43.43
A3 B2 C3 D2 125 343.43
A5 B3 C7 D1 124 14.63
对于问题2,您可以只使用索引来设置“单元格”值:
df.loc[('A1','B1','C2','D6'), 'Price'] = 55
或同时使用两个“细胞”:
df.loc[('A1','B1','C7','D2'), ['time', 'Price']] = [100, 99]
或有条件:
df.loc[(df.index == ('A2','B1','C2','D6')) & (df['time'] == 126), 'Price'] = 44
输出:
time Price
Col_A Col_B Col_C Col_D
A1 B1 C2 D6 123 55.00
C7 D2 100 99.00
A2 B1 C2 D6 126 44.00
A3 B2 C3 D2 125 343.43
A5 B3 C7 D1 124 14.63
对于问题3,使用索引来访问你想要的值;使用
slice(None)
作为通配符:
df.loc[('A1', ['B1','B2','B3'], slice(None), ['D2','D6'])].sum()
输出:
time 223.0
Price 154.0
dtype: float64
就问题 4 而言,在数据框中,您可以拥有任意多个“单元格”值。如上所示,您可以根据需要单独或一起访问“单元格”值。