我无法弄清楚Pandas .aggregate和.apply功能之间的区别.
以下面的例子为例:我加载一个数据集,做一个groupby,定义一个简单的函数,以及用户.agg或.apply.
正如您所看到的,使用.agg和后,我的函数中的打印语句会产生相同的输出.apply.结果,另一方面是不同的.这是为什么?
import pandas
import pandas as pd
iris = pd.read_csv('iris.csv')
by_species = iris.groupby('Species')
def f(x):
...: print type(x)
...: print x.head(3)
...: return 1
Run Code Online (Sandbox Code Playgroud)
使用apply:
by_species.apply(f)
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#0 5.1 3.5 1.4 0.2 setosa
#1 4.9 3.0 1.4 0.2 setosa
#2 4.7 3.2 1.3 0.2 setosa
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#0 5.1 …Run Code Online (Sandbox Code Playgroud) 我想在IPython Notebook中添加比Markdown synthax提供的格式更多的格式元素.
例如,我想添加一个"警告框"或"备注框",它们基本上是具有不同样式的段落(例如,不同的背景颜色,边框,图标等......).
我想我可以在单元格中添加HTML代码,例如<div>带有内联样式的代码.但是,做到这一点的"正确"方法是什么,我的意思是ipython开发者推广的方式?
举例赞赏.
注意:我正在使用git master的当前1.0dev版本.
在python/numpy中编写蒙特卡罗粒子模拟器(布朗运动和光子发射).我需要将模拟输出(>> 10GB)保存到文件中,然后在第二步中处理数据.与Windows和Linux的兼容性非常重要.
粒子数(n_particles)为10-100.时间步数(time_size)的数量是~10 ^ 9.
模拟有3个步骤(下面的代码是针对全内存版本):
模拟(并存储)一个emission速率数组(包含许多几乎为0的元素):
n_particlesx time_size),float32,大小80GB计算counts数组,(来自泊松过程的随机值,具有先前计算的速率):
shape(n_particlesx time_size),uint8,大小20GB
counts = np.random.poisson(lam=emission).astype(np.uint8)
Run Code Online (Sandbox Code Playgroud)查找计数的时间戳(或索引).计数几乎总是0,因此时间戳数组将适合RAM.
# Loop across the particles
timestamps = [np.nonzero(c) for c in counts]
Run Code Online (Sandbox Code Playgroud)我做了一次步骤1,然后重复步骤2-3很多次(~100次).将来我可能需要在计算之前预处理emission(应用cumsum或其他功能)counts.
我有一个内存实现工作,我试图了解实现可以扩展到(更多)更长时间模拟的核外版本的最佳方法.
我需要将数组保存到文件中,我想使用单个文件进行模拟.我还需要一种"简单"的方式来存储和调用模拟参数字典(标量).
理想情况下,我想要一个文件支持的numpy数组,我可以预先分配和填充块.然后,我希望numpy数组方法(max,, cumsum...)透明地工作,只需要一个chunksize关键字来指定每次迭代加载多少数组.
更好的是,我想要一个Numexpr,它不是在缓存和RAM之间运行,而是在RAM和硬盘之间运行.
作为第一个选项,我开始尝试pyTables,但我对它的复杂性和抽象(与numpy不同)不满意.此外,我目前的解决方案(如下所示)是UGLY,效率不高.
所以我寻求答案的选择是
实现一个具有所需功能的numpy数组(如何?)
以更智能的方式使用pytable(不同的数据结构/方法)
使用另一个库:h5py,blaze,pandas ......(到目前为止我还没有尝试过任何一个).
我将模拟参数保存在'/parameters'组中:每个参数都转换为numpy数组标量.详细的解决方案,但它的工作原理.
我保存emission为Extensible …
对于1-D numpy数组,这两个表达式应该产生相同的结果(理论上):
(a*b).sum()/a.sum()
dot(a, b)/a.sum()
Run Code Online (Sandbox Code Playgroud)
后者使用dot()并且更快.但哪一个更准确?为什么?
一些背景如下.
我想用numpy计算样本的加权方差.我dot()在另一个答案中找到了这个表达式,并附有评论说它应该更准确.但是没有给出解释.
当您在笔记本上对不同的数据文件执行相同的分析时,可以方便地以图形方式选择数据文件.
在我的python脚本中,我通常会实现一个QT对话框,它返回所选文件的文件名:
from PySide import QtCore, QtGui
def gui_fname(dir=None):
"""Select a file via a dialog and return the file name.
"""
if dir is None: dir ='./'
fname = QtGui.QFileDialog.getOpenFileName(None, "Select data file...",
dir, filter="All files (*);; SM Files (*.sm)")
return fname[0]
Run Code Online (Sandbox Code Playgroud)
但是,从笔记本运行此功能
full_fname = gui_fname()
Run Code Online (Sandbox Code Playgroud)
导致内核死亡(并重启):
有趣的是,将3个命令放在3个单独的单元格中
%matplotlib qt
full_fname = gui_fname()
%matplotlib inline
Run Code Online (Sandbox Code Playgroud)
但是当我将这些命令放在一个单元中时,内核会再次死掉.
这可以防止创建类似于gui_fname_ipynb()透明地允许使用GUI选择文件的功能.
为方便起见,我创建了一个说明问题的笔记本:
有关如何在IPython Notebook中执行文件选择对话框的任何建议吗?
我想使用ipython笔记本小部件为内联matplotlib图添加一定程度的交互性.
一般情况下,情节可能很重,我只想更新情节的特定元素.我知道小部件内置一个限制功能,有助于不会泛滥内核,但是当情节需要说30秒时,我不想等待这么长时间来更新一行.
通过阅读示例笔记本,我能够创建一个基本示例,其中我将一个十字光标(由2个滑块驱动)添加到mpl轴.
问题是图形显示两次.这是代码(单元格1):
fig, ax = plt.subplots()
ax.plot([3,1,2,4,0,5,3,2,0,2,4])
Run Code Online (Sandbox Code Playgroud)
...数字显示...,单元格2(编辑:感谢Thomas K的改进):
vline = ax.axvline(1)
hline = ax.axhline(0.5)
def set_cursor(x, y):
vline.set_xdata((x, x))
hline.set_ydata((y, y))
display(fig)
Run Code Online (Sandbox Code Playgroud)
最后(单元格3):
interact(set_cursor, x=(1, 9, 0.01), y=(0, 5, 0.01))
Run Code Online (Sandbox Code Playgroud)
再次显示小部件的图形.
所以问题是:
编辑
我发现了一个ipython配置旋钮,根据这款笔记本,可以禁止数字显示
%config InlineBackend.close_figures = False
Run Code Online (Sandbox Code Playgroud)
虽然示例笔记本工作,但我无法弄清楚如何单独使用此选项(没有链接示例中提供的上下文管理器类)来隐藏图形显示.
编辑2
我发现了一些文件的的InlineBackend.close_figures配置.
编辑3
由@shadanan回答引发,我想澄清一下我的目的是将光标添加到现有图形,而不是在每个光标移动时从头开始重绘图.合并单个单元格中的3个单元格:
fig, ax = plt.subplots()
ax.plot([3,1,2,4,0,5,3,2,0,2,4])
vline = ax.axvline(1)
hline = ax.axhline(0.5)
def set_cursor(x, y):
vline.set_xdata((x, x))
hline.set_ydata((y, y))
display(fig)
interact(set_cursor, x=(1, 9, 0.01), y=(0, …Run Code Online (Sandbox Code Playgroud) 在 Numpy/Scipy 中,如何从具有指定 (float) 的正态分布生成随机数dtype?就我而言,我需要float32和float16。
由于数组很大,我不想在采样后转换数组。
例如:
a = np.random.normal(1e7).astype('float16')
Run Code Online (Sandbox Code Playgroud)
完成这项工作,但由于它需要一个临时 float64 数组,因此它使用的 RAM 是直接float16采样的 4 倍。
ipython笔记本是浏览器读取的文档,包含富文本和python代码.
在科学计算中,ipython笔记本经常用于执行分析驻留在本地文件系统上的一些输入数据文件.
不是手动将包含数据的文件的完整路径粘贴到变量中,而是能够启动打开文件对话框以便浏览本地文件系统并选择文件.应该在变量中返回文件的完整路径(在python中).
这可以通过GUI工具包(即QT)启动打开文件对话框来实现.有关示例,请参阅IPython Notebook:使用GUI打开/选择文件(Qt Dialog).
但是,使用QT有一些缺点.首先,它是一个额外的依赖.其次,它需要在笔记本中启用QT gui集成,这会导致与内联图冲突(参见此处).
这里的问题是,是否可以仅使用Javascript获取完整路径?
编辑:下面发布的答案只返回文件名,而不是完整路径.
我想从命令行运行IPython.但是,我在第一行遇到语法错误,使用magic函数导入pylab会%pylab在%上给出语法错误.我正在使用的命令很简单ipython -i script.py.
任何想法如何解决这个问题?
我的问题是以最有效的方式提取N泊松随机值(RV),每个值具有不同的平均值/速率Lam.基本上是size(RV) == size(Lam).
这是一个天真(非常慢)的实现:
import numpy as NP
def multi_rate_poisson(Lam):
rv = NP.zeros(NP.size(Lam))
for i,lam in enumerate(Lam):
rv[i] = NP.random.poisson(lam=lam, size=1)
return rv
Run Code Online (Sandbox Code Playgroud)
在我的笔记本电脑上,1e6样品给出:
Lam = NP.random.rand(1e6) + 1
timeit multi_poisson(Lam)
1 loops, best of 3: 4.82 s per loop
Run Code Online (Sandbox Code Playgroud)
有可能从中改进吗?
python ×6
numpy ×4
ipython ×3
scipy ×3
pandas ×2
random ×2
blaze ×1
file-browser ×1
h5py ×1
html5 ×1
javascript ×1
matplotlib ×1
poisson ×1
precision ×1
pytables ×1