版本0.16.1(2015年5月11日)#
这是从0.16.0开始的一个较小的错误修复版本,包括大量错误修复以及几个新功能、增强功能和性能改进。我们建议所有用户升级到此版本。
亮点包括:
支持
CategoricalIndex
,基于类别的索引,请参见 here关于如何做出贡献的新部分 Pandas ,请参见 here
修订了“合并、连接和连接”文档,包括图形示例以便于理解每个操作,请参见 here
新方法
sample
用于从系列、数据帧和面板中随机抽取样本。看见 here默认设置
Index
打印已更改为更统一的格式,请参见 hereBusinessHour
datetime-offset is now supported, see here进一步增强了
.str
访问器以使字符串操作更容易,请参见 here
警告
在Pandas0.17.0中,子包 pandas.io.data
将被移除以支持可单独安装的程序包 (GH8961 )。
增强#
CategoricalIndex#
我们介绍了一种 CategoricalIndex
,这是一种新类型的索引对象,可用于支持具有重复项的索引。这是一个容器,围绕着一个 Categorical
(在v0.15.0中引入),并允许对具有大量重复元素的索引进行高效的索引和存储。在0.16.1之前,设置一个 DataFrame/Series
使用一个 category
Dtype会将其转换为常规的基于对象的 Index
。
In [1]: df = pd.DataFrame({'A': np.arange(6),
...: 'B': pd.Series(list('aabbca'))
...: .astype('category', categories=list('cab'))
...: })
...:
In [2]: df
Out[2]:
A B
0 0 a
1 1 a
2 2 b
3 3 b
4 4 c
5 5 a
In [3]: df.dtypes
Out[3]:
A int64
B category
dtype: object
In [4]: df.B.cat.categories
Out[4]: Index(['c', 'a', 'b'], dtype='object')
设置索引,将创建一个 CategoricalIndex
In [5]: df2 = df.set_index('B')
In [6]: df2.index
Out[6]: CategoricalIndex(['a', 'a', 'b', 'b', 'c', 'a'], categories=['c', 'a', 'b'], ordered=False, name='B', dtype='category')
索引使用 __getitem__/.iloc/.loc/.ix
其工作原理类似于具有重复项的索引。索引器必须在该类别中,否则操作将引发。
In [7]: df2.loc['a']
Out[7]:
A
B
a 0
a 1
a 5
并保留了 CategoricalIndex
In [8]: df2.loc['a'].index
Out[8]: CategoricalIndex(['a', 'a', 'a'], categories=['c', 'a', 'b'], ordered=False, name='B', dtype='category')
排序将按类别的顺序排序
In [9]: df2.sort_index()
Out[9]:
A
B
c 4
a 0
a 1
a 5
b 2
b 3
对索引的GROUP BY操作也将保留索引性质
In [10]: df2.groupby(level=0).sum()
Out[10]:
A
B
c 4
a 6
b 5
In [11]: df2.groupby(level=0).sum().index
Out[11]: CategoricalIndex(['c', 'a', 'b'], categories=['c', 'a', 'b'], ordered=False, name='B', dtype='category')
重新编制索引操作将根据传递的索引器的类型返回结果索引,这意味着传递列表将返回一个普通的--索引
;使用 Categorical
将返回一个 CategoricalIndex
,根据传递的 Categorical
数据类型。这使得人们可以任意地对这些索引进行索引,即使这些值不在类别中,就像您可以对任何Pandas索引进行重新索引一样。
In [12]: df2.reindex(['a', 'e'])
Out[12]:
A
B
a 0.0
a 1.0
a 5.0
e NaN
In [13]: df2.reindex(['a', 'e']).index
Out[13]: pd.Index(['a', 'a', 'a', 'e'], dtype='object', name='B')
In [14]: df2.reindex(pd.Categorical(['a', 'e'], categories=list('abcde')))
Out[14]:
A
B
a 0.0
a 1.0
a 5.0
e NaN
In [15]: df2.reindex(pd.Categorical(['a', 'e'], categories=list('abcde'))).index
Out[15]: pd.CategoricalIndex(['a', 'a', 'a', 'e'],
categories=['a', 'b', 'c', 'd', 'e'],
ordered=False, name='B',
dtype='category')
请参阅 documentation 想要更多。 (GH7629 , GH10038 , GH10039 )
样本#
Series、DataFrames和Panels现在有了一个新方法: sample()
。该方法接受要返回的特定行数或列数,或者接受总的行数或列数的一小部分。它还具有使用或不使用替换进行采样、为非均匀采样传递权重列以及设置种子值以便于复制的选项。 (GH2419 )
In [1]: example_series = pd.Series([0, 1, 2, 3, 4, 5])
# When no arguments are passed, returns 1
In [2]: example_series.sample()
Out[2]:
3 3
Length: 1, dtype: int64
# One may specify either a number of rows:
In [3]: example_series.sample(n=3)
Out[3]:
2 2
1 1
0 0
Length: 3, dtype: int64
# Or a fraction of the rows:
In [4]: example_series.sample(frac=0.5)
Out[4]:
1 1
5 5
3 3
Length: 3, dtype: int64
# weights are accepted.
In [5]: example_weights = [0, 0, 0.2, 0.2, 0.2, 0.4]
In [6]: example_series.sample(n=3, weights=example_weights)
Out[6]:
2 2
4 4
3 3
Length: 3, dtype: int64
# weights will also be normalized if they do not sum to one,
# and missing values will be treated as zeros.
In [7]: example_weights2 = [0.5, 0, 0, 0, None, np.nan]
In [8]: example_series.sample(n=1, weights=example_weights2)
Out[8]:
0 0
Length: 1, dtype: int64
应用于DataFrame时,可以传递列的名称以指定从行采样时的采样权重。
In [9]: df = pd.DataFrame({"col1": [9, 8, 7, 6], "weight_column": [0.5, 0.4, 0.1, 0]})
In [10]: df.sample(n=3, weights="weight_column")
Out[10]:
col1 weight_column
0 9 0.5
1 8 0.4
2 7 0.1
[3 rows x 2 columns]
字符串方法增强功能#
Continuing from v0.16.0 ,下面的增强使字符串操作更容易,并且与标准的python字符串操作更一致。
Added
StringMethods
(.str
accessor) toIndex
(GH9068)这个
.str
访问器现在可用于这两个Series
和Index
。In [11]: idx = pd.Index([" jack", "jill ", " jesse ", "frank"]) In [12]: idx.str.strip() Out[12]: Index(['jack', 'jill', 'jesse', 'frank'], dtype='object')
One special case for the
.str
accessor onIndex
is that if a string method returnsbool
, the.str
accessor will return anp.array
instead of a booleanIndex
(GH8875). This enables the following expression to work naturally:In [13]: idx = pd.Index(["a1", "a2", "b1", "b2"]) In [14]: s = pd.Series(range(4), index=idx) In [15]: s Out[15]: a1 0 a2 1 b1 2 b2 3 Length: 4, dtype: int64 In [16]: idx.str.startswith("a") Out[16]: array([ True, True, False, False]) In [17]: s[s.index.str.startswith("a")] Out[17]: a1 0 a2 1 Length: 2, dtype: int64
以下新方法可通过
.str
访问器将函数应用于每个值。 (GH9766 , GH9773 , GH10031 , GH10045 , GH10052 )方法:
capitalize()
swapcase()
normalize()
partition()
rpartition()
index()
rindex()
translate()
split
现在需要expand
关键字来指定是否展开维度。return_type
已弃用。 (GH9847 )In [18]: s = pd.Series(["a,b", "a,c", "b,c"]) # return Series In [19]: s.str.split(",") Out[19]: 0 [a, b] 1 [a, c] 2 [b, c] Length: 3, dtype: object # return DataFrame In [20]: s.str.split(",", expand=True) Out[20]: 0 1 0 a b 1 a c 2 b c [3 rows x 2 columns] In [21]: idx = pd.Index(["a,b", "a,c", "b,c"]) # return Index In [22]: idx.str.split(",") Out[22]: Index([['a', 'b'], ['a', 'c'], ['b', 'c']], dtype='object') # return MultiIndex In [23]: idx.str.split(",", expand=True) Out[23]: MultiIndex([('a', 'b'), ('a', 'c'), ('b', 'c')], )
Improved
extract
andget_dummies
methods forIndex.str
(GH9980)
其他增强功能#
BusinessHour
现在支持偏移量,表示从09:00到17:00的营业时间BusinessDay
默认情况下。看见 Here 有关详细信息,请参阅。 (GH7905 )In [24]: pd.Timestamp("2014-08-01 09:00") + pd.tseries.offsets.BusinessHour() Out[24]: Timestamp('2014-08-01 10:00:00') In [25]: pd.Timestamp("2014-08-01 07:00") + pd.tseries.offsets.BusinessHour() Out[25]: Timestamp('2014-08-01 10:00:00') In [26]: pd.Timestamp("2014-08-01 16:30") + pd.tseries.offsets.BusinessHour() Out[26]: Timestamp('2014-08-04 09:30:00')
DataFrame.diff
现在需要一个axis
确定差异方向的参数 (GH9727 )允许
clip
,clip_lower
,以及clip_upper
接受类似数组的参数作为阈值(这是从0.11.0开始的回归)。这些方法现在有一个axis
确定系列或DataFrame将如何与阈值对齐的参数。 (GH6966 )DataFrame.mask()
andSeries.mask()
now support same keywords aswhere
(GH8801)drop
函数现在可以接受errors
要隐藏的关键字ValueError
当目标数据中不存在任何标签时引发。 (GH6736 )In [27]: df = pd.DataFrame(np.random.randn(3, 3), columns=["A", "B", "C"]) In [28]: df.drop(["A", "X"], axis=1, errors="ignore") Out[28]: B C 0 -0.706771 -1.039575 1 -0.424972 0.567020 2 -1.087401 -0.673690 [3 rows x 2 columns]
添加对使用破折号分隔年份和季度的支持,例如2014-Q1。 (GH9688 )
Allow conversion of values with dtype
datetime64
ortimedelta64
to strings usingastype(str)
(GH9757)get_dummies
函数现在接受sparse
关键词。如果设置为True
,回报DataFrame
是稀疏的,例如SparseDataFrame
。 (GH8823 )Period
现在接受datetime64
作为值输入。 (GH9054 )当时间定义中缺少前导零时,允许时间增量字符串转换,即
0:00:00
VS00:00:00
。 (GH9570 )Allow
Panel.shift
withaxis='items'
(GH9890)现在尝试编写一个Excel文件会引发
NotImplementedError
如果DataFrame
有一个MultiIndex
而不是编写损坏的Excel文件。 (GH9794 )允许
Categorical.add_categories
接受,接受Series
或np.array
。 (GH9927 )添加/删除
str/dt/cat
访问者从__dir__
。 (GH9910 )添加
normalize
作为一个dt
访问器方法。 (GH10047 )DataFrame
andSeries
now have_constructor_expanddim
property as overridable constructor for one higher dimensionality data. This should be used only when it is really needed, see herepd.lib.infer_dtype
现在返回'bytes'
在适当的地方,在Python3中。 (GH10032 )
API更改#
当将斧头传递给
df.plot( ..., ax=ax)
,即sharex
Kwarg现在将默认为False
。其结果是xLabels和xtickLabels的可见性将不再改变。你必须自己做,才能在你的图形或场景中找到正确的轴线sharex=True
显式(但这会更改图中所有轴的可见性,而不仅仅是传入的轴!)。如果Pandas自己创建了子情节(例如,没有传入ax
Kwarg),则默认设置仍为sharex=True
并应用可见性更改。默认情况下,
read_csv
和read_table
现在,我将尝试根据文件扩展名推断压缩类型。集compression=None
以恢复以前的行为(不解压)。 (GH9770 )
不推荐使用#
Series.str.split
'sreturn_type
keyword was removed in favor ofexpand
(GH9847)
索引表示法#
的字符串表示形式 Index
它的子类现在已经统一了。如果值很少,它们将显示单行显示;对于许多值(但少于 display.max_seq_items
;如果有大量项目(> display.max_seq_items
)将显示截断的显示(数据的头和尾)。的格式设置 MultiIndex
保持不变(多行换行显示)。显示宽度与选项相对应 display.max_seq_items
,默认为100。 (GH6482 )
以前的行为
In [2]: pd.Index(range(4), name='foo')
Out[2]: Int64Index([0, 1, 2, 3], dtype='int64')
In [3]: pd.Index(range(104), name='foo')
Out[3]: Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, ...], dtype='int64')
In [4]: pd.date_range('20130101', periods=4, name='foo', tz='US/Eastern')
Out[4]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 00:00:00-05:00, ..., 2013-01-04 00:00:00-05:00]
Length: 4, Freq: D, Timezone: US/Eastern
In [5]: pd.date_range('20130101', periods=104, name='foo', tz='US/Eastern')
Out[5]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 00:00:00-05:00, ..., 2013-04-14 00:00:00-04:00]
Length: 104, Freq: D, Timezone: US/Eastern
新行为
In [29]: pd.set_option("display.width", 80)
In [30]: pd.Index(range(4), name="foo")
Out[30]: RangeIndex(start=0, stop=4, step=1, name='foo')
In [31]: pd.Index(range(30), name="foo")
Out[31]: RangeIndex(start=0, stop=30, step=1, name='foo')
In [32]: pd.Index(range(104), name="foo")
Out[32]: RangeIndex(start=0, stop=104, step=1, name='foo')
In [33]: pd.CategoricalIndex(["a", "bb", "ccc", "dddd"], ordered=True, name="foobar")
Out[33]: CategoricalIndex(['a', 'bb', 'ccc', 'dddd'], categories=['a', 'bb', 'ccc', 'dddd'], ordered=True, dtype='category', name='foobar')
In [34]: pd.CategoricalIndex(["a", "bb", "ccc", "dddd"] * 10, ordered=True, name="foobar")
Out[34]:
CategoricalIndex(['a', 'bb', 'ccc', 'dddd', 'a', 'bb', 'ccc', 'dddd', 'a',
'bb', 'ccc', 'dddd', 'a', 'bb', 'ccc', 'dddd', 'a', 'bb',
'ccc', 'dddd', 'a', 'bb', 'ccc', 'dddd', 'a', 'bb', 'ccc',
'dddd', 'a', 'bb', 'ccc', 'dddd', 'a', 'bb', 'ccc', 'dddd',
'a', 'bb', 'ccc', 'dddd'],
categories=['a', 'bb', 'ccc', 'dddd'], ordered=True, dtype='category', name='foobar')
In [35]: pd.CategoricalIndex(["a", "bb", "ccc", "dddd"] * 100, ordered=True, name="foobar")
Out[35]:
CategoricalIndex(['a', 'bb', 'ccc', 'dddd', 'a', 'bb', 'ccc', 'dddd', 'a',
'bb',
...
'ccc', 'dddd', 'a', 'bb', 'ccc', 'dddd', 'a', 'bb', 'ccc',
'dddd'],
categories=['a', 'bb', 'ccc', 'dddd'], ordered=True, dtype='category', name='foobar', length=400)
In [36]: pd.date_range("20130101", periods=4, name="foo", tz="US/Eastern")
Out[36]:
DatetimeIndex(['2013-01-01 00:00:00-05:00', '2013-01-02 00:00:00-05:00',
'2013-01-03 00:00:00-05:00', '2013-01-04 00:00:00-05:00'],
dtype='datetime64[ns, US/Eastern]', name='foo', freq='D')
In [37]: pd.date_range("20130101", periods=25, freq="D")
Out[37]:
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06', '2013-01-07', '2013-01-08',
'2013-01-09', '2013-01-10', '2013-01-11', '2013-01-12',
'2013-01-13', '2013-01-14', '2013-01-15', '2013-01-16',
'2013-01-17', '2013-01-18', '2013-01-19', '2013-01-20',
'2013-01-21', '2013-01-22', '2013-01-23', '2013-01-24',
'2013-01-25'],
dtype='datetime64[ns]', freq='D')
In [38]: pd.date_range("20130101", periods=104, name="foo", tz="US/Eastern")
Out[38]:
DatetimeIndex(['2013-01-01 00:00:00-05:00', '2013-01-02 00:00:00-05:00',
'2013-01-03 00:00:00-05:00', '2013-01-04 00:00:00-05:00',
'2013-01-05 00:00:00-05:00', '2013-01-06 00:00:00-05:00',
'2013-01-07 00:00:00-05:00', '2013-01-08 00:00:00-05:00',
'2013-01-09 00:00:00-05:00', '2013-01-10 00:00:00-05:00',
...
'2013-04-05 00:00:00-04:00', '2013-04-06 00:00:00-04:00',
'2013-04-07 00:00:00-04:00', '2013-04-08 00:00:00-04:00',
'2013-04-09 00:00:00-04:00', '2013-04-10 00:00:00-04:00',
'2013-04-11 00:00:00-04:00', '2013-04-12 00:00:00-04:00',
'2013-04-13 00:00:00-04:00', '2013-04-14 00:00:00-04:00'],
dtype='datetime64[ns, US/Eastern]', name='foo', length=104, freq='D')
性能改进#
错误修复#
标签未正确显示在的图例中的错误
DataFrame.plot()
,通过label=
自变量起作用,系列索引不再发生变化。 (GH9542 )JSON序列化中的错误,导致帧长度为零时出现段错误。 (GH9805 )
窃听
read_csv
其中,缺少尾部分隔符将导致段错误。 (GH5664 )在追加时保留索引名称时出错 (GH9862 )
窃听
scatter_matrix
绘制意外的轴记号标签 (GH5662 )修复了中的错误
StataWriter
导致对输入的更改DataFrame
在保存时 (GH9795 )。窃听
transform
当存在空条目并且使用快速聚合器时导致长度不匹配 (GH9697 )窃听
equals
当块顺序不同时导致假阴性 (GH9330 )分组时出现错误,包含多个
pd.Grouper
其中一个不是基于时间的 (GH10063 )窃听
read_sql_table
读取带有时区的postgres表时出错 (GH7139 )窃听
DataFrame
切片可能不保留元数据 (GH9776 )Bug where
TimdeltaIndex
were not properly serialized in fixedHDFStore
(GH9635)BUG与
TimedeltaIndex
构造函数忽略name
当给了另一个人TimedeltaIndex
作为数据 (GH10025 )。窃听
DataFrameFormatter._get_formatted_index
不申请max_colwidth
发送到DataFrame
索引 (GH7856 )窃听
.loc
使用只读ndarray数据源 (GH10043 )窃听
groupby.apply()
如果传递的用户定义函数仅返回None
(适用于所有输入)。 (GH9685 )在可复制测试中始终使用临时文件 (GH9992 )
窃听
DataFrame.plot(kind="hist")
在.中的结果TypeError
什么时候DataFrame
包含非数字列 (GH9853 )Bug where repeated plotting of
DataFrame
with aDatetimeIndex
may raiseTypeError
(GH9852)窃听
setup.py
这将允许构建一个不兼容的Cython版本 (GH9827 )绘图中的错误
secondary_y
连接不正确right_ax
属性设置为递归指定自身的辅助轴。 (GH9861 )Bug in
Series.quantile
on empty Series of typeDatetime
orTimedelta
(GH9675)窃听
where
在需要向上转换时导致错误的结果 (GH9731 )窃听
FloatArrayFormatter
其中,对于给定的显示,以十进制格式显示“小”浮点数的判定边界偏离一个数量级。精度 (GH9764 )修复了以下错误
DataFrame.plot()
在同时发生以下情况时引发错误color
和style
传递了关键字,并且样式字符串中没有颜色符号 (GH9671 )Not showing a
DeprecationWarning
on combining list-likes with anIndex
(GH10083)窃听
read_csv
和read_table
在使用时skip_rows
如果存在空行,则使用。 (GH9832 )Bug in
read_csv()
interpretsindex_col=True
as1
(GH9798)使用索引相等性比较时出现错误
==
索引/多索引类型不兼容失败 (GH9785 )其中的BUG
SparseDataFrame
不能接受nan
作为列名 (GH8822 )窃听
to_msgpack
和read_msgpack
支持zlib和blosc压缩 (GH9783 )Bug
GroupBy.size
doesn't attach index name properly if grouped byTimeGrouper
(GH9925)在切片分配中导致异常的错误,原因是
length_of_indexer
返回错误的结果 (GH9995 )CSV解析器中存在错误,导致跳过以空格开头加上一个非空格字符的行。 (GH9710 )
C CSV解析器中存在错误,当数据以换行符开头后跟空格时,会导致虚假的NAN。 (GH10022 )
Bug causing elements with a null group to spill into the final group when grouping by a
Categorical
(GH9603)在空数据帧上.iloc和.loc行为不一致的错误 (GH9964 )
Bug in invalid attribute access on a
TimedeltaIndex
incorrectly raisedValueError
instead ofAttributeError
(GH9680)分类数据和标量之间的不相等比较中的错误,不在类别中(例如
Series(Categorical(list("abc"), ordered=True)) > "d"
。这是退回的False
用于所有元素,但现在引发TypeError
。平等比较现在也返回False
为==
和True
为!=
。 (GH9848 )DataFrame中的错误
__setitem__
当右边是一本词典时 (GH9874 )窃听
where
当dtype为datetime64/timedelta64
,但其他的数据类型不是 (GH9804 )窃听
MultiIndex.sortlevel()
导致Unicode级别名称中断 (GH9856 )其中的BUG
groupby.transform
不正确地强制输出数据类型以匹配输入数据类型。 (GH9807 )窃听
DataFrame
构造函数时columns
参数已设置,并且data
是一个空列表 (GH9939 )条形图中的错误
log=True
加薪TypeError
如果所有值都小于1 (GH9905 )Bug in horizontal bar plot ignores
log=True
(GH9905)在分割包含以下类型的值的数据帧时出错
Decimal
被另一个人Decimal
会提高。 (GH9787 )使用DataFrames asfreq会删除索引名称的错误。 (GH9885 )
重新采样BM/BQ时导致额外索引点的错误 (GH9756 )
在中更改了缓存
AbstractHolidayCalendar
在实例级别而不是在类级别,因为后者可能会导致意外行为。 (GH9552 )修复了多索引数据帧的LaTeX输出 (GH9778 )
Bug causing an exception when setting an empty range using
DataFrame.loc
(GH9596)向现有轴网添加新地块时,隐藏带有子图和共享轴的记号标签时出现错误 (GH9158 )
窃听
transform
和filter
在对分类变量进行分组时 (GH9921 )窃听
transform
当组的数量和数据类型与输入索引相同时 (GH9700 )Google BigQuery连接器现在基于每个方法导入依赖项。 (GH9713 )
Updated BigQuery connector to no longer use deprecated
oauth2client.tools.run()
(GH8327)子类化中的错误
DataFrame
。在对其进行切片或子设置时,它可能不会返回正确的类。 (GH9632 )窃听
.median()
其中未正确处理非浮点型空值 (GH10040 )Series.fulna()中的错误,如果给出了一个数字可转换的字符串,则会引发该错误 (GH10092 )
贡献者#
共有58人为此次发布贡献了补丁。名字中带有“+”的人第一次贡献了一个补丁。
Alfonso MHC +
Andy Hayden
Artemy Kolchinsky
Chris Gilmer +
Chris Grinolds +
Dan Birken
David BROCHART +
David Hirschfeld +
David Stephens
Dr. Leo +
Evan Wright +
Frans van Dunné +
Hatem Nassrat +
Henning Sperr +
Hugo Herter +
Jan Schulz
Jeff Blackburne +
Jeff Reback
Jim Crist +
Jonas Abernot +
Joris Van den Bossche
Kerby Shedden
Leo Razoumov +
Manuel Riel +
Mortada Mehyar
Nick Burns +
Nick Eubank +
Olivier Grisel
Phillip Cloud
Pietro Battiston
Roy Hyunjin Han
Sam Zhang +
Scott Sanderson +
Sinhrks +
Stephan Hoyer
Tiago Antao
Tom Ajamian +
Tom Augspurger
Tomaz Berisa +
Vikram Shirgur +
Vladimir Filimonov
William Hogman +
Yasin A +
Younggun Kim +
behzad nouri
dsm054
floydsoft +
flying-sheep +
gfr +
jnmclarty
jreback
ksanghai +
lucas +
mschmohl +
ptype +
rockg
scls19fr +
sinhrks