我正在尝试使用PyCharm中的nosetests调试测试.我需要在断点处停止并使用PyCharm调试控制台进行一些交互式调试.但是,每当我在调试控制台提示符下键入任何内容时,都不打印任何内容 我刚刚得到一个新的提示.调试控制台与pytest完美配合,但我需要使用nosetests进行此特定测试.如何让控制台正常工作?
我有一个像这样的DataFrame:
df2 = pd.DataFrame({'date': ['2015-01-01', '2015-01-02', '2015-01-03'],
'value': ['a', 'b', 'a']})
date value
0 2015-01-01 a
1 2015-01-02 b
2 2015-01-03 a
Run Code Online (Sandbox Code Playgroud)
我试图了解如何应用自定义滚动功能.我试过这样做:
df2.rolling(2).apply(lambda x: 1)
Run Code Online (Sandbox Code Playgroud)
但这给了我原始的DataFrame:
date value
0 2015-01-01 a
1 2015-01-02 b
2 2015-01-03 a
Run Code Online (Sandbox Code Playgroud)
如果我有一个不同的DataFrame,像这样:
df3 = pd.DataFrame({'a': [1, 2, 3], 'value': [4, 5, 6]})
Run Code Online (Sandbox Code Playgroud)
同样的滚动似乎有效:
df3.rolling(2).apply(lambda x: 1)
a value
0 NaN NaN
1 1.0 1.0
2 1.0 1.0
Run Code Online (Sandbox Code Playgroud)
为什么这不适用于第一个DataFrame?
熊猫版:0.20.2
Python版本:2.7.10
更新
所以,我已经意识到df2列的是对象类型,而我的lambda函数的输出是一个整数.df3列是整数列.我假设这就是为什么apply不起作用的原因.
以下不起作用:
df2.rolling(2).apply(lambda x: …Run Code Online (Sandbox Code Playgroud) 假设我有一个这样的生成器:
def a(data):
for val in data:
yield val
Run Code Online (Sandbox Code Playgroud)
假设我想将此生成器包装在另一个生成器 中,b该生成器仅生成 中的一些值a,具体取决于它们的值。b应该能够将从调用者发回的值转发到a. 我知道将一个生成器包装在另一个生成器中的最新方法是使用该yield from语句。就像是:
def b(data):
yield from val = a(data) if val == "foo"
Run Code Online (Sandbox Code Playgroud)
我知道语法是错误的(这只是为了理解这个想法),所以我想知道是否有正确的方法来使用yield from条件语句。或者我应该使用其他一些构造?
我需要解析一个非常大的(~40GB)XML文件,从中删除某些元素,并将结果写入新的xml文件.我一直在尝试使用python的ElementTree中的iterparse,但我对如何修改树然后将结果树写入新的XML文件感到困惑.我已经阅读了关于itertree的文档,但它还没有解决问题.有没有简单的方法来做到这一点?
谢谢!
编辑:这是我到目前为止所拥有的.
import xml.etree.ElementTree as ET
import re
date_pages = []
f=open('dates_texts.xml', 'w+')
tree = ET.iterparse("sample.xml")
for i, element in tree:
if element.tag == 'page':
for page_element in element:
if page_element.tag == 'revision':
for revision_element in page_element:
if revision_element.tag == '{text':
if len(re.findall('20\d\d', revision_element.text.encode('utf8'))) == 0:
element.clear()
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我收到一个pandas DataFrame(例如block),其中有一个名为的列est。此列可以包含字符串或浮点数的混合。我需要将列中的所有值都转换为浮点数,并且将列类型设置为float64。我使用以下代码执行此操作:
block[est].convert_objects(convert_numeric=True)
block[est].astype('float')
Run Code Online (Sandbox Code Playgroud)
这适用于大多数情况。但是,在一种情况下,est包含所有空字符串。在这种情况下,第一个语句将正确执行,但列中的空字符串仍为空字符串。然后,第二条语句导致错误:ValueError: could not convert string to float:。
如何修改代码以处理包含所有空字符串的列?
编辑:我知道我可以做block[est].replace("", np.NaN),但是我想知道是否有某种方法可以做到公正,convert_objects或者astype我错过了。
说明:出于项目特定的原因,我需要使用pandas 0.16.2。
这是与一些演示失败的示例数据的交互:
>>> block = pd.DataFrame({"eps":["", ""]})
>>> block = block.convert_objects(convert_numeric=True)
>>> block["eps"]
0
1
Name: eps, dtype: object
>>> block["eps"].astype('float')
...
ValueError: could not convert string to float:
Run Code Online (Sandbox Code Playgroud) 我需要创建一个上下文管理器,当满足某些条件时,可以强制它提前退出.
更多细节:
上下文管理器需要处理检查/锁定/释放资源.在__enter__,上下文管理器需要检查资源是否被锁定.如果是,我想在__exit__不执行上下文中的代码的情况下调用.否则,上下文管理器获取资源,执行上下文代码,并清理资源__exit__.
它可能看起来像这样:
class my_context_manager:
def __enter__(self):
if resource_locked():
self.__exit__(None, ResourceLockedException(), None)
else:
acquire_resource()
def __exit__(self, *exc_info):
if not isinstance(exc_info[1], ResourceLockedException):
release_resource()
else:
log.warn("Resource already in use.")
Run Code Online (Sandbox Code Playgroud)
但是,上面的代码实际上并不起作用,因为调用__exit__内部__enter__并不会阻止上下文中的代码被执行.
或者,我可以ResourceLockedException从内部抛出__enter__,但之后__exit__不会被调用,因为异常将从上下文管理器本身抛出.我希望能够捕获异常,记录警告,如果资源被锁定则不输入上下文.
这归结为找到一些早期关闭上下文的方法,因此__exit__调用它并且不执行上下文代码.有没有办法调整上述任何一个想法来做到这一点?或者还有另一种方式吗?
我正在使用 读取来自外部数据源的 csv 文件pd.read_csv,如下面的代码所示:
pd.read_csv(
BytesIO(raw_data),
parse_dates=['dates'],
date_parser=np.datetime64,
)
Run Code Online (Sandbox Code Playgroud)
但是,在发送的 csv 中的某处,日期格式错误,导致以下错误:
ValueError: Error parsing datetime string "2015-08-2" at position 8
Run Code Online (Sandbox Code Playgroud)
这会导致整个应用程序崩溃。当然,我可以使用 try/except 处理这种情况,但是我将丢失该特定 csv 中的所有其他数据。我需要熊猫来保存和解析其他数据。
我无法预测这些数据(每天都在变化)的日期格式错误的时间/地点。有没有办法pd.read_csv只跳过日期错误的行,但仍然解析 csv 中的所有其他行?
我有一些我需要用NaT取代的NaN系列.我怎样才能做到这一点?
这是我到目前为止尝试过的一个简单示例:
>>> s = pd.Series([np.NaN, np.NaN])
>>> s.fillna(pd.NaT)
0 NaN
1 NaN
dtype: float64
>>> s.replace(np.NaN, pd.NaT)
0 NaN
1 NaN
dtype: float64
>>> s.where(pd.notnull(s), pd.NaT)
0 NaN
1 NaN
dtype: object
Run Code Online (Sandbox Code Playgroud)
熊猫版:0.16.2
numpy版本:1.9.2
python版本:2.7.10
我正在尝试构建具有2个组件的服务。在第1部分中,我通过创建,使用sklearn训练了机器学习模型Pipeline。该模型使用joblib.dump(真的numpy_pickle.dump)序列化。组件2在云中运行,加载由(1)训练的模型,并使用它来标记作为输入的文本。
我遇到一个问题,在训练期间(组件1),我需要首先对数据进行二值化,因为它是文本数据,这意味着该模型在二值化输入上进行了训练,然后使用由二值化器创建的映射进行预测。当(2)根据模型进行预测时,我需要重新获得此映射,以便可以输出实际的文本标签。
我试图像这样将binarizer添加到管道中,以为模型将具有映射本身:
p = Pipeline([
('binarizer', MultiLabelBinarizer()),
('vect', CountVectorizer(min_df=min_df, ngram_range=ngram_range)),
('tfidf', TfidfTransformer()),
('clf', OneVsRestClassifier(clf))
])
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
model = p.fit(training_features, training_tags)
*** TypeError: fit_transform() takes 2 positional arguments but 3 were given
Run Code Online (Sandbox Code Playgroud)
我的目标是确保将二进制化器和模型绑定在一起,以便用户知道如何解码模型的输出。
有哪些现有的范例可以做到这一点?是否应该在我创建的其他对象中将二进制化器与模型一起序列化?还有其他将二进制化器传递给Pipeline我的方法,这样我就不必这样做,如果这样做,我是否能够从模型取回映射?
我创建了一个 Google Compute Engine 实例模板,并设置了以下防火墙选项:
然后,我从该模板创建一个实例组,但我似乎无法通过 HTTP/HTTPS 访问该实例。当我查看实例组的设置时,我发现 HTTP/HTTPS 框未选中:
这里发生了什么?这些框不应该被选中吗?我是否应该通过其他方式允许从模板创建的实例组/实例使用 HTTP/HTTPS?
假设我有这样一个类:
class Foo(namedtuple('Foo', ['f1'])):
def f1(self):
print('Default f1')
def __new__(cls, f1=f1):
return super().__new__(cls, f1)
Run Code Online (Sandbox Code Playgroud)
让我们说我稍后创建一个Foo对象并选择覆盖f1的方法定义,如下所示:
def my_f1():
print("My f1")
foo = Foo(f1=my_f1)
Run Code Online (Sandbox Code Playgroud)
如果我然后尝试:
foo.f1()
Run Code Online (Sandbox Code Playgroud)
我明白了:
Default f1
Run Code Online (Sandbox Code Playgroud)
当然,我正试图打印"我的f1".我也希望f1是可选的.这里发生了什么?是否可以为namedtuple中的方法定义默认实现,然后在new中覆盖它?
我在 PostgreSQL 数据库中有一个表 x 和一个基于 x 的视图 x_view。
X:
CREATE TABLE x (
A double precision
);
Run Code Online (Sandbox Code Playgroud)
x_视图:
CREATE VIEW x_view AS
SELECT x.A;
Run Code Online (Sandbox Code Playgroud)
我将 x 中的一列从 A 重命名为 B。
ALTER TABLE x RENAME COLUMN A to B
Run Code Online (Sandbox Code Playgroud)
当我查看视图的定义时,我看到以下内容:
SELECT x.B AS A from x;
Run Code Online (Sandbox Code Playgroud)
当我执行“SELECT * FROM x_view”时,现在应该标记为 B 的列仍标记为 A。
为什么执行“SELECT * FROM x_view”时视图不会自动更改列名?除了必须删除并重新创建视图之外,还有什么方法可以强制它这样做?
python ×7
pandas ×4
csv ×1
debugging ×1
elementtree ×1
generator ×1
http ×1
https ×1
namedtuple ×1
networking ×1
nose ×1
overriding ×1
postgresql ×1
pycharm ×1
python-3.x ×1
rename ×1
scikit-learn ×1
view ×1
xml ×1