我使用Python 3.4和匀称1.3.2从长/纬坐标对列表中创建一个多边形对象,我将其转换为一个众所周知的文本字符串以便解析它们.这样的Polygon可能看起来像:
POLYGON ((-116.904 43.371, -116.823 43.389, -116.895 43.407, -116.908 43.375, -116.904 43.371))
Run Code Online (Sandbox Code Playgroud)
由于shapely不处理任何投影并实现carthesian空间中的所有几何对象,因此在该多边形上调用area方法,如:
poly.area
Run Code Online (Sandbox Code Playgroud)
以平方度为单位给出了该多边形的面积.为了得到像平方米这样的平面单位的区域,我想我必须使用不同的投影(哪一个?)来变换多边形的坐标.
我多次读过pyproj库应该提供这样做的方法.使用pyproj,有没有办法将整个塑造的Polygon对象转换为另一个投影,然后计算面积?
我用我的多边形做了一些其他的东西(不是你现在想的),只有在某些情况下,我需要计算面积.
到目前为止,我只找到了这个例子:http: //all-geo.org/volcan01010/2012/11/change-coordinates-with-pyproj/
这意味着将每个Polygon对象分成其外部和(如果存在的话)内环,抓取坐标,将每对坐标转换为另一个投影并重建Polygon对象,然后计算其面积(无论如何它是什么单位?).这看起来像一个解决方案,但不太实用.
有更好的想法吗?
使用Python 3.4,Pandas 0.15和Statsmodels 0.6.0,我尝试从Statsmodels文档中描述的数据框创建马赛克图.但是,我只是不明白输入必须如何格式化提供给函数.mosaic()
给出一个简单的数据帧:
In:
myDataframe = pd.DataFrame({'size' : ['small', 'large', 'large', 'small', 'large', 'small'], 'length' : ['long', 'short', 'short', 'long', 'long', 'short']})
Out:
length size
0 long small
1 short large
2 short large
3 long small
4 long large
5 short small
Run Code Online (Sandbox Code Playgroud)
在尝试创建此数据的马赛克图时:
from statsmodels.graphics.mosaicplot import mosaic
mosaic(data=myDataframe, title='Mosaic Plot')
Run Code Online (Sandbox Code Playgroud)
给 ValueError: cannot label index with a null key
由于马赛克图是列联表的可视化,我试图创建这样的第一个
In:
myCrosstable = pd.crosstab(myDataframe['size'], myDataframe['length'])
Out:
length long short
size …Run Code Online (Sandbox Code Playgroud) 给定一个简单的Pandas系列,其中包含一些可以包含多个句子的字符串:
In:
import pandas as pd
s = pd.Series(['This is a long text. It has multiple sentences.','Do you see? More than one sentence!','This one has only one sentence though.'])
Out:
0 This is a long text. It has multiple sentences.
1 Do you see? More than one sentence!
2 This one has only one sentence though.
dtype: object
Run Code Online (Sandbox Code Playgroud)
我使用pandas字符串方法split和正则表达式模式将每一行拆分成单个句子(这会产生不必要的空列表元素 - 关于如何改进正则表达式的任何建议?).
In:
s = s.str.split(r'([A-Z][^\.!?]*[\.!?])')
Out:
0 [, This is a long text., , It has multiple se... …Run Code Online (Sandbox Code Playgroud) 使用HTTP 的HTTPretty库,我可以创建选择的模拟HTTP响应,然后选择它们,即使用请求库,如下所示:
import httpretty
import requests
# set up a mock
httpretty.enable()
httpretty.register_uri(
method=httpretty.GET,
uri='http://www.fakeurl.com',
status=200,
body='My Response Body'
)
response = requests.get('http://www.fakeurl.com')
# clean up
httpretty.disable()
httpretty.reset()
print(response)
Run Code Online (Sandbox Code Playgroud)
日期: <Response [200]>
是否有可能注册无法访问的uri(例如连接超时,连接被拒绝,......),以便根本不接收任何响应(这与提供HTTP错误代码的已建立连接不同像404)?
我希望在单元测试中使用此行为,以确保我的错误处理按预期工作(在"未建立连接"和"建立连接,错误的HTTP状态代码"的情况下,它会执行不同的操作).作为一种解决方法,我可以尝试连接到无效的服务器http://192.0.2.0,在任何情况下都会超时.但是,我更愿意在不使用任何真实网络连接的情况下进行所有单元测试.
从3.4版开始,Python 在编写unittests时支持简单的subtest语法。一个简单的示例如下所示:
import unittest
class NumbersTest(unittest.TestCase):
def test_successful(self):
"""A test with subtests that will all succeed."""
for i in range(0, 6):
with self.subTest(i=i):
self.assertEqual(i, i)
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
运行测试时,输出为
python3 test_foo.py --verbose
test_successful (__main__.NumbersTest)
A test with subtests that will all succeed. ... ok
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Run Code Online (Sandbox Code Playgroud)
但是,在我的实际用例中,子测试将取决于更复杂的可迭代项,并检查每个子测试有很大不同的内容。因此,我宁愿对每个子测试进行计数并将其作为单独的测试用例列出在输出中(Ran 6 tests in ...在此示例中),以获取完整的图片。
使用unittestPython中的普通模块是否可以通过某种方式实现?鼻子测试生成器功能将分别输出每个测试,但是如果可能的话,我希望与标准库保持兼容。
我使用DatetimeIndex创建一个pandas数据帧,如下所示:
import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# create datetime index and random data column
todays_date = datetime.datetime.now().date()
index = pd.date_range(todays_date-datetime.timedelta(10), periods=14, freq='D')
data = np.random.randint(1, 10, size=14)
columns = ['A']
df = pd.DataFrame(data, index=index, columns=columns)
# initialize new weekend column, then set all values to 'yes' where the index corresponds to a weekend day
df['weekend'] = 'no'
df.loc[(df.index.weekday == 5) | (df.index.weekday == 6), 'weekend'] = 'yes'
print(df)
Run Code Online (Sandbox Code Playgroud)
这使
A weekend …Run Code Online (Sandbox Code Playgroud) 我试图从一堆大的CSV文件(目前12个文件,每个8-10万行和50列)创建一个dask.dataframe.其中一些可能适合我的系统内存,但它们一次肯定不会,因此使用dask而不是常规的pandas.
由于读取每个csv文件涉及一些额外的工作(使用文件路径中的数据添加列),我尝试从延迟对象列表创建dask.dataframe,类似于此示例.
这是我的代码:
import dask.dataframe as dd
from dask.delayed import delayed
import os
import pandas as pd
def read_file_to_dataframe(file_path):
df = pd.read_csv(file_path)
df['some_extra_column'] = 'some_extra_value'
return df
if __name__ == '__main__':
path = '/path/to/my/files'
delayed_collection = list()
for rootdir, subdirs, files in os.walk(path):
for filename in files:
if filename.endswith('.csv'):
file_path = os.path.join(rootdir, filename)
delayed_reader = delayed(read_file_to_dataframe)(file_path)
delayed_collection.append(delayed_reader)
df = dd.from_delayed(delayed_collection)
print(df.compute())
Run Code Online (Sandbox Code Playgroud)
当启动这个脚本(Python 3.4,dask 0.12.0)时,它运行了几分钟,而我的系统内存不断填满.当它被完全使用时,一切都开始滞后并且运行了几分钟,然后它killed或者崩溃了MemoryError.
我认为dask.dataframe的重点是能够操作跨越磁盘上多个文件的大于内存的数据帧,所以我在这里做错了什么?
编辑:阅读文件而不是df = dd.read_csv(path + '/*.csv') …
我想将一堆大型pandas数据帧(几百万行和50列)索引到Elasticsearch中.
在查找如何执行此操作的示例时,大多数人将使用elasticsearch-py的批量帮助程序方法,向其传递处理连接的Elasticsearch类的实例以及使用pandas的dataframe.to_dict创建的字典列表( orient ='records')方法.元数据可以预先作为新列插入到数据帧中,例如df['_index'] = 'my_index'等.
但是,我有理由不使用elasticsearch-py库,并希望直接与Elasticsearch批量API通信,例如通过请求或其他方便的HTTP库.不过df.to_dict(),不幸的是,在大型数据帧上运行速度非常慢,并且将数据帧转换为dicts列表然后通过elasticsearch-py序列化为JSON听起来像是不必要的开销,当有像dataframe.to_json()这样的东西时甚至很快大型数据帧.
将pandas数据帧变为批量API所需格式的简单快捷方法是什么?我认为朝着正确方向迈出的一步是dataframe.to_json()如下:
import pandas as pd
df = pd.DataFrame.from_records([{'a': 1, 'b': 2}, {'a': 3, 'b': 4}, {'a': 5, 'b': 6}])
df
a b
0 1 2
1 3 4
2 5 6
df.to_json(orient='records', lines=True)
'{"a":1,"b":2}\n{"a":3,"b":4}\n{"a":5,"b":6}'
Run Code Online (Sandbox Code Playgroud)
现在这是一个换行符分隔的JSON字符串,但它仍然缺少元数据.什么是一种表演方式来获得它?
编辑: 为了完整性,元数据JSON文档将如下所示:
{"index": {"_index": "my_index", "_type": "my_type"}}
Run Code Online (Sandbox Code Playgroud)
因此,最终批量API所期望的整个JSON看起来像这样(在最后一行之后有一个额外的换行符):
{"index": {"_index": "my_index", "_type": "my_type"}}
{"a":1,"b":2}
{"index": {"_index": "my_index", "_type": …Run Code Online (Sandbox Code Playgroud) 对于在动态IP地址可能随时间变化的Docker容器前面使用traefik作为反向代理,traefik附带了一个docker 后端.我设置的所有示例都遵循相同的模式:
首先,在docker没有额外配置文件的模式下启动traefik ,激活主机网络模式(可选,以便traefik可以在需要时查看主机上的所有Docker网络)并安装Docker unix套接字,以便traefik可以监听容器的启动和停止.
docker run --rm -p 80:80 --net=host --name traefik-reverse-proxy -v /dev/null/traefik.toml:/etc/traefik/traefik.toml -v /var/run/docker.sock:/var/run/docker.sock traefik --docker --loglevel debug
Run Code Online (Sandbox Code Playgroud)
然后,启动另一个容器并至少设置以下标签:
例:
docker run --rm --name nginx -l traefik.backend="some-backend-name" -l traefik.frontend.rule="Host: localhost; Method: GET" -l traefik.port="80 nginx
Run Code Online (Sandbox Code Playgroud)
然后,执行a curl localhost,可以在traefik容器的日志中看到它接收请求并将其路由到NGINX容器.
到目前为止,这么好......但是,我不喜欢我必须在应用程序本身(我的docker-中)配置我的反向代理转发规则(例如转发主机:some.host.name到容器xxx)这一事实.撰写文件设置容器,标签等通常位于).相反,我想将其与应用程序分开,并将其配置为traefik配置的一部分.
这有可能吗?我尝试的是traefik.frontend.rule从示例nginx容器中省略标签,而是安装以下配置文件traefik:
[frontends]
[frontends.frontend1]
backend = "some-backend-name"
[frontends.frontend1.routes.test_1]
rule = "Host: localhost; Method: GET"
Run Code Online (Sandbox Code Playgroud)
因此启动命令traefik变为:
docker run --rm -p 80:80 …Run Code Online (Sandbox Code Playgroud) docker config ls在我的 Docker Swarm 集群上创建和删除堆栈和服务一段时间后,和返回的列表docker secret ls非常广泛。但是,列出的许多配置和机密都是以前部署的过时遗留物,并且不再被任何正在运行的服务引用。
是否有任何类似于docker system prune的快速等效方法可以清除未引用项目中的配置和秘密存储?
python ×8
pandas ×4
docker ×2
unit-testing ×2
area ×1
dask ×1
dataframe ×1
docker-swarm ×1
httpretty ×1
matplotlib ×1
polygon ×1
regex ×1
shapely ×1
statsmodels ×1
string ×1
traefik ×1