说我有一个模型:
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_list并last_list就都有〜100元.
目前,我需要在Django应用程序中解决此问题.但我也很好奇在更一般的SQL上下文中处理这个问题的最佳方法.
谢谢!(如果我能说清楚的话,请告诉我.)
我有一个数据框,在列上有一个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) 我有一个Raspberry Pi坐在一个偏远的位置.它连接到一个小型自制电路和温度探头.我已经设置了Raspberry Pi来做一些事情:
cron每小时运行一次作业以获取温度读数并将其本地存储到sqlite数据库在那个Django应用程序中,我有一个简单的视图,执行以下操作:
DataFrame渲染此视图大约需要30秒.很长一段时间.所以我想看看花了这么长时间.我的猜测是,所有与生成图形相关的工作.但要找出答案,我想做一些剖析.
我安装django-debug-toolbar并django-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) 我有一个矩形(不能假设是正方形)的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) 问题最后是粗体.但首先,让我们设置一些数据:
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) 我有一个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),从我的数据集中接受多列数据?
例如,假设我想绘制color='None'但是markeredgecolor='mediumseagreen'边缘有alpha=0.5.那可能吗?
假设我们有一个名为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将能够处理预先填充的字段上的数据.
具体来说,我想要以下行为:
/closet/outfit/new我希望得到一个标准ModelForm的Outfit一切空白,一切编辑模式./closet/outfit/new/?shirt=1我想看到我在案例1)中看到的所有字段,但我希望衬衫字段预先填充pk = 1的衬衫.此外,我希望衬衫字段显示为不可编辑.如果表单已提交且被视为无效,则在重新显示表单时,我希望衬衫字段继续不可编辑./closet/outfit/new/?shirt=1&trouser=2我想看到我在案例1)中看到的所有领域,但现在衬衫和裤子领域都应该是预先设定的并且是不可编辑的.(即只有footwear字段应该是可编辑的.)一般来说,这可能吗?即,查询字符串可以这种方式修改显示的表单的结构吗?我希望尽可能以DRYest方式实现这一目标.我的直觉告诉我这应该是基于类的观点可行,也许会涉及model_form_factory但我无法在我的脑海中找到逻辑.特别是,我不确定是否有可能让基于类的视图在构造时访问request.REQUEST(即request.POST或request.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
有没有办法使用字符串插值或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在设置负数的显示样式时我可以使用其他格式化语言.
假设我有一个我过去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.data['values'].hist().我的"第二选择"是将x轴标记为"bin名称",如果我这样做的话pd.cut(data['values'], 15).在我的代码中,我使用的labels=False是因为如果我不这样做,它会使用bin边缘标签(作为字符串)作为条形标签,并且它将按字母顺序放置这些,使得图形基本上无用.什么是最好的方法来解决这个问题?到目前为止,我觉得我正在使用非常笨拙的功能.
python ×9
pandas ×5
django ×3
matplotlib ×3
seaborn ×2
django-forms ×1
multi-index ×1
numpy ×1
profiling ×1
raspberry-pi ×1
sql ×1