处理可变默认参数的公认范式是:
def func(self, a = None):
if a is None:
a = <some_initialisation>
self.a = a
Run Code Online (Sandbox Code Playgroud)
由于我可能不得不为几个参数做这个,我需要一遍又一遍地编写非常相似的3行.在初始化类对象或函数时,我发现很多文本都是非常标准的事情.
是不是有一个优雅的单行代替那些处理可能未定义的参数和标准需要复制到类实例变量的3行?
试图使用非常有用的熊猫来处理数据作为时间序列,我现在磕磕绊绊的事实是,似乎不存在可以直接插入(使用样条或类似)的数据库,而数据具有DateTime作为x-轴?我似乎总是被迫首先转换为某个浮点数,比如自1980年以来的秒数等等.
到目前为止,我正在尝试以下内容,抱歉奇怪的格式化,我只在ipython笔记本中有这些东西,我无法从那里复制单元格:
from scipy.interpolate import InterpolatedUnivariateSpline as IUS
type(bb2temp): pandas.core.series.TimeSeries
s = IUS(bb2temp.index.to_pydatetime(), bb2temp, k=1)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-67-19c6b8883073> in <module>()
----> 1 s = IUS(bb2temp.index.to_pydatetime(), bb2temp, k=1)
/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/scipy/interpolate/fitpack2.py in __init__(self, x, y, w, bbox, k)
335 #_data == x,y,w,xb,xe,k,s,n,t,c,fp,fpint,nrdata,ier
336 self._data = dfitpack.fpcurf0(x,y,k,w=w,
--> 337 xb=bbox[0],xe=bbox[1],s=0)
338 self._reset_class()
339
TypeError: float() argument must be a string or a number
Run Code Online (Sandbox Code Playgroud)
通过使用bb2temp.index.values(看起来像这样:
array([1970-01-15 184:00:35.884999, 1970-01-15 184:00:58.668999,
1970-01-15 184:01:22.989999, 1970-01-15 184:01:45.774000,
1970-01-15 184:02:10.095000, 1970-01-15 184:02:32.878999,
1970-01-15 …Run Code Online (Sandbox Code Playgroud) 在IPython笔记本中,当您使用?或查看某些文档时help(),会在文档显示的屏幕底部打开一个拆分框架.虽然我发现这对于继续使用一些Python代码很有用,但是当我读完文档时,我想关闭这个spit框架,以便重新获得屏幕空间.但是我无法在任何地方找到指示,不能在谷歌和IPython笔记本文档中如何做到这一点?
有人知道吗?
我定义了以下类方法来从 pandas.DataFrame 而不是像这样的列表定义我的对象:
class Container(object):
@classmethod
def from_df(cls, df):
rows = [i for _, i in df.iterrows()]
return cls(rows)
Run Code Online (Sandbox Code Playgroud)
并pylint在return带有 E1120 '代码气味'的线路上抱怨:
构造函数调用中参数“cls”没有值
我看不出有什么问题,它似乎有效。有没有其他人可能知道它可能有什么问题?
更新:呃,用户rogalski明白了(我认为):我对作为参数传入的类使用相同的变量名让自己感到困惑:
def __init__(self, iterable, cls):
self.content = [cls(item) for item in iterable]
Run Code Online (Sandbox Code Playgroud)
我这样做是因为我有不同类型的对象进来,这个 Container 类是这个女儿的抽象版本:
class FanContainer(Container):
def __init__(self, iterable):
super().__init__(iterable, Fan)
Run Code Online (Sandbox Code Playgroud)
与Fan被需要是几类的一个“包含”。Rogalski,想写一个类似说错误可能引用__init__构造函数名称的答案吗?干杯! (现在我必须挖掘为什么我的代码没有绊倒这个......)
更新 2 只知道我对这个编码有多弱:我基本上是这样使用它的:
fancontainer = FanContainer.from_df(df)
Run Code Online (Sandbox Code Playgroud)
并且因为我__init__在FanContainer课堂上覆盖了,我想这就是为什么我的代码仍然有效?因此,__init__永远不会直接调用抽象,因为我从不调用,Container.from_df(df)而只调用子类的类方法。猜猜这可以用不同的方式做得更漂亮。
我试图ptrepack一个用pandas HDFStore pytables接口创建的HDF文件.数据帧的主要索引是时间,但我做了一些列,data_columns以便我可以通过这些data_columns过滤磁盘上的数据.
现在我想通过其中一个列对HDF文件进行排序(因为选择对我来说太慢了,84 GB文件),使用带有如下sortby选项的ptrepack :
()[maye@luna4 .../nominal]$ ptrepack --chunkshape=auto --propindexes --complevel=9 --complib=blosc --sortby=clat C9.h5 C9_sorted.h5
Run Code Online (Sandbox Code Playgroud)
我收到错误信息:
()[maye @ luna4 .../nominal] $从'C9.h5:/'复制到'C9_sorted.h5:'的问题错误是 - >:字段
clat必须关联一个'完整'索引桌子/df/table (Table(390557601,)) ''.目标文件如下所示:C9_sorted.h5(File)''Last modif.:'Fri Jul 26 18:17:56 2013'Object Tree:/(RootGroup)''/ df(Group)''/ df/table(表(0,),shuffle,blosc(9))''回溯(最近一次调用最后一次):在sys.exit(main())文件"/usr/local/epd/lib/python2.7/site -packages/tables/scripts/ptrepack.py",第480行,主要升级flavors = upgradeflavors)文件"/usr/local/epd/lib/python2.7/site-packages/tables/scripts/ptrepack.py",行225,在copyChildren引发RuntimeError("请检查节点名称是不是"RuntimeError:请检查节点名称是否在目标中没有重复,如果是,请添加--overwrite-nodes标志,如果需要.特别是支付注意rootUEP并不是在欺骗你.
这是否意味着,我无法通过索引列对HDF文件进行排序,因为它们不是"完整"索引?
我有一个dataframe对象,其中包含EUR_USD货币对的1秒间隔.但理论上它可以是任何间隔,在这种情况下它可能看起来像这样:
2015-11-10 01:00:00+01:00 1.07616
2015-11-10 01:01:00+01:00 1.07605
2015-11-10 01:02:00+01:00 1.07590
2015-11-10 01:03:00+01:00 1.07592
2015-11-10 01:04:00+01:00 1.07583
Run Code Online (Sandbox Code Playgroud)
我想使用线性回归从数据框中的数据中绘制趋势线,但我不确定使用时间序列,甚至是如此小的时间序列间隔,最好的方法是什么.
到目前为止,我已经把时间替换为(这只是为了显示我想要去的地方)一个从0到时间序列列表长度的列表.
x = list(range(0, len(df.index.tolist()), 1))
y = df["closeAsk"].tolist()
Run Code Online (Sandbox Code Playgroud)
使用numpy做数学魔术
fit = np.polyfit(x,y,1)
fit_fn = np.poly1d(fit)
Run Code Online (Sandbox Code Playgroud)
最后,我将函数与df ["closeAsk"]一起绘制,以了解趋势.
plt.plot(x,df["closeAsk"], '-')
plt.plot(x,y, 'yo', x, fit_fn(x), '--k')
plt.show()
Run Code Online (Sandbox Code Playgroud)
然而现在x轴只是无意义的数字,而是我希望它们能够显示时间序列.
我正在将一些函数从Excel电子表格翻译成python.根据numpy docs:arctan2,我需要使用aranan2的atan2 .问题是两个结果甚至没有关闭:
oc = 23.4384863405
sal = 89.7814630647
sra = np.arctan2(np.cos(np.deg2rad(sal)),
np.cos(np.deg2rad(oc))*np.sin(np.deg2rad(sal)))
results: Excel = 1.566714757 Numpy = 0.00415720646 ??
Run Code Online (Sandbox Code Playgroud)
我相信Excel结果是正确的.这是错误的numpy.
现在要么我没有正确使用arctan2,要么atan2在numpy中不是arctan2,或者numpy中有一个bug,或者我刚刚完全迷失在这里.
我正在使用python版本2.7.2和numpy 1.6.2
请问有什么想法吗?谢谢
我可以在不使用自己的lambda函数的情况下收到groupby操作产生的覆盖时间跨度吗?
目前我有以下解决方案,但我想知道大熊猫API是否已经以某种方式内置这个内置?描述我在数据准备部分正在做什么:我的任务是找出何时,特别是布尔标志为True的时间.我发现ndimage.labeling是处理非连续数据块的有效方法.但我对任何其他很酷的建议持开放态度!
import pandas as pd
from scipy.ndimage import label
# data preparation
idx = pd.date_range(start='now', periods = 100, freq='min')
df= pd.DataFrame(randn(100), index=idx, columns=['data'])
df['mybool'] = df.data > 0
df['label'] = label(df.mybool)[0]
# my actual question:
df.groupby('label').apply(lambda x:x.index[-1] - x.index[0])
Run Code Online (Sandbox Code Playgroud)
基本上,我从每个组中减去第一个时间戳.这导致:
label
0 01:37:00
1 00:00:00
2 00:01:00
3 00:01:00
4 00:01:00
5 00:02:00
6 00:00:00
7 00:10:00
8 00:00:00
9 00:01:00
10 00:02:00
11 00:00:00
12 00:01:00
13 00:04:00
14 00:02:00
15 00:01:00
16 00:00:00
17 00:00:00
18 00:00:00 …Run Code Online (Sandbox Code Playgroud)