我创建了一个自定义的 rust 编译器版本,它需要专有的 c++ 编译器。我怎样才能让我的同事可以使用这个编译器,例如可以使用 安装rustup
、能够刷新/更新它、查看可用版本等。
我正在努力寻找一种方法来按章节拆分我拥有的法律文件集。我一直在尝试使用正则表达式来做到这一点,虽然我已经相当接近了,但我正在寻找是否有办法进一步优化输出以合并正则表达式脚本产生的匹配数量。
每篇文档都由多个部分标题组成,但都遵循相同的基本结构。首先,有一个“论据”标题,总结了每个小节中提出的观点。我想包含这个论据部分,因为语料库中的少数文档没有后续的小节;然而,绝大多数文档都有这些部分。每个小节都以罗马数字开头,每个文档中的小节数量可能有所不同。虽然我不知道每个文档中到底有多少个小节,但我假设不超过 10 个。
对于模态文档,其结构如下所示:
string = """ARGUMENT
Summary of argument
I. TITLE OF SUBSECTION 1
Text of subsection 1
II. TITLE OF SUBSECTION 2
Text of subsection 2
CONCLUSION
Text of conclusion
"""
我创建了一个正则表达式脚本,尝试使用按标题拆分每个部分re.split
,指定 ARGUMENT 标题、罗马数字小节 1(I)到 10(X)以及 CONCLUSION 部分,添加新行符号以避免在这些单词/符号的每个实例上进行拆分,无论它们是否恰好出现在标题本身中:
r'(\nARGUMENT|\nI\.|\nII\.|\nIII\.|\nIV\.|\nV\.|\nVI\.|\nVII\.|\nVIII\.|\nIX\.|\nX\.|\nCONCLUSION.*)'
我想要的输出是一个列表,其中每个标题和下面的结果文本组合成一个元素,如下所示:
['ARGUMENT Summary of argument', 'I. TITLE OF SUBSECTION 1 Text of subsection 1', 'II. TITLE OF SUBSECTION 2 Text of subsection 2', 'CONCLUSION Text of conclusion']
但是,当re.split
在上述字符串上使用时,我的实际输出将罗马数字与该部分的其余文本分开(请注意下面列表的第二个和第四个元素:
['ARGUMENT\nSummary of argument\n', '\nI.', ' TITLE OF SUBSECTION 1\nText of subsection 1\n', '\nII.', ' TITLE OF SUBSECTION 2\nText of subsection 2\n', '\nCONCLUSION', '\nText of conclusion\n']
输出中的换行符对我来说不是特别重要。相反,标题和其下方文本的整合对我来说才是最重要的。
我可以对我的正则表达式脚本进行一些编辑以获得第一个输出而不是第二个输出吗?或者如果不行,是否有其他正则表达式命令可用于获得该特定输出?而且,不那么关键的是,是否有更有效或更简化的方法来将节标题与脚本中的罗马数字 I 到 X 进行匹配?
我需要计算多个交易证券的横截面排名。请考虑以下pl.DataFrame
长(整齐)格式。它包含三个不同的符号,每个符号都有各自的价格,每个符号还有一个专用的(即本地)交易日历。
df = pl.DataFrame(
{
"symbol": [*["symbol1"] * 6, *["symbol2"] * 5, *["symbol3"] * 5],
"date": [
"2023-12-30", "2023-12-31", "2024-01-03", "2024-01-04", "2024-01-05", "2024-01-06",
"2023-12-30", "2024-01-03", "2024-01-04", "2024-01-05", "2024-01-06",
"2023-12-30", "2023-12-31", "2024-01-03", "2024-01-04", "2024-01-05",
],
"price": [
100, 105, 110, 115, 120, 125,
200, 210, 220, 230, 240,
3000, 3100, 3200, 3300, 3400,
],
}
)
print(df)
shape: (16, 3)
┌─────────┬────────────┬───────┐
│ symbol ┆ date ┆ price │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 │
╞═════════╪════════════╪═══════╡
│ symbol1 ┆ 2023-12-30 ┆ 100 │
│ symbol1 ┆ 2023-12-31 ┆ 105 │
│ symbol1 ┆ 2024-01-03 ┆ 110 │
│ symbol1 ┆ 2024-01-04 ┆ 115 │
│ symbol1 ┆ 2024-01-05 ┆ 120 │
│ … ┆ … ┆ … │
│ symbol3 ┆ 2023-12-30 ┆ 3000 │
│ symbol3 ┆ 2023-12-31 ┆ 3100 │
│ symbol3 ┆ 2024-01-03 ┆ 3200 │
│ symbol3 ┆ 2024-01-04 ┆ 3300 │
│ symbol3 ┆ 2024-01-05 ┆ 3400 │
└─────────┴────────────┴───────┘
第一步是使用计算周期收益pct_change
,然后使用pivot
来对齐每个日期的符号。
returns = df.drop_nulls().with_columns(
pl.col("price").pct_change(n=2).over("symbol").alias("return")
).pivot(on="symbol", index="date", values="return")
print(returns)
shape: (6, 4)
┌────────────┬──────────┬──────────┬──────────┐
│ date ┆ symbol1 ┆ symbol2 ┆ symbol3 │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ f64 ┆ f64 ┆ f64 │
╞════════════╪══════════╪══════════╪══════════╡
│ 2023-12-30 ┆ null ┆ null ┆ null │
│ 2023-12-31 ┆ null ┆ null ┆ null │
│ 2024-01-03 ┆ 0.1 ┆ null ┆ 0.066667 │
│ 2024-01-04 ┆ 0.095238 ┆ 0.1 ┆ 0.064516 │
│ 2024-01-05 ┆ 0.090909 ┆ 0.095238 ┆ 0.0625 │
│ 2024-01-06 ┆ 0.086957 ┆ 0.090909 ┆ null │
└────────────┴──────────┴──────────┴──────────┘
下一步是用来concat_list
创建一个list
来计算每行的排名(降序,即最高回报获得排名 1)。
ranks = (
returns.with_columns(all_symbols=pl.concat_list(pl.all().exclude("date")))
.select(
pl.all().exclude("all_symbols"),
pl.col("all_symbols")
.list.eval(
pl.element().rank(descending=True, method="ordinal").cast(pl.UInt8)
)
.alias("rank"),
)
)
print(ranks)
shape: (6, 5)
┌────────────┬──────────┬──────────┬──────────┬────────────────────┐
│ date ┆ symbol1 ┆ symbol2 ┆ symbol3 ┆ rank │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ f64 ┆ f64 ┆ f64 ┆ list[u8] │
╞════════════╪══════════╪══════════╪══════════╪════════════════════╡
│ 2023-12-30 ┆ null ┆ null ┆ null ┆ [null, null, null] │
│ 2023-12-31 ┆ null ┆ null ┆ null ┆ [null, null, null] │
│ 2024-01-03 ┆ 0.1 ┆ null ┆ 0.066667 ┆ [1, null, 2] │
│ 2024-01-04 ┆ 0.095238 ┆ 0.1 ┆ 0.064516 ┆ [2, 1, 3] │
│ 2024-01-05 ┆ 0.090909 ┆ 0.095238 ┆ 0.0625 ┆ [2, 1, 3] │
│ 2024-01-06 ┆ 0.086957 ┆ 0.090909 ┆ null ┆ [2, 1, null] │
└────────────┴──────────┴──────────┴──────────┴────────────────────┘
现在我们终于要开始讨论实际问题了:我
想ranks
再次取消透视并生成一个整洁的数据框。我正在寻找以下列: symbol
、、和。我考虑创建三个新列(基本上用来解包列表,但这只会创建新的行而不是列)。date
return
rank
explode
另外,我想知道我是否df
首先需要进行旋转,或者是否有更好的方法直接df
以整洁的格式对原始数据进行操作?我实际上正在寻找性能,因为df
可能有数百万行。
我正在尝试使用 doctrine 在数据库中保存一个简单的表单。我创建的实体(让我们命名它Brand
)php bin/console make:entity
具有布尔属性:
#[ORM\Entity(repositoryClass: BrandRepository::class)]
class Brand
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column]
private ?bool $is_enabled = null;
public function getId(): ?int
{
return $this->id;
}
public function isEnabled(): ?bool
{
return $this->is_enabled;
}
public function setEnabled(bool $is_enabled): static
{
$this->is_enabled = $is_enabled;
return $this;
}
}
此实体完全自动生成,我没有做任何更改。我还使用php bin/console make:crud
命令创建了一个表单类型。生成的表单类型名称BrandType
如下所示:
class BrandType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('is_enabled', CheckboxType::class, [
'required' => false,
// I tried these 2 options, but didn't help:
// 'empty_data' => false,
// 'false_values' => [false],
'value' => true
])
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Brand::class,
]);
}
}
正如您在下面看到的,表单处理程序非常简单:
#[Route('/brand')]
class BrandController extends AbstractController
{
#[Route('/new', methods: ['GET', 'POST'])]
public function new(Request $request, EntityManagerInterface $entityManager): Response
{
$brand = new Brand();
$form = $this->createForm(BrandType::class, $brand);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->persist($brand);
$entityManager->flush();
return $this->redirectToRoute('blah', [], Response::HTTP_SEE_OTHER);
}
return $this->render('brand/new.html.twig', [
'brand' => $brand,
'form' => $form,
]);
}
}
但是当我提交表单时,出现此错误:
类“App\Entity\Catalog\Brand”中的方法“isEnabled”需要 0 个参数,但只应接受 1 个。
异常突出显示了$form->handleRequest($request);
控制器中的行。我使用的是PHP 8.3.6和Symfony 6.4.10,我使用的 doctrine 包如下所示:
"doctrine/dbal": "^3",
"doctrine/doctrine-bundle": "^2.12",
"doctrine/doctrine-migrations-bundle": "^3.3",
"doctrine/orm": "^3.2",
我是 Python 新手,在使用queue.Queue 管理生产者和消费者线程之间的任务的多线程 Python 应用程序中偶尔会遇到停滞问题。有时,应用程序会停止响应。当新项目添加到队列时,生产者会通知消费者,而消费者会等待收到此通知后再访问该项目。
这是我的代码的简化版本:
import threading
import queue
q = queue.Queue()
def producer():
for i in range(5):
item = f"item-{i}"
q.put(item)
print(f"Produced {item}")
with condition:
condition.notify_all()
def consumer():
while True:
with condition:
condition.wait()
item = q.get()
print(f"Consumed {item}")
if item is None:
break
condition = threading.Condition()
prod_thread = threading.Thread(target=producer)
cons_thread = threading.Thread(target=consumer)
prod_thread.start()
cons_thread.start()
prod_thread.join()
q.put(None)
cons_thread.join()
什么原因可能导致了这个问题?
我的 python 代码可以访问通过调用的 C 函数接收和返回的实际指针值ctypes
吗?
如果是,我该如何实现?
我想测试传递给共享库函数并从共享库函数返回的指针值,以使用 pytest 测试分配(这里,测试它strdup
没有返回相同的指针而是返回指向不同地址的新指针)。
我把要实现的函数之一(strdup
)包装在一个名为的文件中的一个新 C 函数中,wrapped_strdup.c
以显示指针值和内存区域的内容:
/*
** I'm compiling this into a .so the following way:
** - gcc -o wrapped_strdup.o -c wrapped_strdup.c
** - ar rc wrapped_strdup.a wrapped_strdup.o
** - ranlib wrapped_strdup.a
** - gcc -shared -o wrapped_strdup.so -Wl,--whole-archive wrapped_strdup.a -Wl,--no-whole-archive
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *wrapped_strdup(char *src){
char *dst;
printf("From C:\n");
printf("- src address: %X, src content: [%s].\n", src, src);
dst = strdup(src);
printf("- dst address: %X, dst content: [%s].\n", dst, dst);
return dst;
}
我还在同一目录中创建了一个名为的 pytest 测试文件test_strdup.py
:
#!/usr/bin/env python3
import ctypes
import pytest
# Setting wrapped_strdup:
lib_wrapped_strdup = ctypes.cdll.LoadLibrary("./wrapped_strdup.so")
wrapped_strdup = lib_wrapped_strdup.wrapped_strdup
wrapped_strdup.restype = ctypes.c_char_p
wrapped_strdup.argtypes = [ctypes.c_char_p]
@pytest.mark.parametrize("src", [b"", b"foo"])
def test_strdup(src: bytes):
print("")
dst = wrapped_strdup(src)
print("From Python:")
print(f"- src address: {hex(id(src))}, src content: [{src!r}].")
print(f"- dst address: {hex(id(dst))}, dst content: [{dst!r}].")
assert src == dst
assert hex(id(src)) != hex(id(dst))
然后,运行测试得到以下输出:
$ pytest test_strdup.py --maxfail=2 -v -s
=================================== test session starts ====================================
platform linux -- Python 3.12.5, pytest-8.3.2, pluggy-1.5.0 -- /usr/bin/python
cachedir: .pytest_cache
rootdir: /home/vmonteco/code/MREs/MRe_strdup_test_with_ctypes
plugins: anyio-4.4.0, cov-5.0.0, typeguard-4.3.0
collected 2 items
test_strdup.py::test_strdup[]
From C:
- src address: C19BDBE8, src content: [].
- dst address: 5977DFA0, dst content: [].
From Python:
- src address: 0x75bcc19bdbc8, src content: [b''].
- dst address: 0x75bcc19bdbc8, dst content: [b''].
FAILED
test_strdup.py::test_strdup[foo]
From C:
- src address: BF00A990, src content: [foo].
- dst address: 59791030, dst content: [foo].
From Python:
- src address: 0x75bcbf00a970, src content: [b'foo'].
- dst address: 0x75bcbefc18f0, dst content: [b'foo'].
PASSED
========================================= FAILURES =========================================
______________________________________ test_strdup[] _______________________________________
src = b''
@pytest.mark.parametrize("src", [b"", b"foo"])
def test_strdup(src: bytes):
print("")
dst = wrapped_strdup(src)
print("From Python:")
print(f"- src address: {hex(id(src))}, src content: [{src!r}].")
print(f"- dst address: {hex(id(dst))}, dst content: [{dst!r}].")
assert src == dst
> assert hex(id(src)) != hex(id(dst))
E AssertionError: assert '0x75bcc19bdbc8' != '0x75bcc19bdbc8'
E + where '0x75bcc19bdbc8' = hex(129453562518472)
E + where 129453562518472 = id(b'')
E + and '0x75bcc19bdbc8' = hex(129453562518472)
E + where 129453562518472 = id(b'')
test_strdup.py:22: AssertionError
================================= short test summary info ==================================
FAILED test_strdup.py::test_strdup[] - AssertionError: assert '0x75bcc19bdbc8' != '0x75bcc19bdbc8'
=============================== 1 failed, 1 passed in 0.04s ================================
此输出显示了两件事:
b''
尽管从底层角度看地址不同,但 Python 中引用的变量的地址无论如何都是相同的(即同一个对象)。这与一些纯 Python 测试一致,我猜这可能是某种优化功能。- C 和 Python 中的地址值
dst
和src
变量实际上似乎没有关联。
因此,上述尝试实际上不可靠,无法检查函数是否返回指向不同区域的指针。
我还可以尝试检索指针值本身,并通过更改属性进行第二次测试运行以专门检查此部分restype
:
#!/usr/bin/env python3
import ctypes
import pytest
# Setting wrapped_strdup:
lib_wrapped_strdup = ctypes.cdll.LoadLibrary("./wrapped_strdup.so")
wrapped_strdup = lib_wrapped_strdup.wrapped_strdup
wrapped_strdup.restype = ctypes.c_void_p # Note that it's not a c_char_p anymore.
wrapped_strdup.argtypes = [ctypes.c_char_p]
@pytest.mark.parametrize("src", [b"", b"foo"])
def test_strdup_for_pointers(src: bytes):
print("")
dst = wrapped_strdup(src)
print("From Python:")
print(f"- retrieved dst address: {hex(dst)}.")
以上代码给出以下输出:
$ pytest test_strdup_for_pointers.py --maxfail=2 -v -s
=================================== test session starts ====================================
platform linux -- Python 3.12.5, pytest-8.3.2, pluggy-1.5.0 -- /usr/bin/python
cachedir: .pytest_cache
rootdir: /home/vmonteco/code/MREs/MRe_strdup_test_with_ctypes
plugins: anyio-4.4.0, cov-5.0.0, typeguard-4.3.0
collected 2 items
test_strdup_for_pointers.py::test_strdup_for_pointers[]
From C:
- src address: E15BDBE8, src content: [].
- dst address: 84D4D820, dst content: [].
From Python:
- retrieved dst address: 0x608984d4d820.
PASSED
test_strdup_for_pointers.py::test_strdup_for_pointers[foo]
From C:
- src address: DEC7EA80, src content: [foo].
- dst address: 84EA7C40, dst content: [foo].
From Python:
- retrieved dst address: 0x608984ea7c40.
PASSED
==================================== 2 passed in 0.01s =====================================
这将提供实际的地址(或至少是看起来相关的信息)。
但如果不知道 C 函数接收的值,它就没有多大帮助。
附录:我从马克的回答中得出的结论(并且有效):
这是一个测试,它实现了所接受的答案中建议的解决方案:
#!/usr/bin/env python3
import ctypes
import pytest
# Setting libc:
libc = ctypes.cdll.LoadLibrary("libc.so.6")
strlen = libc.strlen
strlen.restype = ctypes.c_size_t
strlen.argtypes = (ctypes.c_char_p,)
# Setting wrapped_strdup:
lib_wrapped_strdup = ctypes.cdll.LoadLibrary("./wrapped_strdup.so")
wrapped_strdup = lib_wrapped_strdup.wrapped_strdup
# Restype will be set directly in the tests.
wrapped_strdup.argtypes = (ctypes.c_char_p,)
@pytest.mark.parametrize("src", [b"", b"foo"])
def test_strdup(src: bytes):
print("") # Just to make pytest output more readable.
# Set expected result type.
wrapped_strdup.restype = ctypes.POINTER(ctypes.c_char)
# Create the src buffer and retrieve its address.
src_buffer = ctypes.create_string_buffer(src)
src_addr = ctypes.addressof(src_buffer)
src_content = src_buffer[:strlen(src_buffer)]
# Run function to test.
dst = wrapped_strdup(src_buffer)
# Retrieve result address and content.
dst_addr = ctypes.addressof(dst.contents)
dst_content = dst[: strlen(dst)]
# Assertions.
assert src_content == dst_content
assert src_addr != dst_addr
# Output.
print("From Python:")
print(f"- Src content: {src_content!r}. Src address: {src_addr:X}.")
print(f"- Dst content: {dst_content!r}. Dst address: {dst_addr:X}.")
@pytest.mark.parametrize("src", [b"", b"foo"])
def test_strdup_alternative(src: bytes):
print("") # Just to make pytest output more readable.
# Set expected result type.
wrapped_strdup.restype = ctypes.c_void_p
# Create the src buffer and retrieve its address.
src_buffer = ctypes.create_string_buffer(src)
src_addr = ctypes.addressof(src_buffer)
src_content = src_buffer[:strlen(src_buffer)]
# Run function to test.
dst = wrapped_strdup(src_buffer)
# Retrieve result address and content.
dst_addr = dst
# cast dst:
dst_pointer = ctypes.cast(dst, ctypes.POINTER(ctypes.c_char))
dst_content = dst_pointer[:strlen(dst_pointer)]
# Assertions.
assert src_content == dst_content
assert src_addr != dst_addr
# Output.
print("From Python:")
print(f"- Src content: {src_content!r}. Src address: {src_addr:X}.")
print(f"- Dst content: {dst_content!r}. Dst address: {dst_addr:X}.")
输出 :
$ pytest test_strdup.py -v -s
=============================== test session starts ===============================
platform linux -- Python 3.10.14, pytest-8.3.2, pluggy-1.5.0 -- /home/vmonteco/.pyenv/versions/3.10.14/envs/strduo_test/bin/python3.10
cachedir: .pytest_cache
rootdir: /home/vmonteco/code/MREs/MRe_strdup_test_with_ctypes
plugins: anyio-4.4.0, stub-1.1.0
collected 4 items
test_strdup.py::test_strdup[]
From C:
- src address: 661BBE90, src content: [].
- dst address: F5D8A7A0, dst content: [].
From Python:
- Src content: b''. Src address: 7C39661BBE90.
- Dst content: b''. Dst address: 57B4F5D8A7A0.
PASSED
test_strdup.py::test_strdup[foo]
From C:
- src address: 661BBE90, src content: [foo].
- dst address: F5E03340, dst content: [foo].
From Python:
- Src content: b'foo'. Src address: 7C39661BBE90.
- Dst content: b'foo'. Dst address: 57B4F5E03340.
PASSED
test_strdup.py::test_strdup_alternative[]
From C:
- src address: 661BBE90, src content: [].
- dst address: F5B0AC50, dst content: [].
From Python:
- Src content: b''. Src address: 7C39661BBE90.
- Dst content: b''. Dst address: 57B4F5B0AC50.
PASSED
test_strdup.py::test_strdup_alternative[foo]
From C:
- src address: 661BBE90, src content: [foo].
- dst address: F5BF9C20, dst content: [foo].
From Python:
- Src content: b'foo'. Src address: 7C39661BBE90.
- Dst content: b'foo'. Dst address: 57B4F5BF9C20.
PASSED
================================ 4 passed in 0.01s ================================
我想要从前 150 个生命值低于特定值的口袋妖怪中获取名称列表。
以下是我目前得到的信息:
def get_pokemon_with_similar_hp(max_hp):
pokemon_names = []
poke_data = []
for i in range(1, 151):
api_url = f"https://pokeapi.co/api/v2/pokemon/{i}"
pokemon_response = requests.get(api_url)
pokemon_data = pokemon_response.json()
poke_data.append(pokemon_data)
for j in range(0, 150):
if poke_data[j]['stats'][0]['base_stat'] < max_hp:
pokemon_names.append(poke_data[j]['name'])
return pokemon_names
这有效,并给了我想要的数据,但目前需要 8.49 秒来处理并发送到我的前端。有没有办法改进我的代码来加快速度?非常感谢 :)
我有两个pl.DataFrame
:
from datetime import date
import polars as pl
df1 = pl.DataFrame(
{
"symbol": [
"sec1", "sec1", "sec1", "sec1", "sec1", "sec1",
"sec2", "sec2", "sec2", "sec2", "sec2",
],
"date": [
date(2021, 9, 14),
date(2021, 9, 15),
date(2021, 9, 16),
date(2021, 9, 17),
date(2021, 8, 31),
date(2020, 12, 31),
date(2021, 9, 14),
date(2021, 9, 15),
date(2021, 8, 31),
date(2021, 12, 30),
date(2020, 12, 31),
],
"price": range(11),
}
)
df2 = pl.DataFrame(
{
"symbol": ["sec1", "sec2"],
"current_date": [date(2021, 9, 17), date(2021, 9, 15)],
"mtd": [date(2021, 8, 31), date(2021, 8, 31)],
"ytd": [date(2020, 12, 31), date(2020, 12, 30)],
}
)
with pl.Config(tbl_rows=-1):
print(df1)
print(df2)
shape: (11, 3)
┌────────┬────────────┬───────┐
│ symbol ┆ date ┆ price │
│ --- ┆ --- ┆ --- │
│ str ┆ date ┆ i64 │
╞════════╪════════════╪═══════╡
│ sec1 ┆ 2021-09-14 ┆ 0 │
│ sec1 ┆ 2021-09-15 ┆ 1 │
│ sec1 ┆ 2021-09-16 ┆ 2 │
│ sec1 ┆ 2021-09-17 ┆ 3 │
│ sec1 ┆ 2021-08-31 ┆ 4 │
│ sec1 ┆ 2020-12-31 ┆ 5 │
│ sec2 ┆ 2021-09-14 ┆ 6 │
│ sec2 ┆ 2021-09-15 ┆ 7 │
│ sec2 ┆ 2021-08-31 ┆ 8 │
│ sec2 ┆ 2021-12-30 ┆ 9 │
│ sec2 ┆ 2020-12-31 ┆ 10 │
└────────┴────────────┴───────┘
shape: (2, 4)
┌────────┬──────────────┬────────────┬────────────┐
│ symbol ┆ current_date ┆ mtd ┆ ytd │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ date ┆ date ┆ date │
╞════════╪══════════════╪════════════╪════════════╡
│ sec1 ┆ 2021-09-17 ┆ 2021-08-31 ┆ 2020-12-31 │
│ sec2 ┆ 2021-09-15 ┆ 2021-08-31 ┆ 2020-12-30 │
└────────┴──────────────┴────────────┴────────────┘
我需要筛选df1
每个组的价格,并根据相应的日期进行筛选df2
。我需要合并所有类型的列date
。这些列的数量df2
可能不固定。
我正在寻找以下结果:
shape: (11, 3)
┌────────┬────────────┬───────┐
│ symbol ┆ date ┆ price │
│ --- ┆ --- ┆ --- │
│ str ┆ date ┆ i64 │
╞════════╪════════════╪═══════╡
│ sec1 ┆ 2021-09-17 ┆ 3 │
│ sec1 ┆ 2021-08-31 ┆ 4 │
│ sec1 ┆ 2020-12-31 ┆ 5 │
│ sec2 ┆ 2021-09-15 ┆ 7 │
│ sec2 ┆ 2021-08-31 ┆ 8 │
│ sec2 ┆ 2020-12-30 ┆ 9 │
└────────┴────────────┴───────┘
我原本想df1
通过进行筛选,然后对 的每一列symbol
执行连接操作。然后我会将结果数据框连接起来。不过,可能还有更优雅的解决方案。date
df2
我有以下代码来计算从今天起 6 个月后的星期几。
// Java code
Date currentDate = (new SimpleDateFormat("yyyy-MM-dd")).parse("2024-08-30");
Calendar calendar = Calendar.getInstance();
calendar.setTime(currentDate);
calendar.add(Calendar.MONTH, 6);
Date sixMonthsLaterDate = calendar.getTime();
String sixMonthsLaterDateString = new SimpleDateFormat("yyyy-MM-dd").format(sixMonthsLaterDate);
System.out.println("sixMonthsLaterDateString: " + sixMonthsLaterDateString); // returns 2025-02-28
在 Java 中,它返回“2025-02-28”
// PHP code
$currentDate = date_create_from_format('Y-m-d', '2024-08-30');
$sixMonthsLaterDate = $currentDate->modify('+6 month');
$sixMonthsLaterDateString = date_format($sixMonthsLaterDate, 'Y-m-d');
echo "sixMonthsLaterDateString: $sixMonthsLaterDateString"; // returns 2025-03-02
在 PHP 中,它返回“2025-03-02”
为什么它们不同?有人能解释一下吗?谢谢!
我前一天开始学习 C,并编写了一个程序来在给定的范围内打印。范围的最小值和最大值由用户给出。
#include <stdio.h>
int check(int number)
{
if (number == 1)
{
return 0;
}
int count = 2;
while (count < number)
{
if (number%count == 0)
{
return 0;
}
count++;
}
return 1;
}
void main()
{
int i,min,max;
printf("Enter start of range: ");
scanf("%d",&min);
printf("Enter end of range: ");
scanf("%d",&max);
for (i = min;i < max;i++)
{
if (check(i) == 1)
{
printf("%d\n",i);
}
}
}
我得到了预期的输出,但我想知道是否有更好的方法在输入的数字为 1 时返回 0,或者在我看来它不像胶带代码。
我在程序进行 while 循环检查数字是否大于 1 之前插入了此代码块。
if (number == 1)
{
return 0;
}
我获得了预期的输出,但我想知道是否有比仅放置 if 语句更好的方法。
我的问题与建议的问题不同,因为我想知道是否有更好的方法来确定 1 是否不是质数。建议的问题是使用 if 语句,就像我做的那样。