小编Rus*_*rdt的帖子

tqdm progressbar和zip内置不能一起工作

tqdm是一个Python模块,可以在控制台中轻松打印动态更新进度条.例如

from tqdm import tqdm
from time import sleep
for _ in tqdm(range(10)): 
    sleep(0.1) 
Run Code Online (Sandbox Code Playgroud)

在迭代执行时,在控制台中打印动态进度条1秒: 在此输入图像描述

我还没弄明白如何将tqdm与内置的zip对象一起使用.
这种情况的用例是使用控制台进度条迭代两个相应的列表.
例如,我希望这可以工作:

for _, _ in tqdm(zip(range(10), range(10))):
    sleep(0.1)
Run Code Online (Sandbox Code Playgroud)

但在这种情况下打印到控制台的进度条不正确: 在此输入图像描述

解决方法是使用带有枚举的tqdm,但是必须定义和管理迭代器索引.

python console progress-bar tqdm

13
推荐指数
3
解决办法
4423
查看次数

使用 pyarrow 的 Python 错误 - ArrowNotImplementedError:未构建对编解码器“snappy”的支持

使用 Python、Parquet 和 SparkArrowNotImplementedError: Support for codec 'snappy' not built升级到pyarrow=3.0.0. 我以前没有这个错误的版本是pyarrow=0.17. 该错误出现在 中pyarrow=1.0.1但确实出现在pyarrow=2.0.0. 这个想法是使用 Snappy 压缩将 Pandas DataFrame 编写为 Parquet 数据集(在 Windows 上),然后使用 Spark 处理 Parquet 数据集。

import numpy as np
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

df = pd.DataFrame({
    'x': [0, 0, 0, 1, 1, 1], 
    'a': np.random.random(6), 
    'b': np.random.random(6)})
table = pa.Table.from_pandas(df, preserve_index=False)
pq.write_to_dataset(table, root_path=r'c:/data', partition_cols=['x'], flavor='spark')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

parquet apache-arrow pyarrow

7
推荐指数
2
解决办法
3861
查看次数

从外部范围访问 pyspark 用户定义函数中的对象,避免 PicklingError: Could not serialize object

如何避免在pyspark用户定义函数中初始化类?这是一个例子。

创建一个spark会话和代表四个纬度和经度的 DataFrame。

import pandas as pd
from pyspark import SparkConf
from pyspark.sql import SparkSession

conf = SparkConf()
conf.set('spark.sql.execution.arrow.pyspark.enabled', 'true')
spark = SparkSession.builder.config(conf=conf).getOrCreate()

sdf = spark.createDataFrame(pd.DataFrame({
    'lat': [37, 42, 35, -22],
    'lng': [-113, -107, 127, 34]}))
Run Code Online (Sandbox Code Playgroud)

这是 Spark 数据框

+---+----+
|lat| lng|
+---+----+
| 37|-113|
| 42|-107|
| 35| 127|
|-22|  34|
+---+----+
Run Code Online (Sandbox Code Playgroud)

通过包在每个纬度/经度处使用时区字符串丰富 DataFrame timezonefinder下面的代码运行没有错误

from typing import Iterator
from timezonefinder import TimezoneFinder

def func(iterator: Iterator[pd.DataFrame]) -> Iterator[pd.DataFrame]:
    for dx in iterator:
        tzf …
Run Code Online (Sandbox Code Playgroud)

python serialization user-defined-functions apache-spark pyspark

7
推荐指数
1
解决办法
947
查看次数

ipdb 调试器中的 IPython 帮助功能

可以通过help命令或使用? 特点。例如,对于内置sum函数的帮助,可以使用 IPython shell 中的以下任一命令。

In [1]: help(sum)
Help on built-in function sum in module builtin:
...

In [2]: sum?
Signature: sum(iterable, start=0, /)
Docstring: ...
Run Code Online (Sandbox Code Playgroud)

我想在ipdb调试器中具有相同的功能。通过将以下代码放置在调试断点的位置,可以进入ipdb调试器。

from ipdb import set_trace
set_trace()
Run Code Online (Sandbox Code Playgroud)

但是,一旦进入ipdb调试器,帮助功能就不再起作用。

ipdb> help(sum)
*** No help for '(sum)'
ipdb> sum?
*** SyntaxError: invalid syntax
ipdb>
Run Code Online (Sandbox Code Playgroud)

IPython shell 和 ipdb 调试器中的帮助

下面的命令代表了一种在ipdb调试器中打印文档字符串的方法,但这与help(sum)sum? 在 IPython 外壳中。

ipdb> print(sum.__doc__)
Run Code Online (Sandbox Code Playgroud)

那么如何在 IPython shell 中存在的 …

python debugging ipython ipdb

6
推荐指数
1
解决办法
552
查看次数

在pandas DataFrame的drop_duplicates方法中考虑重复索引

drop_duplicatesPandas DataFrame 的方法在删除重复行时会考虑所有列(默认)或列子集(可选),并且不能考虑重复索引。

我正在寻找一种干净的单行解决方案,该方案在确定重复行时会考虑索引以及子集或所有列。例如,考虑DataFrame

df = pd.DataFrame(index=['a', 'b', 'b', 'c'], data={'A': [0, 0, 0, 0], 'B': [1, 0, 0, 0]})
   A  B
a  0  1
b  0  0
b  0  0
c  0  0
Run Code Online (Sandbox Code Playgroud)

默认使用的drop_duplicates方法给出

df.drop_duplicates()
   A  B
a  0  1
b  0  0
Run Code Online (Sandbox Code Playgroud)

如果在确定重复行时也考虑了索引,则结果应为

df.drop_duplicates(consider_index=True) # not a supported keyword argument
   A  B
a  0  1
b  0  0
c  0  0
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以提供此功能,这比我目前的方法要好:

df['index'] = df.index
df.drop_duplicates(inplace=True)
del df['index']
Run Code Online (Sandbox Code Playgroud)

python duplicates pandas

6
推荐指数
2
解决办法
1376
查看次数

Python Bokeh向widget事件处理程序发送其他参数

我想将其他数据发送到散景事件处理程序(例如on_change或on_click方法).下面是一个递增或递减整数的最小示例(我使用'bokeh serve --show app.py运行此应用程序).我必须编写单独的事件处理程序,在这个例子中做几乎相同的事情.要使用一个事件处理函数编写此应用程序,我需要传递其他数据或事件处理程序必须知道调用对象.我怎么做?

from bokeh.plotting import curdoc
from bokeh.models.widgets import Button, Paragraph
from bokeh.layouts import widgetbox

minus = Button(label='-')
plus = Button(label='+')
text = Paragraph(text='0')

def minus_callback():
    text.text = str(int(text.text) - 1)

def plus_callback():
    text.text = str(int(text.text) + 1)

minus.on_click(minus_callback)
plus.on_click(plus_callback)
# I would prefer to just use one callback and pass additional data to it:
# minus.on_click(callback, action='decrement')
# plus.on_click(callback, action='increment')

layout = widgetbox(minus, plus, text)
curdoc().add_root(layout)
Run Code Online (Sandbox Code Playgroud)

python events bokeh

5
推荐指数
1
解决办法
2099
查看次数

PySpark SQL 中的用户定义聚合函数

如何在 PySpark SQL 中实现用户定义聚合函数 (UDAF)?

pyspark version = 3.0.2
python version = 3.7.10
Run Code Online (Sandbox Code Playgroud)

作为一个最小的示例,我想用 UDAF 替换 AVG 聚合函数:

sc = SparkContext()
sql = SQLContext(sc)
df = sql.createDataFrame(
    pd.DataFrame({'id': [1, 1, 2, 2], 'value': [1, 2, 3, 4]}))
df.createTempView('df')
rv = sql.sql('SELECT id, AVG(value) FROM df GROUP BY id').toPandas()
Run Code Online (Sandbox Code Playgroud)

其中 rv 将是:

In [2]: rv
Out[2]:
   id  avg(value)
0   1         1.5
1   2         3.5
Run Code Online (Sandbox Code Playgroud)

UDAF 如何替换AVG查询中的内容?

例如,这不起作用

import numpy as np
def udf_avg(x):
    return np.mean(x)
sql.udf.register('udf_avg', udf_avg)
rv = …
Run Code Online (Sandbox Code Playgroud)

user-defined-functions pandas apache-spark apache-spark-sql pyspark

5
推荐指数
1
解决办法
2949
查看次数

添加一个没有 JavaScript 的自定义 python 散景小部件

我想在不使用 JavaScript 的情况下创建自定义散景小部件,即不遵循有关添加自定义小部件的散景文档。下面的示例演示了在 PyQt4 中创建自定义小部件(我经常使用它),以及我希望在散景中工作的内容以及我收到的错误消息。

有没有其他方法可以在不使用 JavaScript 的情况下在散景中创建自定义小部件?具体来说,我正在尝试创建一个自定义滑块,每侧带有小 - 和 + 按钮,将滑块递增/递减 1 步。我想在许多应用程序中使用这个自定义小部件,所以我希望它定义为自己的类,并且 on_change 方法链接到滑块 on_change 方法。我想制作散景中的其他自定义小部件(没有 JS!),我想知道这是否可能。

# this works as a base to develop custom PyQt4 widgets
from PyQt4 import QtGui
import sys

class NewWidget(QtGui.QWidget):
    def __init__(self):
        super().__init__()

app = QtGui.QApplication([])
widget = NewWidget()
widget.show()
sys.exit(app.exec_())


# this does not work as a base to develop custom bokeh widgets
# when run, a tab opens with the message
# Bokeh Error
# Model `NewWidget' does …
Run Code Online (Sandbox Code Playgroud)

python widget bokeh

2
推荐指数
1
解决办法
1752
查看次数