我正在编写我的第一个Python模块,我想知道物流:具体来说,人们如何处理设置/构建.
它是标准的做法,所有的开始了distutils在地方的东西,并在virtualenv运行setup.py的每次修改和测试等?
人们更经常创建一个工作代码,然后担心将其转换为可分发的包吗?
非常具体的示例问题:我的代码需要访问数据文件.我应该只是在文件地址中硬编码,DATA_FILE_PATH = "./data/DATA.npz"或者我应该从一开始就弄清楚如何使用所有这些MANIFEST.in/ setup(..., package_data={ ... }, ...)东西?
编辑:@LukasGraf的这个惊人的答案提供了一些很棒的工作流程信息,很大程度上回答了我的问题.请给他一些赞成票!
我正在使用一个基本如下的过程:
Response从每个人获取一个对象.text每个Response 创建一个BeautifulSoup对象.根据我的理解,这对于问候来说似乎是理想的:
GRequests允许您使用带有Gevent的请求来轻松地进行异步HTTP请求.
但是,这两个进程(一个有请求,一个有grequests)似乎让我得到了不同的结果,其中一些请求在grequest中返回None而不是响应.
import requests
tickers = [
'A', 'AAL', 'AAP', 'AAPL', 'ABBV', 'ABC', 'ABT', 'ACN', 'ADBE', 'ADI',
'ADM', 'ADP', 'ADS', 'ADSK', 'AEE', 'AEP', 'AES', 'AET', 'AFL', 'AGN',
'AIG', 'AIV', 'AIZ', 'AJG', 'AKAM', 'ALB', 'ALGN', 'ALK', 'ALL', 'ALLE',
]
BASE = 'https://finance.google.com/finance?q={}'
rs = (requests.get(u) for u in [BASE.format(t) for t in tickers])
rs = list(rs)
rs
# [<Response [200]>,
# <Response [200]>,
# <Response [200]>, …Run Code Online (Sandbox Code Playgroud) 我正在尝试自学python字节码是如何工作的,所以我可以通过操作函数的代码来做一些事情(只是为了好玩,而不是用于实际用途)所以我从一些简单的例子开始,例如:
def f(x):
return x + 3/x
Run Code Online (Sandbox Code Playgroud)
字节码是*:
(124, 0, 0, 100, 1, 0, 124, 0, 0, 20, 23, 83)
Run Code Online (Sandbox Code Playgroud)
因此,它是有道理的,我认为124是LOAD_FAST字节码,并且正在加载的对象的名称是f.__code__.co_varnames[0]这里0后是多少124.并100表示LOAD_CONST加载f.__code__.co_consts[1]在那里1是在数字后100.但是有一堆辅助零,比如第二个,第三个和第五个零,似乎没有任何意义,至少对我而言.他们表示什么?
文本字节码:
>>> dis.dis(f)
2 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (3)
6 LOAD_FAST 0 (x)
9 BINARY_DIVIDE
10 BINARY_ADD
11 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
*注意:在Python 3中(字节码可能与上面不同),可以通过以下方式找到字节码:
>>> list(f.__code__.co_code)
[124, 0, 100, 1, 124, 0, 27, 0, 23, 0, 83, 0]
Run Code Online (Sandbox Code Playgroud) 我的代码的以下行导致警告:
import pandas as pd
s = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
s.loc[-1] = [5,np.nan,np.nan,6]
grouped = s.groupby(['A'])
for key_m, group_m in grouped:
group_m.loc[-1] = [10,np.nan,np.nan,10]
C:\Anaconda3\lib\site-packages\ipykernel\__main__.py:10: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
Run Code Online (Sandbox Code Playgroud)
根据文档,这是推荐的做法,所以发生了什么?
谢谢你的帮助.
我正在试验limit和limit_per_host参数aiohttp.connector.TCPConnector.
在下面的脚本中,我connector = aiohttp.connector.TCPConnector(limit=25, limit_per_host=5)转到aiohttp.ClientSession,然后打开2个请求到docs.aiohttp.org和3到github.com.
结果session.request是一个实例aiohttp.ClientResponse,在这个例子中我故意不.close()通过.close()或者调用它__aexit__.我认为这会使连接池保持打开状态,并减少与(host,ssl,port)三倍的可用连接数-1.
下表表示._available_connections()每个请求之后. 即使在完成对docs.aiohttp.org的第二次请求后,为什么数字仍为4? 这两个连接可能仍然是开放的,尚未访问._content或已关闭.可用连接不应减少1吗?
After Request Num. To _available_connections
1 docs.aiohttp.org 4
2 docs.aiohttp.org 4 <--- Why?
3 github.com 4
4 github.com 3
5 github.com 2
Run Code Online (Sandbox Code Playgroud)
此外,为什么._acquired_per_host只包含1个键? 我想我可能会理解的方法TCPConnector; 是什么解释了上面的行为?
完整脚本:
import aiohttp
async def main():
connector = aiohttp.connector.TCPConnector(limit=25, limit_per_host=5)
print("Connector arguments:")
print("_limit:", connector._limit)
print("_limit_per_host:", connector._limit_per_host)
print("-" …Run Code Online (Sandbox Code Playgroud) 我有一个 Django 应用程序。它使用 Nginx,位于 EC2 实例上,并在其前面使用 AWS 负载均衡器。Nginx 直接从磁盘提供静态文件,并proxy_pass用于路由到 WSGI 应用程序服务器的所有其他内容。
这是我看到令人费解的结果的 WSGI 服务器的选择。
当我使用Django开发服务器,./manage.py runserver 0.0.0.0:8000,平均响应时间在生成的HTML文档/是60-70毫秒:
Blocked: 1 ms
DNS resolution: 0 ms
Connecting: 0 ms
TLS setup: 0 ms
Sending: 0 ms
Waiting: 68 ms
Receiving: 0 ms
Run Code Online (Sandbox Code Playgroud)
现在,当我用“合适的” Gunicorn 服务器替换它时,同一请求/文档的平均响应时间现在是1800 毫秒!
Blocked: 1 ms
DNS resolution: 0 ms
Connecting: 0 ms
TLS setup: 0 ms
Sending: 0 ms
Waiting: 1859 ms
Receiving: 0 ms
Run Code Online (Sandbox Code Playgroud)
在这里,我将 Gunicorn 运行为: …
Run Code Online (Sandbox Code Playgroud)Cannot cast AnonymousUser to int. Are you trying to use it in place of User?
当我向我的网址发出发布请求时,我不确定如何调整我的代码以停止生成此错误。我已附加序列化器、视图和模型的代码。
class ActivitySessionSerializer(serializers.Serializer):
activity_name = serializers.CharField(min_length=1, max_length=100)
def create(self, validated_data):
activity, created = Activity.objects.get_or_create(name=validated_data['activity_name'],
owner=self.context['request'].user)
return ActivitySession.objects.create(activity=activity, start_time=datetime.datetime.now())
class StartSessionView(generics.CreateAPIView):
serializer_class = serializers.ActivitySessionSerializer
User = get_user_model()
class ActivityType(models.Model):
name = models.CharField(max_length=100)
user = models.ForeignKey(User, on_delete=models.CASCADE)
class Activity(models.Model):
name = models.CharField(max_length=100)
owner = models.ForeignKey(User, on_delete=models.CASCADE)
activity_type = models.ForeignKey(ActivityType, on_delete=models.CASCADE, null=True, blank=True)
class ActivitySession(models.Model):
activity = models.ForeignKey(Activity, on_delete=models.CASCADE)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
urlpatterns = [ …Run Code Online (Sandbox Code Playgroud) 由于列名很长,无论设置什么选项,DataFrame 都会以非常混乱的形式显示。
信息:我在 Jupyter QtConsole、pandas 0.20.1 中,在启动时指定了以下相关选项:
pd.set_option('display.max_colwidth', 20)
pd.set_option('expand_frame_repr', False)
pd.set_option('display.max_rows', 25)
Run Code Online (Sandbox Code Playgroud)
问题:如果需要,如何截断 DataFrame,而不是将列换行到下一行,同时保留expand_frame_repr=False?
这是一个例子。同样,问题不取决于列数,而是取决于列的长度。
这不会引起问题:
df = pd.DataFrame(np.random.randn(1000, 1000),
columns=['col' + str(i) for i in range(1000)])
Run Code Online (Sandbox Code Playgroud)
具有长列名的相同 DataFrame 会导致我正在讨论的问题:
df = pd.DataFrame(np.random.randn(1000, 1000),
columns=['very_long_col_name_'
+ str(i) for i in range(1000)])
Run Code Online (Sandbox Code Playgroud)
有什么方法可以使第二个输出与我缺少的第一个输出一致?(通过指定一个选项,而不是通过.iloc每次我想查看时使用。)
我对如何使用asyncio.Queue特定的生产者-消费者模式感到困惑,在该模式中,生产者和消费者都可以同时独立运行。
首先,请考虑以下示例,该示例紧随docs中的asyncio.Queue示例:
import asyncio
import random
import time
async def worker(name, queue):
while True:
sleep_for = await queue.get()
await asyncio.sleep(sleep_for)
queue.task_done()
print(f'{name} has slept for {sleep_for:0.2f} seconds')
async def main(n):
queue = asyncio.Queue()
total_sleep_time = 0
for _ in range(20):
sleep_for = random.uniform(0.05, 1.0)
total_sleep_time += sleep_for
queue.put_nowait(sleep_for)
tasks = []
for i in range(n):
task = asyncio.create_task(worker(f'worker-{i}', queue))
tasks.append(task)
started_at = time.monotonic()
await queue.join()
total_slept_for = time.monotonic() - started_at
for task in tasks:
task.cancel() …Run Code Online (Sandbox Code Playgroud) 我想使用statsmodelsOLS 类来创建多元回归模型。考虑以下数据集:
import statsmodels.api as sm
import pandas as pd
import numpy as np
dict = {'industry': ['mining', 'transportation', 'hospitality', 'finance', 'entertainment'],
'debt_ratio':np.random.randn(5), 'cash_flow':np.random.randn(5) + 90}
df = pd.DataFrame.from_dict(dict)
x = data[['debt_ratio', 'industry']]
y = data['cash_flow']
def reg_sm(x, y):
x = np.array(x).T
x = sm.add_constant(x)
results = sm.OLS(endog = y, exog = x).fit()
return results
Run Code Online (Sandbox Code Playgroud)
当我运行以下代码时:
reg_sm(x, y)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
TypeError: '>=' not supported between instances of 'float' and 'str'
Run Code Online (Sandbox Code Playgroud)
我已经尝试将industry变量转换为分类变量,但仍然出现错误。我别无选择。
python ×10
python-3.x ×4
pandas ×3
aiohttp ×1
async-await ×1
bytecode ×1
distribution ×1
django ×1
grequests ×1
gunicorn ×1
httprequest ×1
nginx ×1
package ×1
post ×1
statsmodels ×1
workflow ×1