如何使用 SQL/Python 获得第三列中几乎相等(最高小数)的两列值的乘法?

How to get multiplication of two column's value which is nearly equal (highest decimal) in the third column using SQL/Python?

提问人:Darshika Verma 提问时间:10/23/2023 最后编辑:Darshika Verma 更新时间:10/26/2023 访问量:71

问:

我有一个名为df的数据集

enter image description here

将两列(Open 和 low,具有相等的值)相乘应使结果几乎等于引用“High”列的最高整数(十进制)值,并将结果与相应的日期High_new存储。

例如,在附表中 -

Open 和 High 两列的值相等 (100),因此 100*2 = 200,而 200.8 是最接近 200 的最高十进制(整数)值,因此我们在High_new列中得到 200.8 及其对应的日期(参考输出数据集)(** 注意 - 我们没有考虑 200.3,因为 200.8 是 200 的最高十进制值 200)

那么,如何获取列High_new和date_new列呢?(可以使用python/SQL解决)

到目前为止,我已经尝试了以下代码(也共享此代码的输出)

**(这只是可能有效的初始逻辑)-

import pandas as pd
import numpy as np
import re

data = {'Date':['11/1/18', '12/3/18', '1/1/19', '2/1/19', '3/1/19'],
        'Open':[72, 99, 101.25, 92.05, 100],
        'High':[115.4, 144.3, 200.8, 200.3, 135.5],
        'Low' :[72,91,88.3,84,100]}
  
# Create DataFrame
df = pd.DataFrame(data)
  
# Print the output.
df

df['high2'] = np.where(df['Open'] == df['Low'], df['Open']*2, np.nan)
python sql excel 循环 乘法

评论

0赞 Mr.Jones 10/24/2023
到目前为止,您尝试过什么?向我们展示一些代码,以便我们可以使用一些东西。
0赞 Darshika Verma 10/25/2023
@Mr.Jones:我已经在示例数据上尝试过了。但是,关于如何实现所需的输出,也存在同样的问题
0赞 Tim Roberts 10/25/2023
为什么 100/100 产生 200.8,而 92.05/84 产生 200.3?这完全没有意义。不应该是“大于开盘+最低价的最小值”吗?
0赞 Darshika Verma 10/25/2023
@TimRoberts我们没有得到一些乘法或除法的“High_new”。如果开盘价 = 低价,那么我们应该做开盘价 *2(比如 100 *2 = 200),然后从“高价”列中寻找接近 200 的最接近的最高十进制数,该值将进入“高2”。
0赞 Tim Roberts 10/25/2023
是的,但最接近 100*2 的数字是 200.3,而不是 200.8。

答:

1赞 Tim Roberts 10/26/2023 #1

我发现“最大小数点”的东西很不寻常,很可能是一个误解,但这确实符合你的要求。我创建了一个单独的数据帧,以保留每个整数中的最大分数,然后逐行查找最接近的分数。

import pandas as pd

data = {'Date':['11/1/18', '12/3/18', '1/1/19', '2/1/19', '3/1/19'],
        'Open':[72, 99, 101.25, 92.05, 100],
        'High':[115.4, 144.3, 200.8, 200.3, 135.5],
        'Low' :[72,91,88.3,84,100]}
  
# Create DataFrame.
df = pd.DataFrame(data)

# Create a dataframe with only the highest for each integer.

sub = df[['Date','High']].sort_values(by='High')
sub['IntHigh'] = df['High'].astype(int)
sub.drop_duplicates('IntHigh',keep='last', inplace=True)

# Find closest high for each row where open==low.

def findclosest(row):
    if row['Open'] != row['Low']:
        return row['High'],row['Date']

    sub['Delta'] = (sub['IntHigh']-row['Open']*2).abs()
    chk = sub.sort_values('Delta').index[0]
    return sub.loc[chk,['High','Date']]

df[['High2','Date2']] = df.apply( findclosest, axis=1 )
print(df)

输出:

      Date    Open   High    Low  High2    Date2
0  11/1/18   72.00  115.4   72.0  144.3  12/3/18
1  12/3/18   99.00  144.3   91.0  144.3  12/3/18
2   1/1/19  101.25  200.8   88.3  200.8   1/1/19
3   2/1/19   92.05  200.3   84.0  200.3   2/1/19
4   3/1/19  100.00  135.5  100.0  200.8   1/1/19