有效地比较Python数据框中的值

时间:2017-11-17 06:00:00

标签: python pandas dataframe

我每天都在使用加密货币进行交易,并希望找到哪些是最受欢迎的交易密码。 我有每个加密的CSV文件,包含以下字段:

Date           Sell       Buy
43051.23918    1925.16    1929.83
43051.23919    1925.12    1929.79
43051.23922    1925.12    1929.79
43051.23924    1926.16    1930.83
43051.23925    1926.12    1930.79
43051.23926    1926.12    1930.79
43051.23927    1950.96    1987.56
43051.23928    1190.90    1911.56
43051.23929    1926.12    1930.79

我想查一下:

有多少报价以利润结束:

  1. 购买头寸 - 如果以下卖出之一>目前购买。
  2. 对于卖出仓位 - 如果下列买入之一<目前的销售。
  3. 获得理论职位需要多长时间才能盈利。

    什么是潜在利润。

    我使用以下代码:

    #converting from OLE to datetime
    OLE_TIME_ZERO = dt.datetime(1899, 12, 30, 0, 0, 0)
    def ole(oledt):
        return OLE_TIME_ZERO + dt.timedelta(days=float(oledt))
    
    #variables initialization
    buy_time = ole(43031.57567) - ole(43031.57567)
    sell_time = ole(43031.57567) - ole(43031.57567)
    profit_buy_counter = 0
    no_profit_buy_counter = 0
    profit_sell_counter = 0
    no_profit_sell_counter = 0
    
    max_profit_buy_positions = 0
    max_profit_buy_counter = 0
    
    max_profit_sell_positions = 0
    max_profit_sell_counter = 0
    
    df = pd.read_csv("C:/P/Crypto/bitcoin_test_normal_276k.csv")
    
    #comparing to max
    for index, row in df.iterrows():
        a = index + 1
        df_slice = df[a:]
        if df_slice["Sell"].max() - row["Buy"] > 0:
            max_profit_buy_positions += df_slice["Sell"].max() - row["Buy"]
            max_profit_buy_counter += 1
        for index1, row1 in df_slice.iterrows():
            if row["Buy"] < row1["Sell"]  :
                buy_time += ole(row1["Date"])- ole(row["Date"]) 
                profit_buy_counter += 1
                break
        else:
                no_profit_buy_counter += 1
    
    #comparing to sell
    for index, row in df.iterrows():
        a = index + 1
        df_slice = df[a:]
        if  row["Sell"] - df_slice["Buy"].min() > 0:
            max_profit_sell_positions += row["Sell"] - df_slice["Buy"].min()
            max_profit_sell_counter += 1        
        for index2, row2 in df_slice.iterrows():    
            if row["Sell"] > row2["Buy"] :
                sell_time += ole(row2["Date"])- ole(row["Date"])
                profit_sell_counter += 1  
                break
        else:
            no_profit_sell_counter += 1         
    
    num_rows = len(df.index)
    
    buy_avg_time = buy_time/num_rows
    sell_avg_time = sell_time/num_rows
    
    if max_profit_buy_counter == 0:
        avg_max_profit_buy = "There is no profitable buy positions"
    else:    
        avg_max_profit_buy = max_profit_buy_positions/max_profit_buy_counter
    
    if max_profit_sell_counter == 0:
        avg_max_profit_sell = "There is no profitable sell positions"
    else:
       avg_max_profit_sell = max_profit_sell_positions/max_profit_sell_counter
    

    该代码适用于10K-20K线路,但数量较多(276K)需要很长时间(超过10小时)

    我可以做些什么才能改善它?

    有没有&#34; Pythonic&#34;将数据框中的每个值与所有后续值进行比较的方法?

    注意 - CSV中的日期在OLE中,因此我需要将其转换为Datetime。

    测试文件: 谢谢你的评论。 Here您可以找到我使用过的文件:

1 个答案:

答案 0 :(得分:0)

首先,我想为每行SellBuy创建累计最大值/最小值,因此很容易与之比较。 pandascummaxcummin,但它们走错了方向。所以我们会这样做:

df['Max Sell'] = df[::-1]['Sell'].cummax()[::-1]
df['Min Buy'] = df[::-1]['Buy'].cummin()[::-1]

现在,我们可以比较每一行:

df['Buy Profit'] = df['Max Sell'] - df['Buy']
df['Sell Profit'] = df['Sell'] - df['Min Buy']

我很肯定这并不是你想要的,因为我不能完全理解你想要做的事情,但希望它能引导你朝着正确的方向前进。

在比较你的函数和我的函数之后,会有一点点差别,因为你的a偏离索引一个。删除该偏移量后,您将看到我的方法产生的结果与您的相同,只是在非常短的时间内完成:

for index, row in df.iterrows():
    a = index
    df_slice = df[a:]
    assert (df_slice["Sell"].max() - row["Buy"]) == df['Max Sell'][a] - df['Buy'][a]
else:
    print("All assertions passed!")

请注意,这仍然需要您的功能所需的很长时间。请注意,这可以通过shift修复,但我不想长时间运行您的功能以找出改变它的方法。