使用来自熊猫的数据进行numpy循环

时间:2020-05-16 02:09:22

标签: python pandas numpy

我有一个包含交易数据的大数据框,并且试图将数据分组为小集群。我有一列名为Ticks的列,具有1,-1或0。我想做一个条件语句,例如“如果tick是1或-1,则计数1,如果它是0,则不添加任何内容,但仍保持该交易内存中。一旦达到1000(因此发生1000次,出现1或-1,并且所有行之间都带有“ 0”),请创建一个新数组,然后继续执行此操作。

我了解了numpy以及它比传统的python循环快得多的信息,但是我不确定如何在没有循环的情况下执行此操作。我阅读了很多类似的stackoverflow问题以及有关矢量化的解释等。但是我不得不承认我并没有真正理解它们,这可能是因为我的数学水平太低或我不理解示例中使用的代码。但我找不到将熊猫数据转换为numpy的示例。 example of my dataframe

2 个答案:

答案 0 :(得分:1)

您可以在没有显式for循环的情况下执行此操作,但是我不确定这是否在幕后使用sry:D

Redux

export将是您第一次达到1000的值(不为零)时对应的索引。

答案 1 :(得分:1)

另一种实现方法是使用目标总和值的django余数,因此每个总和(最多1000)将标记一个要拆分的新数组。这种解决方案的缺点是您仍然必须遍历可变长度数组。

随机选择数组用作输入:

cumsum
[ 1 -1  0 -1 -1  0 -1 -1 -1  0  0 -1  0  0 -1  1  0 -1  1  1  0 -1  0  0
  1 -1  0  1  1 -1  1  0 -1  0 -1 -1  1  1  1 -1 -1  1 -1  0 -1 -1  1 -1
  1  1 -1  0  1  1  1  1  0  0  0 -1  0  0  1  1  1 -1  1  1  0  1  1  1
  0 -1  0  0  0  1 -1  1 -1  1  1  1  0  0 -1  1  0 -1  1  0  1  0 -1 -1
  0  0  0  1]

df

的输出
import pandas as pd
import numpy as np

TARGET_SUM = 5  # change to 1000 here

pds = pd.Series(np.random.choice([-1, 0, 1], size=100))
x = (pds!=0).cumsum()
ix = x.loc[(x % TARGET_SUM == 0) & (x > 0)].drop_duplicates().index

ix += 1
ix = ix.insert(0, 0)

df = pd.DataFrame()
for idx in range(len(ix)-1):
    new_arr = pds[ix[idx]:ix[idx + 1]].to_list()
    df = df.append([[new_arr, len(new_arr), np.sum(np.abs(new_arr))]], ignore_index=True)

df.columns=["NEW_ARRAY","LEN(NEW_ARRAY)","SUM(ABS(NEW_ARRAY))"]
print(df)
r = len(pds)- df.iloc[:,1].sum()
print("Unused values from original df: {} - {} = {}".format(len(pds), df.iloc[:,1].sum(), r))