小编kuz*_*roo的帖子

像Python一样格式化异常

如果我在Python中引发异常,这就是我得到的:

raise Exception("Hello world")
Traceback (most recent call last):

  File "<ipython-input-24-dd3f3f45afbe>", line 1, in <module>
    raise Exception("Hello world")

Exception: Hello world
Run Code Online (Sandbox Code Playgroud)

注意最后一行说的Exception: Hello world.给定Exception(foo = Exception("Hello world")),我该如何生成这样的文本?以下工作均不属于:

str(foo)
Out[27]: 'Hello world'

repr(foo)
Out[28]: "Exception('Hello world',)"

"{}".format(foo)
Out[29]: 'Hello world'

"{}: {}".format(type(foo), foo)
Out[30]: "<type 'exceptions.Exception'>: Hello world"
Run Code Online (Sandbox Code Playgroud)

python exception string-formatting

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

像常规列一样访问熊猫索引

我有一个带有命名索引的Pandas DataFrame。我想将其传递给一段代码,该代码采用一个DataFrame,一个列名和其他内容,并进行涉及该列的大量工作。仅在这种情况下,我要突出显示的列是索引,但是为该代码段提供索引的标签不起作用,因为您无法像常规列那样提取索引。例如,我可以像这样构造一个DataFrame:

import pandas as pd, numpy as np

df=pd.DataFrame({'name':map(chr, range(97, 102)), 'id':range(10000,10005), 'value':np.random.randn(5)})
df.set_index('name', inplace=True)
Run Code Online (Sandbox Code Playgroud)

结果如下:

         id     value
name                 
a     10000  0.659710
b     10001  1.001821
c     10002 -0.197576
d     10003 -0.569181
e     10004 -0.882097
Run Code Online (Sandbox Code Playgroud)

现在如何允许我访问该name列?

print(df.index)  # No problem
print(df['name'])  # KeyError: u'name'
Run Code Online (Sandbox Code Playgroud)

我知道有解决方法,例如复制列或将索引更改为其他内容。但是,是否有某种更清洁的方法,例如某种形式的列访问,可以像对待其他所有索引一样对待索引?

python indexing series dataframe pandas

6
推荐指数
3
解决办法
2024
查看次数

使用matplotlib的非重叠散点图标签

我有一个带有许多点的散点图.每个点都有一个与之相关的字符串(长度不一样),我想提供一个标签,但我不能适应它们.所以我想迭代我的数据点从最重要到最不重要,并且在每种情况下仅在标签不与现有标签重叠时才应用标签.琴弦长度不一.其中一位评论者提到解决背包问题以找到最佳解决方案.在我的情况下,贪心算法(总是标记可以被标记而没有重叠的最重要的剩余点)将是一个良好的开端并且可能就足够了.

这是一个玩具的例子.我可以让Python只标记尽可能多的点而不重叠吗?

import matplotlib.pylab as plt, numpy as np

npoints = 100
xs = np.random.rand(npoints)
ys = np.random.rand(npoints)

plt.scatter(xs, ys)

labels = iter(dir(np))
for x, y, in zip(xs, ys):
    # Ideally I'd condition the next line on whether or not the new label would overlap with an existing one
    plt.annotate(labels.next(), xy = (x, y))
plt.show()
Run Code Online (Sandbox Code Playgroud)

python matplotlib scatter-plot

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

使用 Python 和 Pandas 对具有不同列名的 statsmodels.formula 数据使用 predict()

我从运行中得到了一些回归结果statsmodels.formula.api.ols。这是一个玩具示例:

import pandas as pd
import numpy as np
import statsmodels.formula.api as smf

example_df = pd.DataFrame(np.random.randn(10, 3))
example_df.columns = ["a", "b", "c"]
fit = smf.ols('a ~ b', example_df).fit()
Run Code Online (Sandbox Code Playgroud)

我想将模型应用于 column c,但天真地尝试这样做是行不通的:

fit.predict(example_df["c"])
Run Code Online (Sandbox Code Playgroud)

这是我得到的例外:

PatsyError: Error evaluating factor: NameError: name 'b' is not defined
    a ~ b
        ^
Run Code Online (Sandbox Code Playgroud)

我可以做一些粗暴的事情并创建一个新的、临时DataFrame的,我可以在其中重命名感兴趣的列:

example_df2 = pd.DataFrame(example_df["c"])
example_df2.columns = ["b"]
fit.predict(example_df2)
Run Code Online (Sandbox Code Playgroud)

有没有更干净的方法来做到这一点?(短切换到statsmodels.api而不是statsmodels.formula.api

python numpy pandas statsmodels

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

numpy中多个向量的元素最小值

我知道在numpy中我可以计算出两个向量的元素最小值

numpy.minimum(v1, v2)
Run Code Online (Sandbox Code Playgroud)

如果我有一个相等维度的向量列表,V = [v1, v2, v3, v4](但列表,而不是数组),该怎么办?服用numpy.minimum(*V)不起作用.相反,首选的是什么?

python numpy

5
推荐指数
2
解决办法
6791
查看次数

以惯用的方式在Python中迭代os.walk中的各个文件

我从另一个stackoverflow问题中得到的一些代码开始,为目录树中的所有文件生成完整路径:

import os
def recursive_file_gen(mydir):
    for root, dirs, files in os.walk(mydir):
        for file in files:
            yield os.path.join(root, file)
Run Code Online (Sandbox Code Playgroud)

我想添加memoization,在我看来,最简单的实现方法就是让recursive_file_gen返回一个列表:

def recursive_file_list(mydir):
    result = []
    for root, dirs, files in os.walk(mydir):
        for file in files:
            result.append(os.path.join(root, file))
    return result
Run Code Online (Sandbox Code Playgroud)

这段代码很好,真的.当然不难发现发生了什么.但是使用连续append操作组合列表并不完全是Pythonic.我的猜测是使用Python语法有更好的方法,可能是通过列表理解,并且学习它会有所启发.

我当然可以写:

def recursive_file_list(mydir):
    return list(recursive_file_gen(mydir))
Run Code Online (Sandbox Code Playgroud)

并记住这一点.但我想知道是否有更清洁的东西.

python list-comprehension list generator os.walk

4
推荐指数
1
解决办法
1320
查看次数

使用execfile时如何防止运行__main__保护?

BDFL在2003年发布了一篇关于如何编写Python主函数的文章.他的榜样是这样的:

import sys
import getopt

class Usage(Exception):
    def __init__(self, msg):
        self.msg = msg

def main(argv=None):
    if argv is None:
        argv = sys.argv
    try:
        try:
            opts, args = getopt.getopt(argv[1:], "h", ["help"])
        except getopt.error, msg:
             raise Usage(msg)
        # more code, unchanged
    except Usage, err:
        print >>sys.stderr, err.msg
        print >>sys.stderr, "for help use --help"
        return 2

if __name__ == "__main__":
    sys.exit(main())
Run Code Online (Sandbox Code Playgroud)

究其原因,可选的参数argvmain()就是,"我们改变main()采取一个可选的argv参数,它使我们能够从交互式Python提示符调用它."

他解释了他的代码的最后一行,如下所示:

现在sys.exit()调用很烦人:main()调用时sys.exit(),您的交互式Python解释器将退出!补救措施是让 main()返回值指定退出状态.因此,最终的代码变成了

if …
Run Code Online (Sandbox Code Playgroud)

python program-entry-point exit

4
推荐指数
1
解决办法
1213
查看次数

如何在 Python 中以可重用的方式记录函数参数?

我发现自己多次编写这样的代码:

def my_func(a, b, *args, **kwargs):
    saved_args = locals() # Learned about this from http://stackoverflow.com/a/3137022/2829764
    local_var = "This is some other local var that I don't want to log"
    try:
        a/b
    except Exception as e:
        logging.exception("Oh no! My args were: " + str(saved_args))
        raise
Run Code Online (Sandbox Code Playgroud)

运行my_func(1, 0, "spam", "ham", my_kwarg="eggs")在 stderr 上给出以下输出:

ERROR:root:Oh no! My args were: {'a': 1, 'args': (u'spam', u'ham'), 'b': 0, 'kwargs': {'my_kwarg': u'eggs'}}
Traceback (most recent call last):
  File "/Users/kuzzooroo/Desktop/question.py", line 17, in my_func
    a/b …
Run Code Online (Sandbox Code Playgroud)

python logging arguments function

4
推荐指数
1
解决办法
3327
查看次数

为什么Python中的元组可以反转但没有__reversed__?

在讨论这个答案时,我们意识到元组没有__reversed__方法.我的猜测是创建迭代器需要改变元组.然而元组玩得很好reversed.为什么不能将这种方法用于reversed工作__reversed__呢?

>>> foo = range(3)
>>> foo
[0, 1, 2]
>>> list(foo.__reversed__())
[2, 1, 0]
>>> foo
[0, 1, 2]
>>> bar = (0, 1, 2)
>>> list(bar.__reversed__())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute '__reversed__'
>>> reversed(bar)
<reversed object at 0x10603b310>
>>> tuple(reversed(bar))
(2, 1, 0)
Run Code Online (Sandbox Code Playgroud)

python reverse iterator tuples immutability

4
推荐指数
1
解决办法
135
查看次数

无法pickle empty ordered_set

我正在使用从这个答案链接到的ordered_set模块的 1.2版本(目前是最新版本).我一直在做一些奇怪的行为,并追溯到这个:

from ordered_set import OrderedSet
import pickle

os_orig = OrderedSet()
print os_orig # 'OrderedSet'
print os_orig.items # '[]'
pickled = pickle.dumps(os_orig)
loaded = pickle.loads(pickled)
print loaded
Run Code Online (Sandbox Code Playgroud)

哪个加注AttributeError: 'OrderedSet' object has no attribute 'items'.如果OrderedSet不为空,一切都会好起来的.

不幸的是,当谈到泡菜时,我总是在脑子里 - 出了什么问题?

编辑:我应该补充一点,该模块似乎支持泡菜.来自自述文件:"添加了一个__getstate__,__setstate__所以可以腌制"

python pickle

4
推荐指数
1
解决办法
136
查看次数