我有以下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
.. .......... ........ ........
我已经对一些tangent
和curvature
计算进行了原型设计,这些计算可以使用以下数据:
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数据框中的新列。在这样做时,我需要确保每个值与正确的日期行匹配。
答案 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数组。