如果我在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) 我有一个带有命名索引的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只标记尽可能多的点而不重叠吗?
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) 我从运行中得到了一些回归结果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)
我知道在numpy中我可以计算出两个向量的元素最小值
numpy.minimum(v1, v2)
Run Code Online (Sandbox Code Playgroud)
如果我有一个相等维度的向量列表,V = [v1, v2, v3, v4](但列表,而不是数组),该怎么办?服用numpy.minimum(*V)不起作用.相反,首选的是什么?
我从另一个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)
并记住这一点.但我想知道是否有更清洁的东西.
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)
究其原因,可选的参数argv来main()就是,"我们改变main()采取一个可选的argv参数,它使我们能够从交互式Python提示符调用它."
他解释了他的代码的最后一行,如下所示:
现在
sys.exit()调用很烦人:main()调用时sys.exit(),您的交互式Python解释器将退出!补救措施是让main()返回值指定退出状态.因此,最终的代码变成了Run Code Online (Sandbox Code Playgroud)if …
我发现自己多次编写这样的代码:
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) 在讨论这个答案时,我们意识到元组没有__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) 我正在使用从这个答案链接到的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__所以可以腌制"