是否有"烹饪书"方式重新采样具有(半)不规则周期的DataFrame?
我每天都有一个数据集,并希望它重新采样到有时(在科学文献中)被命名为dekad的.我不认为有一个适当的英语术语,但它基本上在三个十天的部分砍掉一个月,其中第三个是8到11天之间的剩余部分.
我自己想出了两个解决方案,一个针对这个案例的特定解决方案,以及针对任何不规则时期的更普遍的一个 但两者都不是很好,所以其他人如何处理这类情况.
让我们从创建一些示例数据开始:
import pandas as pd
begin = pd.datetime(2013,1,1)
end = pd.datetime(2013,2,20)
dtrange = pd.date_range(begin, end)
p1 = np.random.rand(len(dtrange)) + 5
p2 = np.random.rand(len(dtrange)) + 10
df = pd.DataFrame({'p1': p1, 'p2': p2}, index=dtrange)
Run Code Online (Sandbox Code Playgroud)
我想出的第一件事是按个别月份(YYYYMM)进行分组,然后手动切片.喜欢:
def to_dec1(data, func):
# create the indexes, start of the ~10day period
idx1 = pd.datetime(data.index[0].year, data.index[0].month, 1)
idx2 = idx1 + datetime.timedelta(days=10)
idx3 = idx2 + datetime.timedelta(days=10)
# slice the period and perform function
oneday = datetime.timedelta(days=1)
fir = func(data.ix[:idx2 - oneday].values, axis=0) …
Run Code Online (Sandbox Code Playgroud) 我刚升级到IPython 1.0,新的笔记本界面表现非常好.在我的屏幕上,它现在的默认宽度约为页面的50%,从而提高了可读性.但是,我经常使用长时间系列,我更喜欢尽可能宽地显示.
非常宽的图片只会向右延伸.有没有办法显示输出更宽,然后默认扩展中心事项?
附图显示了第一个单元格中的正常内联图,它比默认笔记本宽度宽.第二个图更宽,向右扩展.这使我的屏幕左侧四分之一未使用.
也许我忽略了明显但你如何防止同情重新排列方程?
我在iPython笔记本中使用Sympy,因此我可以轻松地将Latex代码复制粘贴到Lyx,但我希望方程式与我定义它们的顺序相同.
例如,灰体辐射的公式是其温度的函数:
Sympy自动将温度组件放在前面,这给出了一个非常不寻常的公式表示.反正有没有阻止这个?
我的数据框结构如下:
First A B
Second bar baz foo bar baz foo
Third cat dog cat dog cat dog cat dog cat dog cat dog
0 3 8 7 7 4 7 5 3 2 2 6 2
1 8 6 5 7 8 7 1 8 6 0 3 9
2 9 2 2 9 7 3 1 8 4 1 0 8
3 3 6 0 6 3 2 2 6 2 4 6 9
4 7 6 4 …
Run Code Online (Sandbox Code Playgroud) 我想重新采样一个包含日期时间列和其他键的多索引的DataFrame.Dataframe看起来像:
import pandas as pd
from StringIO import StringIO
csv = StringIO("""ID,NAME,DATE,VAR1
1,a,03-JAN-2013,69
1,a,04-JAN-2013,77
1,a,05-JAN-2013,75
2,b,03-JAN-2013,69
2,b,04-JAN-2013,75
2,b,05-JAN-2013,72""")
df = pd.read_csv(csv, index_col=['DATE', 'ID'], parse_dates=['DATE'])
df.columns.name = 'Params'
Run Code Online (Sandbox Code Playgroud)
因为重新采样只允许在数据时间索引上,所以我认为取消堆叠其他索引列会有所帮助.事实确实如此,但事后再也无法再叠加了.
print df.unstack('ID').resample('W-THU')
Params VAR1
ID 1 2
DATE
2013-01-03 69 69.0
2013-01-10 76 73.5
Run Code Online (Sandbox Code Playgroud)
但是再次堆叠 'ID'会导致索引错误:
print df.unstack('ID').resample('W-THU').stack('ID')
IndexError: index 0 is out of bounds for axis 0 with size 0
Run Code Online (Sandbox Code Playgroud)
奇怪的是,我可以将两个列级别堆叠起来:
print df.unstack('ID').resample('W-THU').stack(0)
Run Code Online (Sandbox Code Playgroud)
和
print df.unstack('ID').resample('W-THU').stack('Params')
Run Code Online (Sandbox Code Playgroud)
如果我重新排序(交换)两个列级别,也会发生索引错误.有谁知道如何克服这个问题?
GaussianProcessRegressor
是否可以定义使用“几何各向异性”的内核?
我知道可以用一些现有的内核来定义各向异性,但它似乎只允许与维度平行的各向异性。考虑相关维度的情况(例如空间 x/y 坐标),我希望各向异性能够考虑旋转由两个长度尺度定义的“椭圆”的角度(这些将成为主要尺度)和短轴)。
对于我来说,这对于 Scikit-Learn 中的当前内核是否已经可行,或者我是否应该通过子类化现有内核之一来创建自己的内核并不明显。
考虑以下示例:
import numpy as np
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import Matern, ConstantKernel
# training data
ygrid, xgrid = np.mgrid[-2:3:1, -2:3:1]
X_train = np.stack([ygrid.flat, xgrid.flat], axis=1)
y_train = np.eye(*ygrid.shape).ravel()
# define the kernel
c = ConstantKernel(constant_value=y_train.mean(), constant_value_bounds='fixed')
m = Matern(length_scale=[0.5, 0.5], nu=0.5)
kernel = c * m
# fit
gp = GaussianProcessRegressor(kernel=kernel)
gp.fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)
拟合后的核参数为:
print(gp.kernel_.get_params())
{'k1': 0.447**2,
'k2': Matern(length_scale=[0.444, 0.444], nu=0.5),
'k1__constant_value': 0.2,
'k1__constant_value_bounds': 'fixed',
'k2__length_scale': array([0.4443361, 0.4443361]),
'k2__length_scale_bounds': (1e-05, …
Run Code Online (Sandbox Code Playgroud) 我想将包含补丁(来自a GeoJSONDataSource
)的图表与折线图链接,但我无法获取所选补丁的属性.
它基本上是一个显示多边形的图,当选择多边形时,我想用该多边形的数据时间序列更新折线图.折线图由法线驱动ColumnDataSource
.
我可以通过添加一个回调结合得到所选补丁的索引geo_source.selected['1d']['indices']
.但是,我如何获得与该索引相对应的数据/属性?我需要的属性,我可以再使用更新线图一个"关键".
在GeoJSONDataSource
没有data
属性的,我可以查找数据本身.Bokeh可以使用像着色/工具提示等东西的属性,所以我认为必须有一种方法来解决这些问题GeoJSONDataSource
,我很遗憾地发现它.
这是一个工作的玩具示例,展示了迄今为止我所拥有的.
import pandas as pd
import numpy as np
from bokeh import events
from bokeh.models import (Select, Column, Row, ColumnDataSource, HoverTool,
Range1d, LinearAxis, GeoJSONDataSource)
from bokeh.plotting import figure
from bokeh.io import curdoc
import os
import datetime
from collections import OrderedDict
def make_plot(src):
# function to create the line chart
p = figure(width=500, height=200, x_axis_type='datetime', title='Some parameter',
tools=['xwheel_zoom', 'xpan'], logo=None, toolbar_location='below', toolbar_sticky=False)
p.circle('index', 'var1', …
Run Code Online (Sandbox Code Playgroud) 绘制颤动或倒钩的时间序列(日期)的标准方法是什么?我通常在Pandas DataFrame中有时间序列,并按如下方式绘制它们:
plt.plot(df.index.to_pydatetime(), df.parameter)
Run Code Online (Sandbox Code Playgroud)
这很好用,x轴可以视为真实日期,这对于使用Datetime对象等格式化或设置xlim()非常方便。
以相同的方式将其与箭袋或倒钩一起使用会导致:
TypeError: float() argument must be a string or a number
Run Code Online (Sandbox Code Playgroud)
可以通过以下方法解决:
ax.barbs(df.index.values.astype('d'), np.ones(size) * 6.5, df.U.values, df.V.values, length=8, pivot='middle')
ax.set_xticklabels(df.index.to_pydatetime())
Run Code Online (Sandbox Code Playgroud)
哪个可行,但是这意味着我到处都必须将日期转换为浮点数,然后手动覆盖标签。有没有更好的办法?
这是一些类似于我的案例的示例代码:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
size = 10
wspd = np.random.randint(0,40,size=size)
wdir = np.linspace(0,360 * np.pi/180, num=size)
U = -wspd*np.sin(wdir)
V = -wspd*np.cos(wdir)
df = pd.DataFrame(np.vstack([U,V]).T, index=pd.date_range('2012-1-1', periods=size, freq='M'), columns=['U', 'V'])
fig, ax = plt.subplots(1,1, figsize=(15,4))
ax.plot(df.index.values.astype('d'), df.V * 0.1 + 4, color='k')
ax.quiver(df.index.values.astype('d'), np.ones(size) …
Run Code Online (Sandbox Code Playgroud) 有没有办法只用一个ax.text()
命令就可以在第三个轴上显示结果?使用expandtabs
几乎让我在那里,但文本永远不会正确对齐.
使用两个绘图命令对我来说似乎不是一个好习惯,你总是需要猜测两者之间的距离,这可能需要一些迭代.
fig, axs = plt.subplots(1,3, figsize=(12,4),
subplot_kw={'aspect': 1, 'xticks': [], 'yticks':[]})
fig.subplots_adjust(wspace=0.05)
values = {'a': 1.35, 'b': 25.1, 'c': 5}
tmpl = """Param1: {a:1.1f}
Long param2: {b:1.1f}
Prm3: {c:1.1f}"""
mystr = tmpl.format(**values)
axs[0].text(0.1, 0.9, mystr, va='top', transform=axs[0].transAxes)
axs[0].set_title('Default')
tmpl = """Param1:\t\t\t{a:1.1f}
Long param2:\t{b:1.1f}
Prm3:\t\t\t{c:1.1f}""".expandtabs()
mystr = tmpl.format(**values)
axs[1].text(0.1, 0.9, mystr, va='top', transform=axs[1].transAxes)
axs[1].set_title('Almost there')
labels = """Param1:
Long param2:
Prm3:"""
tmpl = """{a:1.1f}
{b:1.1f}
{c:1.1f}"""
mystr = tmpl.format(**values)
axs[2].text(0.1, 0.9, labels, va='top', transform=axs[2].transAxes)
axs[2].text(0.65, 0.9, …
Run Code Online (Sandbox Code Playgroud) 我使用MatlobLib和shapereader的"Custom"形状有问题.导入和查看插入的面部工作正常,但我无法在我的图上放置颜色条.
我已经从教程中尝试了几种方法,但我非常确定这个问题有一个智能解决方案.
也许有人可以帮助我,我现在的代码附在下面:
from formencode.national import pycountry
import itertools
from matplotlib import cm, pyplot
from matplotlib import
from mpl_toolkits.basemap import Basemap
from numpy.dual import norm
import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
import matplotlib as mpl
import matplotlib.colors as colors
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import numpy as np
def draw_map_for_non_normalized_data_with_alpha2_counrty_description(data, title=None):
m = Basemap()
ax = plt.axes(projection=ccrs.PlateCarree())
list = []
sum = 0
for key in data:
sum += data[key]
for key in data.keys():
new_val …
Run Code Online (Sandbox Code Playgroud)