小编8on*_*ne6的帖子

在IPython Notebook中自动运行%matplotlib内联

每次启动IPython Notebook时,我运行的第一个命令是

%matplotlib inline
Run Code Online (Sandbox Code Playgroud)

有没有办法改变我的配置文件,以便在我启动IPython时,它会自动进入这种模式?

python matplotlib ipython-notebook

86
推荐指数
3
解决办法
10万
查看次数

在Matplotlib中重置颜色循环

假设我有3种交易策略的数据,每种策略都有交易成本.我想在相同的轴上绘制6个变体中每个变量的时间序列(3个策略*2个交易成本).我想"与交易成本"线与绘制alpha=1,并linewidth=1同时我想"无交易成本"与绘制alpha=0.25linewidth=5.但我希望每个策略的两个版本的颜色都相同.

我想要的是:

fig, ax = plt.subplots(1, 1, figsize=(10, 10))

for c in with_transaction_frame.columns:
    ax.plot(with_transaction_frame[c], label=c, alpha=1, linewidth=1)

****SOME MAGIC GOES HERE TO RESET THE COLOR CYCLE

for c in no_transaction_frame.columns:
    ax.plot(no_transaction_frame[c], label=c, alpha=0.25, linewidth=5)

ax.legend()
Run Code Online (Sandbox Code Playgroud)

什么是适当的代码放在指示的行上来重置颜色循环,以便在调用第二个循环时"回到开始"?

python matplotlib pandas

50
推荐指数
3
解决办法
2万
查看次数

尽管付出了最大的努力,Matplotlib显示x-tick标签重叠

看看下面的图表: 在此输入图像描述

这是这个更大的数字的子情节: 在此输入图像描述

我看到它有两个问题.首先,x轴标签相互重叠(这是我的主要问题).第二.x轴次网格线的位置似乎有点不稳定.在图表的左侧,它们看起来间隔适当.但在右边,它们似乎挤满了主要的网格线......好像主要的网格线位置不是小刻度线位置的正确倍数.

我的设置是我有一个DataFrame df,它有一个DatetimeIndex行和一个value包含浮点数的列.df如有必要,我可以在要点中提供内容的示例.df这篇文章的底部有十几行作为参考.

这是生成图形的代码:

now = dt.datetime.now()

fig, axes = plt.subplots(2, 2, figsize=(15, 8), dpi=200)
for i, d in enumerate([360, 30, 7, 1]):
    ax = axes.flatten()[i]
    earlycut = now - relativedelta(days=d)
    data = df.loc[df.index>=earlycut, :]
    ax.plot(data.index, data['value'])
    ax.xaxis_date()

    ax.get_xaxis().set_minor_locator(mpl.ticker.AutoMinorLocator())
    ax.get_yaxis().set_minor_locator(mpl.ticker.AutoMinorLocator())

    ax.grid(b=True, which='major', color='w', linewidth=1.5)
    ax.grid(b=True, which='minor', color='w', linewidth=0.75)
Run Code Online (Sandbox Code Playgroud)

这里我最好的选择是让x轴标签相互重叠(在四个子图中的每一个中)?另外,单独(但不太紧急),左上方子图中的次要刻度问题是什么?

我在Pandas 0.13.1,numpy 1.8.0和matplotlib 1.4.x.

这里有一小段df供参考:

                                    id scale  tempseries_id    value
timestamp                                                           
2014-11-02 14:45:10.302204+00:00  7564     F              1  68.0000
2014-11-02 14:25:13.532391+00:00 …
Run Code Online (Sandbox Code Playgroud)

python matplotlib pandas

34
推荐指数
2
解决办法
4万
查看次数

使用groupby后计算Pandas中的差异会导致意外结果

我有一个数据框,我试图在其中添加一列顺序差异.我找到了一个我喜欢的方法(并且很好地概括了我的用例).但是我注意到了一个奇怪的事情.你能帮我理解吗?

以下是一些具有正确结构的数据(代码在此处建模的代码):

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

random.seed(1)       # so you can play along at home
np.random.seed(2)    # ditto

# make a list of dates for a few periods
dates = pd.date_range(start='2013-10-01', periods=4).to_native_types()
# make a list of tickers
tickers = ['ticker_%d' % i for i in range(3)]
# make a list of all the possible (date, ticker) tuples
pairs = list(product(dates, tickers))
# put them in a random …
Run Code Online (Sandbox Code Playgroud)

python diff pandas

33
推荐指数
2
解决办法
2万
查看次数

计算数据帧组内的差异

假设我有一个包含3列的数据框:Date,Ticker,Value(没有索引,至少可以开始).我有很多日期和许多代码,但每个(ticker, date)元组都是独一无二的.(但显然相同的日期会出现在很多行中,因为它会存在多个代码,并且同一个代码将显示在多行中,因为它将存在很多日期.)

最初,我的行按特定顺序排列,但未按任何列排序.

我想计算每个股票代码的第一个差异(每日更改)(按日期排序),并将它们放在我的数据框中的新列中.鉴于这种背景,我不能简单地这样做

df['diffs'] = df['value'].diff()
Run Code Online (Sandbox Code Playgroud)

因为相邻的行不是来自同一个自动收报机.排序如下:

df = df.sort(['ticker', 'date'])
df['diffs'] = df['value'].diff()
Run Code Online (Sandbox Code Playgroud)

没有解决问题,因为会有"边界".即在那之后,一个股票代码的最后一个值将高于下一个股票代码的第一个值.然后计算差异会使两个代码之间产生差异.我不想要这个.我希望每个自动收报机的最早日期NaN在其差异列中结束.

这似乎是一个明显的使用时间,groupby但无论出于何种原因,我似乎无法让它正常工作.为了清楚起见,我想执行以下过程:

  1. 根据它们对行进行分组 ticker
  2. 在每个组中,按行分类 date
  3. 在每个已排序的组中,计算value列的差异
  4. 将这些差异放入新diffs列中的原始数据框中(理想情况下,保留原始数据框顺序).

我不得不想象这是一个单行.但是我错过了什么?


编辑于2013-12-17的晚上9点

好的...一些进展.我可以执行以下操作来获取新的数据帧:

result = df.set_index(['ticker', 'date'])\
    .groupby(level='ticker')\
    .transform(lambda x: x.sort_index().diff())\
    .reset_index()
Run Code Online (Sandbox Code Playgroud)

但是,如果我理解groupby的机制,我的行现在将首先排序ticker,然后排序date.那是对的吗?如果是这样,我是否需要进行合并以附加差异列(当前位于result['current']原始数据框中df

python pandas

31
推荐指数
4
解决办法
3万
查看次数

熊猫:同时分配多个*new*列

我有一个DataFrame,其中一列包含每行的标签(除了每行的一些相关数据).我有一个字典,其键等于可能的标签和值,等于与该标签相关的2元组信息.我想在我的框架上添加两个新列,一个对应于每行标签的2元组的每个部分.

这是设置:

import pandas as pd
import numpy as np

np.random.seed(1)
n = 10

labels = list('abcdef')
colors = ['red', 'green', 'blue']
sizes = ['small', 'medium', 'large']

labeldict = {c: (np.random.choice(colors), np.random.choice(sizes)) for c in labels}

df = pd.DataFrame({'label': np.random.choice(labels, n), 
                   'somedata': np.random.randn(n)})
Run Code Online (Sandbox Code Playgroud)

我可以通过运行得到我想要的东西:

df['color'], df['size'] = zip(*df['label'].map(labeldict))
print df

  label  somedata  color    size
0     b  0.196643    red  medium
1     c -1.545214  green   small
2     a -0.088104  green   small
3     c  0.852239  green   small
4     b  0.677234    red  medium
5 …
Run Code Online (Sandbox Code Playgroud)

python pandas

28
推荐指数
3
解决办法
2万
查看次数

计算*滚动*熊猫系列的最大缩编

编写一个计算时间序列最大值的函数非常容易.需要一点思考才能及时写出来O(n)而不是O(n^2)时间.但它并没有那么糟糕.这将有效:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def max_dd(ser):
    max2here = pd.expanding_max(ser)
    dd2here = ser - max2here
    return dd2here.min()
Run Code Online (Sandbox Code Playgroud)

让我们设置一个简短的系列来试试吧:

np.random.seed(0)
n = 100
s = pd.Series(np.random.randn(n).cumsum())
s.plot()
plt.show()
Run Code Online (Sandbox Code Playgroud)

时间序列

正如预期的那样,max_dd(s)在-17.6附近显示出一些东西.好,很棒,很棒.现在说我有兴趣计算这个系列的滚动缩幅.即每个步骤,我想计算指定长度的前一个子系列的最大值.这很容易使用pd.rolling_apply.它的工作原理如下:

rolling_dd = pd.rolling_apply(s, 10, max_dd, min_periods=0)
df = pd.concat([s, rolling_dd], axis=1)
df.columns = ['s', 'rol_dd_10']
df.plot()
Run Code Online (Sandbox Code Playgroud)

滚动缩减

这非常有效.但感觉很慢.在pandas或其他工具包中是否有一个特别灵活的算法来快速完成这项工作?我开始写一些定制的东西:它跟踪各种中间数据(观察到的最大值的位置,先前发现的下降的位置),以减少许多冗余计算.它确实节省了一些时间,但不是很多,而且几乎没有尽可能多的时间.

我认为这是因为Python/Numpy/Pandas中的所有循环开销.但是我目前在Cython中还不够流利,真正知道如何从这个角度开始攻击它.我希望以前有人试过这个.或者,也许有人可能想看看我的"手工"代码,并愿意帮助我将其转换为Cython.


编辑:对于想要审查这里提到的所有功能(以及其他一些!)的人,请查看iPython笔记本:http://nbviewer.ipython.org/gist/8one6/8506455

它显示了这个问题的一些方法如何相关,检查它们是否给出相同的结果,并显示它们对各种大小的数据的运行时间.

如果有人有兴趣,我在帖子中提到的"定制"算法是rolling_dd_custom.我认为如果在Cython中实现,这可能是一个非常快速的解决方案.

python algorithm numpy pandas

22
推荐指数
1
解决办法
2万
查看次数

Numpy/Scipy中的快速线性插值"沿路径"

假设我有一个山上3个(已知)高度的气象站的数据.具体而言,每个站每分钟记录一次温度测量.我有两种插值我想要执行.而且我希望能够快速完成每一项工作.

所以让我们设置一些数据:

import numpy as np
from scipy.interpolate import interp1d
import pandas as pd
import seaborn as sns

np.random.seed(0)
N, sigma = 1000., 5

basetemps = 70 + (np.random.randn(N) * sigma)
midtemps = 50 + (np.random.randn(N) * sigma)
toptemps = 40 + (np.random.randn(N) * sigma)
alltemps = np.array([basetemps, midtemps, toptemps]).T # note transpose!
trend = np.sin(4 / N * np.arange(N)) * 30
trend = trend[:, np.newaxis]

altitudes = np.array([500, 1500, 4000]).astype(float)

finaltemps = pd.DataFrame(alltemps + trend, columns=altitudes)
finaltemps.index.names, finaltemps.columns.names = …
Run Code Online (Sandbox Code Playgroud)

python interpolation numpy scipy

20
推荐指数
2
解决办法
3550
查看次数

使用seaborn将小网格线添加到matplotlib图中

我是使用Matplotlib制作外观漂亮的Seaborn包的粉丝.但我似乎无法弄清楚如何在我的情节中显示小网格线.

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sbn

x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)

fig, ax = plt.subplots(1, 1)
ax.scatter(x, y)

ax.grid(b=True, which='major')
ax.grid(b=True, which='minor')
Run Code Online (Sandbox Code Playgroud)

得到:

在此输入图像描述

这有什么想法?还有任何关于如何调整Seaborn网格线的风格的想法......特别是,我喜欢让它们更窄.

python matplotlib seaborn

19
推荐指数
2
解决办法
2万
查看次数

在matplotlib中使颜色变暗或变亮

假设我在Matplotlib中有颜色.也许它是一个字符串('k')或一个rgb元组((0.5, 0.1, 0.8))甚至一些十六进制(#05FA2B).在Matplotlib中是否有一个命令/便利功能,可以让我变暗(或变亮)那种颜色.

即在那里matplotlib.pyplot.darken(c, 0.1)或类似的东西?我想我所希望的是,在幕后,将采用一种颜色,将其转换为HSL,然后将L值乘以某个给定因子(地板为0,加上1)或明确设置L值到给定值并返回修改后的颜色.

python colors matplotlib

19
推荐指数
3
解决办法
7416
查看次数