小编8on*_*ne6的帖子

Django过滤多列值的"元组"的查询集

说我有一个模型:

Class Person(models.Model):
    firstname = models.CharField()
    lastname = models.CharField()
    birthday = models.DateField()
    # etc...
Run Code Online (Sandbox Code Playgroud)

并说我有一个2个名字的列表:first_list = ['Bob', 'Rob']我有一个2个姓氏的列表:last_list = ['Williams', 'Williamson'].然后,如果我想选择名字所在的每个人,first_list我可以运行:

Person.objects.filter(firstname__in=first_list)
Run Code Online (Sandbox Code Playgroud)

如果我想选择其姓氏的所有人last_list,我可以这样做:

Person.objects.filter(lastname__in=last_list)
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.如果我想同时运行这两个限制,这很容易......

Person.objects.filter(firstname__in=first_list, lastname__in=last_list)
Run Code Online (Sandbox Code Playgroud)

如果我想进行or样式搜索而不是and样式搜索,我可以用Q对象来做:

Person.objects.filter(Q(firstname__in=first_list) | Q(lastname__in=last_name))
Run Code Online (Sandbox Code Playgroud)

但我想到的是一些更微妙的东西.如果我只想返回一个返回名字和姓氏的特定组合的查询集,该怎么办?即我要返回Person的哪些对象(Person.firstname, Person.lastname)zip(first_names, last_names).即我想找回任何一个名叫鲍勃威廉姆斯或罗伯威廉姆森的人(但不是任何一个名叫鲍勃威廉姆森或罗布威廉姆斯).

在我的实际使用情况,first_listlast_list就都有〜100元.

目前,我需要在Django应用程序中解决此问题.但我也很好奇在更一般的SQL上下文中处理这个问题的最佳方法.

谢谢!(如果我能说清楚的话,请告诉我.)

python sql django django-queryset

17
推荐指数
2
解决办法
6365
查看次数

使用多索引在pandas中添加小计列

我有一个数据框,在列上有一个3级深度多索引.我想计算行(sum(axis=1))中的小计,其中我在其中一个级别上求和,同时保留其他级别.我想我知道如何使用level关键字参数来做到这一点pd.DataFrame.sum.但是,我很难想到如何将这笔钱的结果合并到原始表中.

建立:

import numpy as np
import pandas as pd
from itertools import product

np.random.seed(0)

colors = ['red', 'green']
shapes = ['square', 'circle']
obsnum = range(5)

rows = list(product(colors, shapes, obsnum))
idx = pd.MultiIndex.from_tuples(rows)
idx.names = ['color', 'shape', 'obsnum']

df = pd.DataFrame({'attr1': np.random.randn(len(rows)), 
                   'attr2': 100 * np.random.randn(len(rows))},
                  index=idx)

df.columns.names = ['attribute']

df = df.unstack(['color', 'shape'])
Run Code Online (Sandbox Code Playgroud)

给出一个漂亮的框架:

原始框架

说我想降低shape水平.我可以跑:

tots = df.sum(axis=1, level=['attribute', 'color'])
Run Code Online (Sandbox Code Playgroud)

得到我的总数是这样的:

总计

有了这个,我想把它放到原来的框架上.我想我可以用一种有点麻烦的方式做到这一点:

tots = df.sum(axis=1, level=['attribute', 'color'])
newcols = pd.MultiIndex.from_tuples(list((i[0], …
Run Code Online (Sandbox Code Playgroud)

python pandas

14
推荐指数
2
解决办法
4685
查看次数

Django-debug-toolbar-line-profiler只显示一行输出,没有内容

我有一个Raspberry Pi坐在一个偏远的位置.它连接到一个小型自制电路和温度探头.我已经设置了Raspberry Pi来做一些事情:

  • cron每小时运行一次作业以获取温度读数并将其本地存储到sqlite数据库
  • 运行Nginx Web服务器
  • 运行uwsgi应用程序服务器
  • 提供一个简单的Django应用程序

在那个Django应用程序中,我有一个简单的视图,执行以下操作:

  1. 点击DB获取最后300次温度记录
  2. 把它们放进熊猫里 DataFrame
  3. 使用Matplotlib生成最近温度历史的一个很好的SVG图
  4. 填写一个显示SVG的简单模板,以及最近温度读数的小型HTML表格.

渲染此视图大约需要30秒.很长一段时间.所以我想看看花了这么长时间.我的猜测是,所有与生成图形相关的工作.但要找出答案,我想做一些剖析.

我安装django-debug-toolbardjango-debug-toolbar-line-profiler使用了pip.

我已按照我理解的最佳文档配置它们.特别是,我已经设定:

DEBUG = True
TEMPLATE_DEBUG = DEBUG
DEBUG_TOOLBAR_PATCH_SETTINGS = False

MIDDLEWARE_CLASSES = (
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

DEBUG_TOOLBAR_PANELS = (
    'debug_toolbar.panels.versions.VersionsPanel',
    'debug_toolbar.panels.timer.TimerPanel',
    'debug_toolbar.panels.settings.SettingsPanel',
    'debug_toolbar.panels.headers.HeadersPanel',
    'debug_toolbar.panels.sql.SQLPanel',
    'debug_toolbar.panels.staticfiles.StaticFilesPanel',
    'debug_toolbar.panels.templates.TemplatesPanel',
    'debug_toolbar.panels.cache.CachePanel',
    'debug_toolbar.panels.signals.SignalsPanel',
    'debug_toolbar.panels.logging.LoggingPanel',
    'debug_toolbar.panels.redirects.RedirectsPanel',

    'debug_toolbar_line_profiler.panel.ProfilingPanel',
)
Run Code Online (Sandbox Code Playgroud)

另外,INTERNAL_IPS也设置得当.

我使用基于类的视图构建了我的视图.它看起来像这样:

from django.views.generic import TemplateView
from XXXX.models import TempReading, …
Run Code Online (Sandbox Code Playgroud)

python django profiling django-debug-toolbar raspberry-pi

10
推荐指数
1
解决办法
1384
查看次数

在Numpy/Pandas中生成所有平行对角线总和的直接方法?

我有一个矩形(不能假设是正方形)的Pandas DataFrame数字.假设我选择了一个对角线方向("左上角到右下角"或"右上角到左下角").我想计算一个系列,其条目是沿着所选并行对角线的原始DataFrame的值的总和.要完全指定目标,您需要确定对角线是"锚定"在左侧还是"锚定"在右侧.对于下面的内容,我假设他们在左边"锚定"了.

我可以毫不费力地做到这一点:

import numpy as np
import pandas as pd

rectdf = pd.DataFrame(np.arange(15).reshape(5,3))

# result:
    0   1   2
0   0   1   2
1   3   4   5
2   6   7   8
3   9  10  11
4  12  13  14
Run Code Online (Sandbox Code Playgroud)

我可以如下计算"左上角到右下角"的对角线总和:

ullrsums = pd.concat([rectdf.iloc[:, i].shift(-i) for i in range(rectdf.shape[1])], axis=1)\
    .sum(axis=1, fillna=0)

# result:
0    12
1    21
2    30
3    22
4    12
Run Code Online (Sandbox Code Playgroud)

我可以通过翻转前面的shift(-i)to 来计算"右上角"对角线总和shift(i):

urllsums = pd.concat([rectdf.iloc[:, i].shift(i) for i in range(rectdf.shape[1])], axis=1)\
    .sum(axis=1, fillna=0) …
Run Code Online (Sandbox Code Playgroud)

python numpy pandas

10
推荐指数
1
解决办法
1097
查看次数

在Pandas中对行和列MultiIndex使用布尔索引

问题最后是粗体.但首先,让我们设置一些数据:

import numpy as np
import pandas as pd
from itertools import product

np.random.seed(1)

team_names = ['Yankees', 'Mets', 'Dodgers']
jersey_numbers = [35, 71, 84]
game_numbers = [1, 2]
observer_names = ['Bill', 'John', 'Ralph']
observation_types = ['Speed', 'Strength']

row_indices = list(product(team_names, jersey_numbers, game_numbers, observer_names, observation_types))
observation_values = np.random.randn(len(row_indices))

tns, jns, gns, ons, ots = zip(*row_indices)

data = pd.DataFrame({'team': tns, 'jersey': jns, 'game': gns, 'observer': ons, 'obstype': ots, 'value': observation_values})

data = data.set_index(['team', 'jersey', 'game', 'observer', 'obstype'])
data = data.unstack(['observer', …
Run Code Online (Sandbox Code Playgroud)

python multi-index pandas

9
推荐指数
1
解决办法
3147
查看次数

使用Seaborn FacetGrid绘制时间序列

我有一个DataFrame(data),它有一个简单的整数索引和5列.柱子是Date,Country,AgeGroup,Gender,Stat.(名称变更为保护无辜).我想以产生FacetGrid其中Country定义的行,AgeGroup定义列,并Gender限定了色调.对于每个细节,我想制作一个时间序列图.即我应该得到一组图表,每个图表上有2个时间序列(1个男性,1个女性).我可以非常接近:

g = sns.FacetGrid(data, row='Country', col='AgeGroup', hue='Gender')
g.map(plt.plot, 'Stat')
Run Code Online (Sandbox Code Playgroud)

然而,这只是给出了x轴上的样本编号而不是日期.在这种情况下是否有快速解决方案.

更一般地说,我理解的方法FacetGrid是制作网格,然后map绘制绘图功能.如果我想推出自己的绘图功能,它需要遵循哪些约定?特别是,如何编写自己的绘图函数(传递给mapfor FacetGrid),从我的数据集中接受多列数据?

python matplotlib pandas seaborn

9
推荐指数
1
解决办法
5533
查看次数

是否可以在Matplotlib中设置标记边缘alpha?

例如,假设我想绘制color='None'但是markeredgecolor='mediumseagreen'边缘有alpha=0.5.那可能吗?

python matplotlib

8
推荐指数
1
解决办法
3527
查看次数

Django:具有查询字符串指定的预填充和不可编辑字段的CreateView

假设我们有一个名为Closet的应用程序,它有一些模型:

# closet.models.py
class  Outfit(models.Model):
    shirt   = models.ForeignKey(Shirt)
    pants   = models.ForeignKey(Trouser)

class Shirt(models.Model):
    desc    = models.TextField()

class Trouser(models.Model):
    desc    = models.TextField()

class Footwear(models.Model):
    desc    = models.TextField
Run Code Online (Sandbox Code Playgroud)

使用通用详细信息视图,可以轻松地将URL配置为以下每个的详细信息:

#urls.py
urlpatterns = patterns('',
    url(r'^closet/outfit/(?P<pk>\d+)$',     DetailView(model=Outfit),       name='outfit_detail'),
    url(r'^closet/shirt/(?P<pk>\d+)$',          DetailView(model=Shirt),        name='shirt_detail'),
    url(r'^closet/trouser/(?P<pk>\d+)$',        DetailView(model=Trouser),      name='trouser_detail'),
    url(r'^closet/footwear/(?P<pk>\d+)$',       DetailView(model=Footwear),     name='footwear_detail'),
)   
Run Code Online (Sandbox Code Playgroud)

我接下来要做的是定义将创建每种类型的新对象的视图.我想这样做的扩展版本CreateView将能够处理预先填充的字段上的数据.

具体来说,我想要以下行为:

  1. 如果我访问/closet/outfit/new我希望得到一个标准ModelFormOutfit一切空白,一切编辑模式.
  2. 如果我访问/closet/outfit/new/?shirt=1我想看到我在案例1)中看到的所有字段,但我希望衬衫字段预先填充pk = 1的衬衫.此外,我希望衬衫字段显示为不可编辑.如果表单已提交且被视为无效,则在重新显示表单时,我希望衬衫字段继续不可编辑.
  3. 如果我访问/closet/outfit/new/?shirt=1&trouser=2我想看到我在案例1)中看到的所有领域,但现在衬衫和裤子领域都应该是预先设定的并且是不可编辑的.(即只有footwear字段应该是可编辑的.)

一般来说,这可能吗?即,查询字符串可以这种方式修改显示的表单的结构吗?我希望尽可能以DRYest方式实现这一目标.我的直觉告诉我这应该是基于类的观点可行,也许会涉及model_form_factory但我无法在我的脑海中找到逻辑.特别是,我不确定是否有可能让基于类的视图在构造时访问request.REQUEST(即request.POSTrequest.GET参数)ModelForm.

也许只有当我为锁定的字段使用不同的查询字符串关键字时才可能.也许URL需要是:/closet/outfit/new/?lock_shirt=1/closet/outfit/new?lock_shirt=1&lock_trouser=2 …

django django-forms django-generic-views django-class-based-views

7
推荐指数
1
解决办法
2076
查看次数

Python:用括号格式化负数

有没有办法使用字符串插值或string.format将负数呈现为使用括号而不是"负号"格式化的文本?

-3.14应该是(3.14).

我曾希望使用字符串插值来实现这一点,或者string.format不需要专门为货币或会计设计的导入.

编辑以澄清:请假设要格式化的变量是a int或a float.即,虽然这可以通过正则表达式完成(请参阅下面的好答案),但我认为这将是Python格式化功能的更原生的操作.

所以要明确:

import numpy as np
list_of_inputs = [-10, -10.5, -10 * np.sqrt(2), 10, 10.5, 10 * np.sqrt(2)]
for i in list_of_inputs:
    # your awesome solution goes here
Run Code Online (Sandbox Code Playgroud)

应该返回:

(10)
(10.5)
(14.14)
10
10.5
14.14
Run Code Online (Sandbox Code Playgroud)

显然,最后一个有一些灵活性.我曾希望"在括号中加上负数"将是字符串插值的自然参数,或者string.format在设置负数的显示样式时我可以使用其他格式化语言.

python

7
推荐指数
2
解决办法
6912
查看次数

具有堆叠组件的直方图

假设我有一个我过去90天每天测量的值.我想绘制值的直方图,但我希望观察者能够轻松查看测量在过去90天的某些非重叠子集上累积的位置.我想通过将直方图的每个条"细分"成块来实现这一点.最早观察的一个块,一个用于最近的观察,一个用于最近的观察.

这听起来像是一份工作,df.plot(kind='bar', stacked=True)但我无法正确掌握细节.

这是我到目前为止所拥有的:

import numpy as np
import pandas as pd
import seaborn as sbn

np.random.seed(0)

data = pd.DataFrame({'values': np.random.randn(90)})
data['bin'] = pd.cut(data['values'], 15, labels=False)
forhist = pd.DataFrame({'first70': data[:70].groupby('bin').count()['bin'],
                         'next15': data[70:85].groupby('bin').count()['bin'],
                         'last5': data[85:].groupby('bin').count()['bin']})

forhist.plot(kind='bar', stacked=True)
Run Code Online (Sandbox Code Playgroud)

这给了我:

结果不好

该图有一些缺点:

  • 条形图以错误的顺序堆叠. last5应该在顶部和next15中间.即它们应该按照列的顺序堆叠forhist.
  • 栏之间有水平空间
  • x轴用整数标记,而不是指示箱表示的值的东西.我的"第一选择"是将x轴标记为与我刚刚运行时完全相同的标记data['values'].hist().我的"第二选择"是将x轴标记为"bin名称",如果我这样做的话pd.cut(data['values'], 15).在我的代码中,我使用的labels=False是因为如果我不这样做,它会使用bin边缘标签(作为字符串)作为条形标签,并且它将按字母顺序放置这些,使得图形基本上无用.

什么是最好的方法来解决这个问题?到目前为止,我觉得我正在使用非常笨拙的功能.

python matplotlib pandas seaborn

7
推荐指数
1
解决办法
5395
查看次数