Panda veri çerçevesini NumPy dizisine dönüştürme


468

Nasıl bir panda dataframe bir NumPy dizi dönüştürmek bilmek ilgileniyorum.

veri çerçevesi:

import numpy as np
import pandas as pd

index = [1, 2, 3, 4, 5, 6, 7]
a = [np.nan, np.nan, np.nan, 0.1, 0.1, 0.1, 0.1]
b = [0.2, np.nan, 0.2, 0.2, 0.2, np.nan, np.nan]
c = [np.nan, 0.5, 0.5, np.nan, 0.5, 0.5, np.nan]
df = pd.DataFrame({'A': a, 'B': b, 'C': c}, index=index)
df = df.rename_axis('ID')

verir

label   A    B    C
ID                                 
1   NaN  0.2  NaN
2   NaN  NaN  0.5
3   NaN  0.2  0.5
4   0.1  0.2  NaN
5   0.1  0.2  0.5
6   0.1  NaN  0.5
7   0.1  NaN  NaN

Bu yüzden bir NumPy dizisine dönüştürmek istiyorum:

array([[ nan,  0.2,  nan],
       [ nan,  nan,  0.5],
       [ nan,  0.2,  0.5],
       [ 0.1,  0.2,  nan],
       [ 0.1,  0.2,  0.5],
       [ 0.1,  nan,  0.5],
       [ 0.1,  nan,  nan]])

Bunu nasıl yapabilirim?


Bonus olarak, bu gibi türleri korumak mümkün mü?

array([[ 1, nan,  0.2,  nan],
       [ 2, nan,  nan,  0.5],
       [ 3, nan,  0.2,  0.5],
       [ 4, 0.1,  0.2,  nan],
       [ 5, 0.1,  0.2,  0.5],
       [ 6, 0.1,  nan,  0.5],
       [ 7, 0.1,  nan,  nan]],
     dtype=[('ID', '<i4'), ('A', '<f8'), ('B', '<f8'), ('B', '<f8')])

veya benzeri?


5
Buna ne için ihtiyacın var ? Yine de sayısal dizilere dayanan veri çerçeveleri değil mi? Numpy diziye ihtiyaç duyduğunuzda bir veri çerçevesi kullanabilmeniz gerekir. Bu nedenle işlevlerin sayısal dizileri istediği yerde scikit-learn ile veri kareleri kullanabilirsiniz.
chrisfs

Burada dtypes & recarrays (kayıt dizileri veya yapısal diziler olarak da bilinir) ile ilgili birkaç alakalı bağlantı bulunmaktadır: (1) stackoverflow.com/questions/9949427/… (2) stackoverflow.com/questions/52579601/…
JohnE

NOT: Pandas DataFrame'i böyle bir diziye (veya listeye) dönüştürmek, diğer sorunların göstergesi olabilir. Bir DataFrame'in sizin kullanım durumunuz için uygun veri yapısı olmasını ve Pandas'ın ilgilendiğiniz işlemleri gerçekleştirmenin herhangi bir yolunu içermemesini önemle tavsiye ederim.
AMC

Yanıtlar:


392

Panda veri karesini (df) nümerik bir ndarray'a dönüştürmek için şu kodu kullanın:

df.values

array([[nan, 0.2, nan],
       [nan, nan, 0.5],
       [nan, 0.2, 0.5],
       [0.1, 0.2, nan],
       [0.1, 0.2, 0.5],
       [0.1, nan, 0.5],
       [0.1, nan, nan]])

240

Kullanımınızı kullanımdan kaldırmak valuesveas_matrix() !

pandas v0.24.0, pandas nesnelerinden NumPy dizileri elde etmek için iki yeni yöntem tanıttı:

  1. to_numpy()Hakkında tanımlandığı Index, Series,ve DataFramenesneler ve
  2. array, Indexve Seriesyalnızca nesnelerde tanımlanır .

İçin v0.24 belgelerini ziyaret .valuesederseniz, büyük bir kırmızı uyarı görürsünüz:

Uyarı: DataFrame.to_numpy()Bunun yerine kullanmanızı öneririz .

Daha fazla bilgi için v0.24.0 sürüm notlarının bu bölümüne ve bu cevaba bakınız .


Daha İyi Tutarlılığa Doğru: to_numpy()

API boyunca daha iyi tutarlılık ruhu içinde to_numpy, temel NumPy dizisini DataFrames'ten ayıklamak için yeni bir yöntem sunulmuştur.

# Setup.
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c'])

df.to_numpy()
array([[1, 4],
       [2, 5],
       [3, 6]])

Yukarıda belirtildiği gibi, bu yöntem Indexve Seriesnesneler üzerinde de tanımlanmıştır ( buraya bakın ).

df.index.to_numpy()
# array(['a', 'b', 'c'], dtype=object)

df['A'].to_numpy()
#  array([1, 2, 3])

Varsayılan olarak bir görünüm döndürülür, bu nedenle yapılan değişiklikler orijinali etkiler.

v = df.to_numpy()
v[0, 0] = -1

df
   A  B
a -1  4
b  2  5
c  3  6

Bunun yerine bir kopyasına ihtiyacınız varsa to_numpy(copy=True) kullanın .

pandalar> = 1.0 ExtensionTypes için güncelleme

Panda 1.x kullanıyorsanız, uzantı türleriyle çok daha fazla uğraşma şansınız vardır. Bu uzantı türlerinin doğru dönüştürülmesine biraz daha dikkat etmelisiniz.

a = pd.array([1, 2, None], dtype="Int64")                                  
a                                                                          

<IntegerArray>
[1, 2, <NA>]
Length: 3, dtype: Int64 

# Wrong
a.to_numpy()                                                               
# array([1, 2, <NA>], dtype=object)  # yuck, objects

# Right
a.to_numpy(dtype='float', na_value=np.nan)                                 
# array([ 1.,  2., nan])

Bu dokümanlarda çağrılır .

Eğer ihtiyacınız varsa dtypes...

Başka bir cevapta gösterildiği gibi, DataFrame.to_recordsbunu yapmanın iyi bir yoludur.

df.to_records()
# rec.array([('a', -1, 4), ('b',  2, 5), ('c',  3, 6)],
#           dtype=[('index', 'O'), ('A', '<i8'), ('B', '<i8')])

to_numpyNe yazık ki bu yapılamaz . Ancak, alternatif olarak şunları kullanabilirsiniz np.rec.fromrecords:

v = df.reset_index()
np.rec.fromrecords(v, names=v.columns.tolist())
# rec.array([('a', -1, 4), ('b',  2, 5), ('c',  3, 6)],
#          dtype=[('index', '<U1'), ('A', '<i8'), ('B', '<i8')])

Performans açısından, neredeyse aynı (aslında, kullanmak rec.fromrecordsbiraz daha hızlı).

df2 = pd.concat([df] * 10000)

%timeit df2.to_records()
%%timeit
v = df2.reset_index()
np.rec.fromrecords(v, names=v.columns.tolist())

11.1 ms ± 557 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
9.67 ms ± 126 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Yeni Bir Yöntem Ekleme Gerekçesi

to_numpy()(buna ek olarak array) iki GitHub sorunu GH19954 ve GH23623 kapsamında yapılan tartışmalar sonucunda eklendi .

Özellikle, dokümanlar gerekçeden bahseder:

[...] .valuesdöndürülen değerin gerçek dizi mi, bazı dönüşümleri mi yoksa panda özel dizilerinden biri mi (mesela Categorical) olacağı belli değildi . Örneğin, ile PeriodIndex, .values yeni bir oluşturur ndarraysüresinin her zaman nesneleri. [...]

to_numpy doğru yönde atılmış önemli bir adım olan API'nın tutarlılığını artırmayı amaçlamaktadır. .valuesmevcut sürümde kullanımdan kaldırılmayacak, ancak bunun gelecekte bir noktada gerçekleşmesini bekliyorum.


Diğer Çözümlerin Eleştirisi

DataFrame.values daha önce de belirtildiği gibi tutarsız bir davranışa sahiptir.

DataFrame.get_values() sadece etrafı saran DataFrame.values , bu yüzden yukarıda belirtilen her şey geçerlidir.

DataFrame.as_matrix()şimdi kullanımdan kaldırıldı, KULLANMAYIN !


as_matrixBu durumda, to_numpysütun seçme işlevinin nasıl kurtarılacağını açıklamadan , akciğerlerinin üstünde çığlık atan insanların sayfadan sonraki sayfalarını nasıl okumanın mümkün olduğunu anlamıyorum as_matrix! Sütunları seçmenin başka yolları olduğundan eminim, ancak as_matrixbunlardan en az biriydi!
Jérémie

@ Jérémie bariz yanı sıra df[[col1, col2']].to_numpy()? Kullanımdan kaldırılmış bir işleve güncellenmiş bir alternatifi neden tanıtmak istediğinizi düşündüğünüzden emin değilsiniz.
cs95

what Sütunlardan bazıları liste türündeyse. Bundan düz bir engebeli dizi nasıl oluşturabilirim?
Moniba

@Moniba, ilk önce gereksiniminize göre liste öğelerini ayrı sütunlara / satırlara patlatmak isteyebilirsiniz.
cs95

Yanılmıyorsam, aynı çağrıda birden fazla sütun almak, tüm verileri tek bir büyük dizide birleştirir. Bir şey mi kaçırıyorum?
Andrea Moro

129

Not : .as_matrix()Bu cevapta kullanılan yöntem kullanımdan kaldırılmıştır. Pandalar 0.23.4 uyardı:

Yöntem .as_matrixgelecekteki bir sürümde kaldırılacak. Bunun yerine .values ​​kullanın.


Pandalar yerleşik bir şey var ...

numpy_matrix = df.as_matrix()

verir

array([[nan, 0.2, nan],
       [nan, nan, 0.5],
       [nan, 0.2, 0.5],
       [0.1, 0.2, nan],
       [0.1, 0.2, 0.5],
       [0.1, nan, 0.5],
       [0.1, nan, nan]])

30
Bu yapılandırılmış bir dizi vermez, tüm sütunlar dtype'dir object.
sebix

14
"0.23.0 sürümünden beri kullanımdan kaldırıldı: Bunun yerine DataFrame.values ​​kullanın." / "Bu yöntem geriye dönük uyumluluk için sağlanmıştır. Genellikle '.values' kullanılması önerilir." - github.com/pandas-dev/pandas/blob/…
David J.

4
Bu artık kullanımdan kaldırıldı. V0.24'ten itibaren lütfen to_numpybunun yerine kullanın ( .valuesikisini birden değil ). Daha burada .
cs95

1
"FutureWarning: Yöntem .as_matrix gelecekteki bir sürümde kaldırılacak. Bunun yerine .values ​​kullanın."
Farhad Maleki

67

Ben sadece DataFrame.reset_index () ve DataFrame.values fonksiyonları dizin dahil olmak üzere dataframe Numpy gösterimi almak için zincir:

In [8]: df
Out[8]: 
          A         B         C
0 -0.982726  0.150726  0.691625
1  0.617297 -0.471879  0.505547
2  0.417123 -1.356803 -1.013499
3 -0.166363 -0.957758  1.178659
4 -0.164103  0.074516 -0.674325
5 -0.340169 -0.293698  1.231791
6 -1.062825  0.556273  1.508058
7  0.959610  0.247539  0.091333

[8 rows x 3 columns]

In [9]: df.reset_index().values
Out[9]:
array([[ 0.        , -0.98272574,  0.150726  ,  0.69162512],
       [ 1.        ,  0.61729734, -0.47187926,  0.50554728],
       [ 2.        ,  0.4171228 , -1.35680324, -1.01349922],
       [ 3.        , -0.16636303, -0.95775849,  1.17865945],
       [ 4.        , -0.16410334,  0.0745164 , -0.67432474],
       [ 5.        , -0.34016865, -0.29369841,  1.23179064],
       [ 6.        , -1.06282542,  0.55627285,  1.50805754],
       [ 7.        ,  0.95961001,  0.24753911,  0.09133339]])

Türleri elde etmek için, bu ndarray'ı görünümü kullanarak yapılandırılmış bir diziye dönüştürmemiz gerekir :

In [10]: df.reset_index().values.ravel().view(dtype=[('index', int), ('A', float), ('B', float), ('C', float)])
Out[10]:
array([( 0, -0.98272574,  0.150726  ,  0.69162512),
       ( 1,  0.61729734, -0.47187926,  0.50554728),
       ( 2,  0.4171228 , -1.35680324, -1.01349922),
       ( 3, -0.16636303, -0.95775849,  1.17865945),
       ( 4, -0.16410334,  0.0745164 , -0.67432474),
       ( 5, -0.34016865, -0.29369841,  1.23179064),
       ( 6, -1.06282542,  0.55627285,  1.50805754),
       ( 7,  0.95961001,  0.24753911,  0.09133339),
       dtype=[('index', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

3
Bu cevapta eksik olan tek şey, genel bir işlev yazabilmeniz için veri çerçevesinden dtype'in nasıl yapılandırılacağıdır
Joseph Garvin

33

to_recordsYöntemi kullanabilirsiniz , ancak başlangıçtan itibaren istediğiniz şey değilse dtypes ile biraz oynamak zorunda. Benim durumumda, objectDF'nizi bir dizeden kopyaladıktan sonra, dizin türü dize ( pandalarda bir dtype ile temsil edilir ):

In [102]: df
Out[102]: 
label    A    B    C
ID                  
1      NaN  0.2  NaN
2      NaN  NaN  0.5
3      NaN  0.2  0.5
4      0.1  0.2  NaN
5      0.1  0.2  0.5
6      0.1  NaN  0.5
7      0.1  NaN  NaN

In [103]: df.index.dtype
Out[103]: dtype('object')
In [104]: df.to_records()
Out[104]: 
rec.array([(1, nan, 0.2, nan), (2, nan, nan, 0.5), (3, nan, 0.2, 0.5),
       (4, 0.1, 0.2, nan), (5, 0.1, 0.2, 0.5), (6, 0.1, nan, 0.5),
       (7, 0.1, nan, nan)], 
      dtype=[('index', '|O8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
In [106]: df.to_records().dtype
Out[106]: dtype([('index', '|O8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

Recarray dtype'i dönüştürmek benim için işe yaramıyor, ancak bunu zaten Pandalar'da yapabilir:

In [109]: df.index = df.index.astype('i8')
In [111]: df.to_records().view([('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
Out[111]:
rec.array([(1, nan, 0.2, nan), (2, nan, nan, 0.5), (3, nan, 0.2, 0.5),
       (4, 0.1, 0.2, nan), (5, 0.1, 0.2, 0.5), (6, 0.1, nan, 0.5),
       (7, 0.1, nan, nan)], 
      dtype=[('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

Pandaların dizinin adını düzgün ayarlamadığını unutmayın ( ID , dışa aktarılan kayıt dizisinde (hata?) Dizinin ) ; bu nedenle, bunun için de düzeltmek üzere tür dönüşümünden yararlanırız.

Şu anda Pandas'ın sadece 8 baytlık tam sayıları var i8ve yüzüyor f8(bu konuya bakın ).


2
Aranan yapılandırılmış diziyi (bir yeniden diziden daha iyi performansa sahip) elde etmek için, yeniden diziyi yapıcıya iletmeniz yeterlidir np.array.
meteore

Yukarıda gösterilen dizinin adını ayarlamak için bir düzeltme koyduk.
Chang She

27

Sanki df.to_records()senin için çalışacak gibi görünüyor . Tam olarak aradığınız özellik istendi veto_records alternatif olarak işaret edildi.

Bunu örneğinizi kullanarak yerel olarak denedim ve bu çağrı, aradığınız çıktıya çok benzer bir şey veriyor:

rec.array([(1, nan, 0.2, nan), (2, nan, nan, 0.5), (3, nan, 0.2, 0.5),
       (4, 0.1, 0.2, nan), (5, 0.1, 0.2, 0.5), (6, 0.1, nan, 0.5),
       (7, 0.1, nan, nan)],
      dtype=[(u'ID', '<i8'), (u'A', '<f8'), (u'B', '<f8'), (u'C', '<f8')])

Bunun bir recarraydeğil , bir olduğunu unutmayın array. Sonucu, yapıcı olarak çağırarak normal numpy dizisine taşıyabilirsiniz np.array(df.to_records()).


3
Bir dakika, bu cevap @meteore'un to_records()5 yıldan daha önce bahsedilen diğer cevaba kıyasla ne katıyor ?
JohnE

14

Bunu dene:

a = numpy.asarray(df)

Selam! Lütfen cevabınıza biraz açıklama ekleyin. Şu anda uzunluk ve içerik nedeniyle gözden geçirilerek düşük kalite olarak işaretleniyor ve sistem tarafından silinme riski var. Teşekkürler!
d_kennetz

1
temel olarak girdiyi bir diziye dönüştürür (adından da anlaşılacağı gibi). Dolayısıyla sorunun bağlamıyla birlikte bu cevap geçerlidir. check docs.scipy.org/doc/numpy/reference/generated/…
Lautaro Parada Opazo

Teşekkürler, sanırım bu biraz açıklayıcı.
Dadu Khan

9

İşte bir panda DataFrame bir yapı dizisi yapmak benim yaklaşım.

Veri çerçevesini oluşturma

import pandas as pd
import numpy as np
import six

NaN = float('nan')
ID = [1, 2, 3, 4, 5, 6, 7]
A = [NaN, NaN, NaN, 0.1, 0.1, 0.1, 0.1]
B = [0.2, NaN, 0.2, 0.2, 0.2, NaN, NaN]
C = [NaN, 0.5, 0.5, NaN, 0.5, 0.5, NaN]
columns = {'A':A, 'B':B, 'C':C}
df = pd.DataFrame(columns, index=ID)
df.index.name = 'ID'
print(df)

      A    B    C
ID               
1   NaN  0.2  NaN
2   NaN  NaN  0.5
3   NaN  0.2  0.5
4   0.1  0.2  NaN
5   0.1  0.2  0.5
6   0.1  NaN  0.5
7   0.1  NaN  NaN

Panda DataFrame'den sayısal bir yapı dizisi (bir kayıt dizisi değil) yapmak için işlev tanımlayın.

def df_to_sarray(df):
    """
    Convert a pandas DataFrame object to a numpy structured array.
    This is functionally equivalent to but more efficient than
    np.array(df.to_array())

    :param df: the data frame to convert
    :return: a numpy structured array representation of df
    """

    v = df.values
    cols = df.columns

    if six.PY2:  # python 2 needs .encode() but 3 does not
        types = [(cols[i].encode(), df[k].dtype.type) for (i, k) in enumerate(cols)]
    else:
        types = [(cols[i], df[k].dtype.type) for (i, k) in enumerate(cols)]
    dtype = np.dtype(types)
    z = np.zeros(v.shape[0], dtype)
    for (i, k) in enumerate(z.dtype.names):
        z[k] = v[:, i]
    return z

reset_indexVerilerinin bir parçası olarak dizini içeren yeni bir veri çerçevesi oluşturmak için kullanın . Bu veri çerçevesini bir yapı dizisine dönüştürün.

sa = df_to_sarray(df.reset_index())
sa

array([(1L, nan, 0.2, nan), (2L, nan, nan, 0.5), (3L, nan, 0.2, 0.5),
       (4L, 0.1, 0.2, nan), (5L, 0.1, 0.2, 0.5), (6L, 0.1, nan, 0.5),
       (7L, 0.1, nan, nan)], 
      dtype=[('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

EDIT: .encode () python 3 ile hata arama önlemek için df_to_sarray güncellendi. Joseph Garvin ve halcyon yorum ve çözüm için teşekkür ederiz .


benim için çalışmıyor, hata: TypeError: veri türü anlaşılmadı
Joseph Garvin

Yorumlarınız için ve sayesinde halcyon düzeltilmesi için. Cevabımı güncelledim, umarım şimdi sizin için çalışır.
Phil


6

Örnek DataFrame için Daha Basit Bir Yol:

df

         gbm       nnet        reg
0  12.097439  12.047437  12.100953
1  12.109811  12.070209  12.095288
2  11.720734  11.622139  11.740523
3  11.824557  11.926414  11.926527
4  11.800868  11.727730  11.729737
5  12.490984  12.502440  12.530894

KULLANIM:

np.array(df.to_records().view(type=np.matrix))

ALMAK:

array([[(0, 12.097439  , 12.047437, 12.10095324),
        (1, 12.10981081, 12.070209, 12.09528824),
        (2, 11.72073428, 11.622139, 11.74052253),
        (3, 11.82455653, 11.926414, 11.92652727),
        (4, 11.80086775, 11.72773 , 11.72973699),
        (5, 12.49098389, 12.50244 , 12.53089367)]],
dtype=(numpy.record, [('index', '<i8'), ('gbm', '<f8'), ('nnet', '<f4'),
       ('reg', '<f8')]))

5

Veri çerçevesinden arcgis tablosuna dışa aktarırken benzer bir sorun yaşadım ve usgs'den bir çözüm üzerinde tökezledi ( https://my.usgs.gov/confluence/display/cdi/pandas.DataFrame+to+ArcGIS+Table ). Kısacası sorununuz benzer bir çözüme sahiptir:

df

      A    B    C
ID               
1   NaN  0.2  NaN
2   NaN  NaN  0.5
3   NaN  0.2  0.5
4   0.1  0.2  NaN
5   0.1  0.2  0.5
6   0.1  NaN  0.5
7   0.1  NaN  NaN

np_data = np.array(np.rec.fromrecords(df.values))
np_names = df.dtypes.index.tolist()
np_data.dtype.names = tuple([name.encode('UTF8') for name in np_names])

np_data

array([( nan,  0.2,  nan), ( nan,  nan,  0.5), ( nan,  0.2,  0.5),
       ( 0.1,  0.2,  nan), ( 0.1,  0.2,  0.5), ( 0.1,  nan,  0.5),
       ( 0.1,  nan,  nan)], 
      dtype=(numpy.record, [('A', '<f8'), ('B', '<f8'), ('C', '<f8')]))

5

Yukarıdaki cevapları inceledim. " As_matrix () " yöntemi çalışıyor, ancak artık kullanılmıyor. Benim için işe yarayan şey " .to_numpy () " idi.

Bu, çok boyutlu bir dizi döndürür. Excel sayfasından veri okuyorsanız ve herhangi bir dizinden verilere erişmeniz gerekiyorsa bu yöntemi kullanmayı tercih ederim. Bu yardımcı olur umarım :)


Ne demek istiyorsun ve herhangi bir dizinden verilere erişmen gerekiyor mu? Verilerinizin niteliğine bağlı olarak, bir Pandas DataFrame ilk etapta doğru seçim olmayabilir.
AMC

3

Meteor cevabının yanı sıra, kodu buldum

df.index = df.index.astype('i8')

benim için çalışmıyor. Bu yüzden, bu sorunla sıkışmış başkalarının kolaylığı için kodumu buraya koydum.

city_cluster_df = pd.read_csv(text_filepath, encoding='utf-8')
# the field 'city_en' is a string, when converted to Numpy array, it will be an object
city_cluster_arr = city_cluster_df[['city_en','lat','lon','cluster','cluster_filtered']].to_records()
descr=city_cluster_arr.dtype.descr
# change the field 'city_en' to string type (the index for 'city_en' here is 1 because before the field is the row index of dataframe)
descr[1]=(descr[1][0], "S20")
newArr=city_cluster_arr.astype(np.dtype(descr))

2

Dataframe'i numpy dizisine dönüştürmenin basit bir yolu:

import pandas as pd
df = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df_to_array = df.to_numpy()
array([[1, 3],
   [2, 4]])

Tutarlılığı korumak için to_numpy kullanımı teşvik edilir.

Referans: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html


Arsam ve sizinki tarafından sağlanan çözüm arasındaki fark nedir ...
qaiser

Sadece kişisel olarak tercih ettiğim bir kod örneği ile daha tamamen ve kullanılabilir hale getirmeye çalıştım.
user1460675 21:19

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.