如何将数据帧转换为2D数组以便运行某些计算?

时间:2018-01-09 21:35:24

标签: python pandas numpy

我有以下pandas数据帧:

             timestamp     close
.. .......... ........  ........
86 2017-03-12 14:00:00  0.000077
87 2017-03-12 16:00:00  0.000076
88 2017-03-12 18:00:00  0.000074
89 2017-03-12 20:00:00  0.000073
90 2017-03-12 22:00:00  0.000077
.. .......... ........  ........

我已经对一些tangentcurvature计算进行了原型设计,这些计算可以使用以下数据:

np.array([[0.0, 0.0], [0.13216, 0.11837], [0.25379, 0.05027], ... ])

如何从数据框构建一个numpy数组作为2D数据,就像上面的数组一样?我想,close数据将是Y轴,日期将是X数据,可能是这样的:0, 0.1, 0.2, 0.3 ...因为它们是等间隔日期 - 时间对象?所以,可能是这样的:

np.array([[0.0, 0.000077], [0.1, 0.000076], [0.2, 0.05027], [0.3, 0.000074], ... ])

然后,一旦我进行了计算,这将产生一个浮点数,我需要将它添加回pandas数据框,并确保它与时间戳对齐。

             timestamp     close change
.. .......... ........  ........ ......
86 2017-03-12 14:00:00  0.000077 0.00345
87 2017-03-12 16:00:00  0.000076 0.64477
88 2017-03-12 18:00:00  0.000074 0.32356
89 2017-03-12 20:00:00  0.000073 0.13331
90 2017-03-12 22:00:00  0.000077 0.66436
.. .......... ........  ........ .......

我可能会通过剖析数据帧来做到这一点,运行一些for循环来构造数组并反过来将新列注入pandas数据帧。但是,我有兴趣了解是否有一种优雅的方式来做到这一点。

---(澄清)---

所以我不是在实际计算之后。我已经知道如何执行这些。但是我的函数需要一个 2D 数组,如 X Y 值。因此,我需要将date列转换为 X 值,然后将close列存储为 Y 值。这样我就可以通过我的计算来运行它了。然后输出将是一个浮点数组。我需要将所有浮动内容注入我的pandas数据框中的新列。在这样做时,我需要确保每个值与正确的日期行匹配。

2 个答案:

答案 0 :(得分:2)

你几乎只需要df.values属性,尽管你需要先处理时间:

# Make a dataframe
df = pd.DataFrame(data=dict(timestamp=['2017-03-12 14:00:00', '2017-03-12 16:00:00', '2017-03-12 18:00:00', '2017-03-12 20:00:00', '2017-03-12 22:00:00'], close=[0.000077, 0.000076, 0.000074, 0.000073, 0.000077]))
df['timestamp'] = pd.to_datetime(df['timestamp'])

# Convert timestamp to floats
df['time_as_float'] = df.timestamp.values.astype(float)

# Make input numpy array
values = df[['time_as_float', 'close']].values

# Run through your function
solution = your_function_name(values)

# Save to array
df['solution'] = solution

如果您真的希望时间为0.1,0.2等,您可以进一步转换time_as_float列。

答案 1 :(得分:0)

看来,你的numpy数组的X列实际上并不需要特定的间距。如果没有,您可以省略除法步骤。

import pandas

#convert the panda column into a 2D numpy array with index and "close" column
nparr = df["close"].reset_index().values 

nparr[:, 0] /= 10      #only, if you really need a 0.1 spacing for this column
print(nparr.dtype)     #is float64 array

#do some calculations for column "change"

df["change"] = nparr[:,0]    #append column that contains "change" values

在此示例中,我假设您重用numpy数组的第0列来存储计算的“更改”值。原因是,如果将新列附加到numpy数组,则numpy会复制整个数组。因此,如果您真的想要保留numpy数组的第0列,无论出于何种原因,我宁愿在初始步骤中使用三列定义一个numpy数组。