Python 如何将数据帧转换为二维数组以运行某些计算?

Python 如何将数据帧转换为二维数组以运行某些计算?,python,pandas,numpy,Python,Pandas,Numpy,我有以下数据帧: 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 .. .......

我有以下数据帧:

             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
.. .......... ........  ........
我已经原型化了一些使用以下数据的
切线
曲率
计算:

np.array([[0.0, 0.0], [0.13216, 0.11837], [0.25379, 0.05027], ... ])
如何从数据帧将numpy数组构造为二维数据,就像上面的数组一样?我猜,
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循环来构造数组,并反过来将新列注入数据帧来实现这一点。然而,我很想知道是否有一种优雅的方法可以做到这一点

---(澄清)---


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

看起来,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数组

看起来,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数组

您几乎只需要
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等,您可以将
时间\u进一步转换为\u float
列。

您几乎只需要
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\u进一步转换为\u float
列。

不清楚需要什么。你有一个函数,但我们将猜如何应用它?你能提供一些关于曲率和切线的上下文吗?这不是问题的一部分。这是一个计算,正在做我需要它做的事情。问题更多的是如何将pandas数据帧的
close
date
列组织成2D
[X,Y]
numpy数组。不清楚您想要什么。你有一个函数,但我们将猜如何应用它?你能提供一些关于曲率和切线的上下文吗?这不是问题的一部分。这是一个计算,正在做我需要它做的事情。问题更多的是如何将pandas数据帧的
close
date
列组织成2D
[X,Y]
numpy数组。非常感谢!我稍后会对此进行测试。如果你知道时间步长总是等距的,你可以像@Piinthesky建议的那样使用数据帧索引。这可能更简单。这个版本也适用于不均匀采样,所以更通用。非常感谢!我稍后会对此进行测试。如果你知道时间步长总是等距的,你可以像@Piinthesky建议的那样使用数据帧索引。这可能更简单。不过,此版本也适用于不均匀采样,因此更为通用。