V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  cwyalpha  ›  全部回复第 1 页 / 共 9 页
回复总数  165
1  2  3  4  5  6  7  8  9  
6 天前
回复了 NoOneNoBody 创建的主题 OpenAI 对智谱清言有点失望
要解决这个问题,我们可以编写一个 Python 函数,该函数接受一个 DataFrame 和两列名作为输入,并返回一个 Series ,表示列`a`和列`b`的穿越情况。然后,我们将使用 Numba 装饰器`@jit`来加速这个函数。

1. **定义函数**:函数将遍历 DataFrame 的行,比较每一行的`a`和`b`列值与其上一行的值,以确定是否发生了上穿或下穿。
2. **使用 Numba 加速**:通过在函数定义前添加`@jit`装饰器来加速函数。Numba 是一个开源的 JIT ( Just-In-Time )编译器,它可以显著提高 Python 代码的执行速度,特别是对于数值计算和科学计算非常有效。
3. **返回 Series**:根据穿越情况,为每个时间点返回 1 (上穿)、-1 (下穿)或 0 (无相交)。

下面是实现这个逻辑的代码示例。首先,确保你已经安装了`numba`和`pandas`库。

```python
import pandas as pd
import numpy as np
from numba import jit

# 示例 DataFrame 创建,仅供参考
# df = pd.DataFrame({'a': np.random.rand(10), 'b': np.random.rand(10)})

@jit(nopython=True)
def calculate_cross_over(a, b):
result = np.zeros(len(a))
for i in range(1, len(a)):
if a[i] > b[i] and a[i-1] <= b[i-1]:
result[i] = 1 # a 上穿 b
elif a[i] < b[i] and a[i-1] >= b[i-1]:
result[i] = -1 # a 下穿 b
# 其他情况默认为 0 ,无需额外处理
return result

def cross_over_series(df, col_a, col_b):
a_values = df[col_a].values
b_values = df[col_b].values
cross_over_values = calculate_cross_over(a_values, b_values)
return pd.Series(cross_over_values, index=df.index)

# 使用函数的示例
# result_series = cross_over_series(df, 'a', 'b')
# print(result_series)
```

在这个代码中:
- `calculate_cross_over`函数是使用 Numba JIT 编译的核心函数,它负责计算两列之间的穿越情况。
- `cross_over_series`函数是一个封装函数,它接受 DataFrame 和列名作为输入,调用`calculate_cross_over`函数,并返回结果 Series 。

请注意,由于 Numba 的`nopython`模式限制,我们直接在 Numba 函数中使用了 Numpy 数组而不是直接操作 DataFrame 。这是因为 Numba 最优化地支持 Numpy 数组计算。




-------
能否向量化地完成这个代码
-------


向量化的方法可以使用 Pandas 和 Numpy 的内置功能来实现,而不需要显式循环,这样可以提高计算效率并简化代码。下面是如何使用向量化方法来完成相交点检测的步骤:

1. **计算差分**:首先,计算两列`a`和`b`的差分,即`a - b`。这将用于确定`a`是否在`b`之上或之下。
2. **标记穿越点**:通过比较相邻元素的差分符号,我们可以找到穿越点。当差分从负变正时,表示`a`上穿`b`;从正变负时,表示`a`下穿`b`。
3. **返回 Series**:最终,我们将创建一个 Series ,根据是否发生穿越以及穿越的方向来分配值( 1 代表上穿,-1 代表下穿,0 代表无穿越)。

下面是实现这个方法的代码示例:

```python
import pandas as pd
import numpy as np

def vectorized_cross_over(df, col_a, col_b):
# 计算 a 和 b 的差值
diff = df[col_a] - df[col_b]
# 计算差值的符号变化(正负变化),使用 np.sign(diff)获取符号,并通过 diff 计算其差分以检测变化
sign_changes = np.sign(diff).diff()

# 上穿为 1 ,下穿为-1 ,无穿越为 0
# np.sign(diff).diff() == 2 表示从负到正的变化,即上穿
# np.sign(diff).diff() == -2 表示从正到负的变化,即下穿
crossover_series = pd.Series(0, index=df.index) # 初始化为 0
crossover_series[sign_changes == 2] = 1 # 上穿
crossover_series[sign_changes == -2] = -1 # 下穿

return crossover_series

# 示例 DataFrame 创建
# df = pd.DataFrame({'a': np.random.rand(10), 'b': np.random.rand(10)})

# 使用函数
# result_series = vectorized_cross_over(df, 'a', 'b')
# print(result_series)
```

这段代码完全使用向量化操作来检测`a`和`b`列的穿越情况,避免了显式循环,从而提高了性能。需要注意的是,由于使用了`diff()`方法,第一个元素将总是被标记为 0 (无穿越),因为它没有前一个元素来比较。







GPT4 的回答不知道是否正确
楼主跑的时候应该是用的内存不是显存?
@jkfadsljlasdgs 算是 mj 之外最好的了吧 其次 civitai dalle
好像很少 mj v6 的图?
试了我们领域的任务 sample ,Mixtral 8x7b 比 claude2.1 还是差一些 但已经是开源最佳了
目前 bard 已经更新 gemini pro ,号称比 gpt3.5 强
78 天前
回复了 Rorysky 创建的主题 Apple Apple 发布新的机器学习框架 MLX
Transformer language model training.
Large-scale text generation with LLaMA and finetuning with LoRA.
Generating images with Stable Diffusion.
Speech recognition with OpenAI's Whisper.

大模型、SD 、语音都支持了,个人玩家是差不多够用了把
83 天前
回复了 allinschroe 创建的主题 微信 微信被盗刷。。。。。
iphone?
目前有哪些 x86 的 windows 软件不支持?
db-gpt
23999 目前怎么做到这个配置? z790+32G+1T+1000w+14900kf+4090
@Puteulanus 看视频 lobe 是不是只能做单个物体的识别,如果一张图里有 2 个人一个在喝水一个不在喝水,这种是不是还是得用 yolo
94 天前
回复了 suqiuluck 创建的主题 程序员 有没有自己电脑上跑大模型的大佬啊
4060ti 16g 双卡可以用来训练或者推理麽?
关注一下
104 天前
回复了 CNM47589 创建的主题 Apple 说说你在苹果平台上玩到过的好游戏
vainglory
109 天前
回复了 frankyzf 创建的主题 问与答 最便宜的得到 32G 显存的方式是什么?
4060ti 16g 2
iFuGOCcs4hxs1uU4IG 谢谢 OP
大模型
mapreduce?
1  2  3  4  5  6  7  8  9  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1101 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 39ms · UTC 18:27 · PVG 02:27 · LAX 10:27 · JFK 13:27
Developed with CodeLauncher
♥ Do have faith in what you're doing.