使用熊猫或Numpy根据列数据选择行范围

时间:2019-09-15 04:39:04

标签: python python-3.x pandas numpy

你好,我有从熊猫生成的多只股票的csvs。我的目标似乎很简单,我每天都要测量体积差异的百分比

    for ticker in tickers:
        df = pd.read_csv('stock_dfs/{}.csv'.format(ticker))
        df['Volume_Pct_Change'] = df['Volume'].pct_change().fillna(0)
        df.to_csv('stonks_dfs/{}.csv'.format(ticker))

这很容易。现在,我想一直查找音量大于150%的时间。我在另一个Python脚本中执行了此操作,这与提取原始数据不同。

with open('sp500tickers.pickle', "rb") as f:
        tickers = pickle.load(f)

    for ticker in tickers:
        df = pd.read_csv('stock_dfs/{}.csv'.format(ticker))
        df_vpc = df.loc[df['Volume_Pct_Change'] >= 1.5]
        df_vpc.to_csv('{}.csv'.format(ticker))

这对我很好。

我的问题是我想在选定的行之前和之后拉出X的行,即(具有Volume_Pct_change> = 1.5的选定行之前和之后的30行)可以画出图并查看更改随着时间的流逝,音量会飙升。如果有办法将Numpy与此结合使用,对我来说就是奖励。

编辑1:正在运行

df = pd.read_csv('AAPL.csv') c=df['Volume_Pct_Change'] >= 1.2 for idx in c: df.iloc[(idx-7):(idx+30)]

在条件存在时给出正确的true输出

114,False 115,False 116,False 117,False 118,True 119,False 120,False 121,False

但是在运行df.iloc[(idx-7):(idx+30)]之后,将df导出到csv后我看不到df的变化。

编辑2:可以让某处跑步

df = pd.read_csv('AAPL.csv') c = df.index[df['Volume_Pct_Change'] >= 1.2] for idx in c: df.iloc[(idx-7):(idx+30)]

在导出时,我发现df没什么区别,但是将d=df.iloc[(idx-7):(idx+30)]起作用了,但是在数据框中只有一组它们使我感到困惑。它仅保存最后一个。似乎每个人都以最后一个结尾的数据帧覆盖整个数据帧?

最终编辑:谢谢大家的帮助

df = pd.read_csv('AAPL.csv') c = df.index[df['Volume_Pct_Change'] >= 1.2] for idx in c: d = df.iloc[(idx-7):(idx+30)] d.to_csv('{}.csv'.format(idx))

具有理想的结果,而且速度很快。

2 个答案:

答案 0 :(得分:1)

使用pandas df iloc获取满足> 150%条件的行索引列表。 然后将列表转换为新列表,列表中每个值的范围为-7至+30。 使用此新列表可获得所需的结果。

答案 1 :(得分:1)

也许是这样?

c=df.index[df['Volume_Pct_Change'] >= 1.5]
for idx in c:
    df.iloc[(idx-7):(idx+30)]