簡體   English   中英

我正在嘗試將輸入數據列(Numpy Array 類型)轉換為不同類型(float 和 U30)

[英]I'm trying to convert columns of input data (of type Numpy Array) into different types (float and U30)

我花了很多時間來嘗試這個問題,包括詢問導師和其他同行的反饋。 似乎沒有人能夠弄清楚。 我很絕望,因為今天要完成這項任務,我需要這段代碼來測試我的其他代碼。 問題如下。

“任務 1 中由 NumPy 創建的數組的數據類型是非結構化的。這是因為,在默認設置中,NumPy 決定每個值的數據類型。此外,任務 1 中的輸出包含在我們的任務中可能不需要的標題行分配。因此,刪除標題行並將所有列轉換為類型 float(即“float”),除了輸入參數索引指定的列(如下所述)。此外,索引中未提及的其余列應該使用長度為 30 個字符的 Unicode(即“<U30”)。最后,每一行都被轉換為一個類型元組(例如,tuple(i) for i in data)。

編寫一個可以完成上述任務的函數data_type_format(data, index),其中,輸入數據是一個NumPy數組,索引包含要轉換為<U30數據類型的列索引(在列表中),以及數據中不在索引中的其余列將轉換為浮點型。”

這是我在任務 1 中使用的代碼:

    import numpy as np
    import pandas as pd
    def load_mydata(filename):
    "return"
    df = pd.read_csv(filename,delimiter=',',quotechar="",quoting=3,header=None)
    df = df.iloc[:,[0,1,2,5,8,9,10,11,12]]
    ndarray = np.array(df,dtype='U30')
    return ndarray

這是我嘗試過的一些代碼:

    def data_type_format(data,indexes):
    "return"
    list=[float(element) if indx not in indexes else 
    str(ord(element)) if len(element)<30 else 
    element for indx,element in data] 
    return tuple(list)

    import csv
    def data_type_format(data,indexes):
    "return csv file data as tuple formatted"
    list=[]
    df = pd.read_csv(data,delimiter=',',quotechar="",quoting=3,header=None)
    df = df.iloc[:,[0,1,2,5,8,9,10,11,12]]
    ndarray = np.array(df,dtype='U30')
    for df in data:
        if df in indexes:
            df[indexes] = df[indexes].astype(float)
        else:
            df[indexes]= df[indexes].astype('U30')
    list.append(df)
    return tuple(list)

代碼需要在 python shell 中使用以下測試進行測試。

    data = load_mydata("location_review_data.csv")
    data = data_type_format(data, [0, 1, 2, 3]) 
    print(data[0])   
    #gives result

('周四 1 月 30 日 06:58:27 +0000 2020'、'98675'、'1'、'22847'、0.421、0.442、0.452、0.397、0.357)] 1

我嘗試了許多不同的版本,但沒有一個有效! 使用的 cvs 文件: https : //drive.google.com/file/d/1Qd-xFaK4z5ijSHTmmtR7VhJyFaBzjFvO/view? usp =sharing

使用下載的 csv 我能夠得到

In [181]: import pandas as pd
In [182]: df = pd.read_csv('../Downloads/location_review_data.csv')
In [183]: df
Out[183]: 
                           created_at  user_ID  review_ID   latitude  longitude  ...    sad  happy surprise  disgust    joy
0      Thu Jan 30 06:58:27 +0000 2020    98675          1  30.235909 -97.795140  ...  0.421  0.442    0.452    0.397  0.357
1      Thu Jan 30 06:03:24 +0000 2020    67730          2  30.269103 -97.749395  ...  0.469  0.408    0.488    0.377  0.350
2      Thu Jan 30 06:19:25 +0000 2020    11576          3  30.255731 -97.763386  ...  0.542  0.361    0.276    0.270  0.424
3      Thu Jan 30 06:16:38 +0000 2020    87911          4  30.263418 -97.757597  ...  0.418  0.499    0.352    0.367  0.291
4      Thu Jan 30 06:08:09 +0000 2020   148147          5  30.274292 -97.740523  ...  0.242  0.632    0.532    0.501  0.199
...                               ...      ...        ...        ...        ...  ...    ...    ...      ...      ...    ...
19995  Fri Feb 07 23:47:25 +0000 2020    21591      19996  42.357491 -71.058885  ...  0.437  0.431    0.609    0.446  0.260
19996  Fri Feb 07 23:21:33 +0000 2020    37809      19997  42.357437 -71.058470  ...  0.432  0.412    0.549    0.452  0.219
19997  Fri Feb 07 23:34:48 +0000 2020    39721      19998  42.357553 -71.057779  ...  0.597  0.314    0.311    0.304  0.428
19998  Sat Feb 08 00:18:22 +0000 2020    20873      19999  42.357142 -71.058455  ...  0.452  0.479    0.518    0.442  0.252
19999  Fri Feb 07 23:13:02 +0000 2020    33846      20000  42.357069 -71.058551  ...  0.391  0.490    0.548    0.459  0.199

[20000 rows x 13 columns]

一個結構化數組:

In [184]: data = df.to_records()
In [185]: data.shape
Out[185]: (20000,)
In [186]: data.dtype
Out[186]: dtype((numpy.record, [('index', '<i8'), ('created_at', 'O'), ('user_ID', '<i8'), ('review_ID', '<i8'), ('latitude', '<f8'), ('longitude', '<f8'), ('location_ID', '<i8'), ('friend_count', 'O'), ('follower_count', 'O'), ('sad', '<f8'), ('happy', '<f8'), ('surprise', '<f8'), ('disgust', '<f8'), ('joy', '<f8')]))

'O' dtype 字段包含字符串作為 Python 對象,這是pandas做法。

使用 numpy 的 csv 閱讀器:

In [192]: data = np.genfromtxt('../Downloads/location_review_data.csv', names=True, dtype=None, delimiter=',', encoding=None, comments=None)
In [193]: data.shape
Out[193]: (20000,)
In [194]: data.dtype
Out[194]: dtype([('created_at', '<U30'), ('user_ID', '<i8'), ('review_ID', '<i8'), ('latitude', '<f8'), ('longitude', '<f8'), ('location_ID', '<i8'), ('friend_count', '<U8'), ('follower_count', '<U22'), ('sad', '<f8'), ('happy', '<f8'), ('surprise', '<f8'), ('disgust', '<f8'), ('joy', '<f8')])

某些列中的“#”給我帶來了問題,因為這是默認的注釋字符。 我不得不停用它。

前 3 行/記錄:

In [195]: data[:3]
Out[195]: 
array([('Thu Jan 30 06:58:27 +0000 2020', 98675, 1, 30.23590912, -97.79513958,  22847, '#####', '############', 0.421, 0.442, 0.452, 0.397, 0.357),
       ('Thu Jan 30 06:03:24 +0000 2020', 67730, 2, 30.26910295, -97.74939537, 420315, '#####', '############', 0.469, 0.408, 0.488, 0.377, 0.35 ),
       ('Thu Jan 30 06:19:25 +0000 2020', 11576, 3, 30.25573099, -97.76338577, 316637, '#####', '##########', 0.542, 0.361, 0.276, 0.27 , 0.424)],
      dtype=[('created_at', '<U30'), ('user_ID', '<i8'), ('review_ID', '<i8'), ('latitude', '<f8'), ('longitude', '<f8'), ('location_ID', '<i8'), ('friend_count', '<U8'), ('follower_count', '<U22'), ('sad', '<f8'), ('happy', '<f8'), ('surprise', '<f8'), ('disgust', '<f8'), ('joy', '<f8')])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM