1. Выбор данных

Получите набор данных. Он не должен быть идеальным, это просто что-то хорошее, с чем можно поиграть. Вот ссылка, с которой можно начать. Выбранные вами наборы данных должны иметь какой-либо метод отслеживания местоположения. Это может быть (широта и долгота, адрес, название района, название ресторана, хэштег, связанный с местоположением, например #timessquare или даже в более общем смысле, например #plaza). Большинство наборов данных имеют некоторые особенности, связанные с местоположением.

2–3. Предварительная обработка и очистка данных и выбор функций

Для CSV и TXT

Перенесите свои данные в Google Таблицы. * Примечание. Google Таблицы лучше всего подходят для очистки файлов CSV и txt. Изучая данные, я стараюсь ограничить их числом не более 100 строк. Меньше - всегда лучше! Выберите несколько атрибутов, которые вы хотите изучить или визуализировать. Создайте новый чистый лист, содержащий только эти несколько атрибутов и не более 100 строк.

Если вы хотите дополнительно изучить данные, прежде чем удалять значения и ограничивать выбираемые вами атрибуты, вы можете использовать сводные таблицы для исследования данных по различным атрибутам. Если у вас много данных, это может позволить вам сориентировать данные по чему-то вроде (время, местоположение, идентификатор и т. Д.). Это также может помочь вам удалить значения, которые вам не интересны.

Очистите данные, чтобы избавиться от пустых строк или странных значений. Как только ваши данные будут чистыми, вы можете начать визуализировать их в Google Таблицах. Выберите два или три столбца атрибутов и используйте ›Вставить› Диаграмма. Вы можете поиграть с различными типами диаграмм, используя раскрывающийся список «Тип диаграммы». Это полезно для просмотра данных по-разному. Мне нравится использовать это, чтобы быстро просматривать различные атрибуты.

Если вы удовлетворены своими данными или считаете, что у вас есть что-то интересное, загрузите файл в формате CSV для обработки и поместите его в папку с именем «data» в папке проекта Sketch.

Если вы хотите использовать данные, но все еще не можете найти что-то подходящее или вас особенно интересует конкретный источник данных из API, заполните эту форму. Мы не сможем предоставить всем данные, которые они хотят, но мы можем попытаться облегчить это, а пока, пожалуйста, используйте источник, который вы можете добавить в Google Таблицы.

4 интеллектуального анализа данных и использования потока событий:

1учебное пособие: прежде чем мы загрузим ваши данные, давайте разберемся, как работают списки в Processing и Python. Следуйте этому руководству:

Чтобы настроить свой скетч, вам нужно обновить приведенный ниже код, чтобы использовать то же имя файла, что и ваш csv, и использовать свои собственные имена переменных для атрибутов, которые вы вводите:

import csv
def setup():
    size(500, 500)
    
    #rename "quakes.csv" with your csv file name
    with open("quakes.csv") as f:
        reader = csv.reader(f)
        header = reader.next() # Skip the header row.
                
        #define a new name for your new list
        global magnitudes
        magnitudes = []
        
        global ids
        ids = []
                        
        for row in reader:
            magnitude = float(row[4])
            magnitudes.append(magnitude)
            
            #notice when bringing in the id row I don't need convert it into a float like I do with magnitudes above because its a string
            id = row[11]
            ids.append(id)
        
        print magnitudes
        print ids
def draw():
    background(0)
    ellipse(80, 80, 80, 80)

Как открыть файл csv:
Чтобы настроить эскиз, вам необходимо обновить приведенный ниже код, чтобы использовать то же имя файла, что и ваш csv, и csv должен находиться в папке данных файла эскиза вашего проекта. :

import csv
def setup():
    size(500, 500)
    
    #rename "quakes.csv" with your csv file name
    with open("quakes.csv") as f:
        reader = csv.reader(f)
        header = reader.next() # Skip the header row.
def draw():
    background(0)
    ellipse(80, 80, 80, 80)

Как сослаться на интересующую вас функцию и превратить ее в список:
Вам нужно будет использовать свои собственные имена переменных для атрибутов, которые вы вводите. Вам нужно определить их как глобальные переменные, а затем включить эту переменную в список .:

                
        #define a new name for your new attribute list. i.e. magnitudes should be replaced with your attribute name
        global magnitudes
        magnitudes = []

Затем вы создаете цикл for, который будет читать csv и добавлять каждый определяемый вами атрибут в список:

#rename these variables to match the global variable you defined above
for row in reader:
            magnitude = float(row[4])
            magnitudes.append(magnitude)
        
        print magnitudes

Но что, если мы хотим ввести несколько атрибутов? Нам просто нужно выполнить те же шаги, которые мы только что прошли.
1. Определите глобальную переменную
2. Установите ее равной пустому списку
3. Затем в нашем цикле for, который читает csv создает переменную и устанавливает ее равной 4. значению, которое мы хотим в нашем списке
5. Затем добавляем ее в наш пустой список, который мы создали на шаге до
6. Затем распечатайте ее, чтобы убедиться, что она работающий

Ниже приведен пример значений магнитуд и идентификаторов землетрясений. Вы должны обновить это для своих собственных атрибутов данных.

import csv
def setup():
    size(500, 500)
    
    #rename "quakes.csv" with your csv file name
    with open("quakes.csv") as f:
        reader = csv.reader(f)
        header = reader.next() # Skip the header row.
                
        #define a new name for your new list
        global magnitudes
        magnitudes = []
        
        global ids
        ids = []
        
        #rename these variables to match the global variable you defined above                
        for row in reader:
            magnitude = float(row[4])
            magnitudes.append(magnitude)
            
            #notice when bringing in the id row I don't need convert it into a float like I do with magnitudes above because its a string
            id = row[11]
            ids.append(id)
        
        print magnitudes
        print ids
        
def draw():
    background(0)
    ellipse(80, 80, 80, 80)

Теперь то, что вы рисуете, полностью зависит от того, какие данные у вас есть. Если у вас есть список поплавков, вы можете начать с визуализации их как длины или как длины прямоугольников. Если у вас есть текст, вы можете выбрать визуализацию списка текста. Вот как вы извлекаете один элемент из списка в цикле отрисовки:

#update the variables to match your own and the scalar to match one that is appropriate to your data. Depending on the scale of your data you may need to divide it
def draw():
    background(0)
    magnitude = magnitudes[9]
    scalar=10
    ellipse(80, height / 2, magnitude*scalar, magnitude*scalar)

вытащить весь свой список:

#update the variables to match your own and the scalar to match one that is appropriate to your data. Depending on the scale of your data you may need to divide it
def draw():
    background(0)
    scalar=10
    x = 0
    
    for magnitude in magnitudes:
        ellipse(x, height / 2, magnitude*scalar, magnitude*scalar)
        x += 2.5

Если вы хотите нарисовать больше своих атрибутов, используйте другие циклы for или условные выражения с соответствующим именем переменной для их визуализации.

2учебное пособие. Выполните следующие 3 требования, следуя каждому руководству, приведенному ниже, и внедряя его в свой новый эскиз с новыми данными:

Объектно-ориентированное программирование

До сих пор мы узнали о функциях, циклах и условных выражениях. Наши программы выполняются как набор последовательных процессов.

В объектно-ориентированном программировании программы - это больше, чем список процедур, но они используют наборы взаимодействующих объектов. Объекты подобны шаблонным типологиям со встроенными правилами.

В программе 3D-моделирования, такой как Revit, объект может быть чем-то вроде окна. Объект окна содержит данные и специфичные для окна функции. Такие данные окна (или иногда называемые «состоянием») будут описывать параметры окна:

  • размеры (например, 3’-0 дюймов x 1’-6 дюймов x 0’-6 дюймов)
  • материал каркаса (например, металл)
  • стекло (например, матовое стекло)

Функции, связанные с окном, могут управлять высотой или размерами, а другая - материалом и тем, как окно отображается. У вас могут быть функции, которые вычисляют площадь или стоимость окна или контролируют, является ли оно «открытым» или «закрытым».

Так чем же один объект отличается от другого? Давайте посмотрим на другие примеры объектов. У вас может быть класс в Revit для дерева с функциями для управления количеством листвы или видами.

Дерево:

  • листва (тяжелая)
  • вид (вечнозеленый)

Или как насчет солнца в исследовании солнечного света в Revit? Данные исследования солнечного света могут быть следующими:

  • сезон (зима)
  • время (8:00 утра)
  • интенсивность (10)

Функция солнца может управлять отображением солнца или рассчитывать его яркость внутри смоделированного здания.

Что такое класс?

«Класс» объекта описывает функции и параметры, которые он может принимать. Когда объект создается из класса, он называется «экземпляром» класса.

Подумайте о формочке для печенья. Форма для печенья делает печенье, но это не само печенье. Резак для печенья - это класс, куки - это «экземпляры».

Например, модель Revit может иметь 50 окон. Как наша модель отслеживает все эти разные окна? Некоторые маленькие и короткие; некоторые большие и высокие; некоторые матовые; некоторые нет. Каждое окно может иметь разные значения параметров, но мы можем использовать списки и словари, чтобы рассматривать их как коллекцию.

Используя классы, мы также можем описывать все различные объекты, которые входят в здания, такие как двери, полы, мебель и т. Д.

Таким образом, классы предоставляют средства объединения данных и функциональности вместе. При создании нового класса создается новый тип объекта (резак для файлов cookie), что позволяет создавать новые экземпляры этого типа (файлы cookie). К каждому экземпляру прикреплены независимые параметры для поддержания его состояния. Экземпляры также могут иметь методы (определяемые его классом) для изменения, вычисления значений или рисования геометрии на основе ее состояния.

Классы на Python

Определение класса

Классы в Python записываются словом class, а затем именем CamelCase, начинающимся с заглавной буквы, а затем (object).

class Window(object):

Затем в нашем классе мы можем определить переменные или создать функции, которые управляют нашим классом.

Инициализация класса

Чтобы создать новый экземпляр класса (инициализировать класс), мы используем предварительно созданную функцию __init__(), которая будет использовать любые переменные, переданные в класс во время инициализации. По соглашению, эти функции всегда начинаются с обращения к себе с помощью self.

class Window(object):
    
    def __init__(self):

Они также могут принимать несколько параметров, например:

class Window(object):
    
    def __init__(self, windowWidth, windowHeight, glazing):

Эти параметры (windowWidth, windowHeight, glazing) - это все настраиваемые параметры, которые я создал.

Вы заметите эту переменную self, подумайте о себе как о способе, которым класс ссылается на себя.

Когда мы говорим self.parameter, это дает нам знать, что мы говорим о параметре для этого конкретного экземпляра. В функции инициализации мы можем определять новые переменные, используя параметр self.parameter, чтобы впоследствии мы могли ссылаться на параметр для конкретного экземпляра.

class Window(object):
    
    def __init__(self, windowWidth, windowHeight, glazing):
        self.windowWidth = windowWidth
        self.windowHeight = windowHeight
        self.glazing = glazing

Теперь мы создали формочку для печенья, но как же нам приготовить печенье?

Вот как создать экземпляр окна:

window_1 = Window(12,30,color(255,255,255))

Чтобы убедиться, что оно работает и что мы создали окно, напечатайте один из наших параметров:

print window_1.windowWidth

Давайте создадим наш первый метод:

Методы в классе

Методы - это функции внутри класса, поэтому они могут работать непосредственно с данными экземпляра.

Давайте создадим метод для вычисления площади окна

    def area(self):
        return self.windowWidth * self.windowHeight

Теперь мы добавили этот метод (немного больше возможностей в нашу формочку для печенья), но мы еще не использовали его для наших файлов cookie. Чтобы использовать это, нам нужно его «вызвать». Мы вызываем методы вне класса. Распечатываем область окна.

print window_1.area()

Если вы заблудились, наш отступ должен выглядеть так:

class Window(object):
    
    def __init__(self, windowWidth, windowHeight, glazing):
        self.windowWidth = windowWidth
        self.windowHeight = windowHeight
        self.glazing = glazing
    
    def area(self):
        return self.windowWidth * self.windowHeight
window_1 = Window(12,30,color(255,255,255))
print window_1.windowWidth
print window_1.area()

Мы также могли бы создать методы для записи наших размеров:

    
    def dimensions(self):
        return str(self.width) + ' ' + str(self.windowHeight)

3. Теперь, когда у вас есть базовое представление о классе, напишите свой собственный класс с использованием собственных методов.

Классы рисования

Что мы действительно хотим сделать, так это нарисовать наши объекты. Для этого нам нужно перейти в активный режим, используя функции настройки и рисования.

Чтобы мои файлы были чистыми, я люблю сохранять свои классы как отдельные файлы эскизов. Давайте сделаем это.

Сохраните текущий эскиз. Создайте новый эскиз в папке проекта, используя стрелку рядом с заголовком и щелкнув «Новая вкладка». Я назову свой новый набросок «окном», потому что это название моего класса. Обратите внимание, что названия эскизов нужно начинать с нижнего регистра.

Скопируйте и вставьте свой класс в новый эскиз и удалите его из старого эскиза. Прежде чем это заработает, нам нужно импортировать наш класс обратно в основной скетч.

from window import *

Теперь, когда у нас есть набросок в одном файле, можно использовать его для рисования!

Создайте свою настройку и функции рисования в своем основном эскизе и поместите любую инициализацию класса в настройку:

from window import *
def setup():
    size(500,500)
    
    window_1 = Window(12, 30, color(255,255,255))
    
    print window_1.windowWidth
    print window_1.area()
def draw():
    background(25,25,25)

Но когда мы находимся в активном состоянии, нам нужно соблюдать определенные правила. Чтобы обработка могла ссылаться на наше окно, нам нужно определить его как глобальную переменную, чтобы на нее можно было ссылаться в любом месте скетча; нравится:

from window import *
def setup():
    size(500,500)
    
    global window_1
    window_1 = Window(12, 30, color(255,255,255))
    
    print window_1.windowWidth
    print window_1.area()
def draw():
    background(25,25,25)

Теперь давайте создадим метод внутри нашего класса, который будет рисовать прямоугольник, представляющий наше окно. Мы напишем метод с некоторыми функциями, которые мы уже знаемfill(), а также с rect(). В своем классе создайте новый метод со следующими функциями:

def draw(self):
        fill()
        rect()

Теперь заполните эти параметры, используя точечную нотацию, которую мы выучили. Вам не обязательно точно соответствовать тому, где я использовал переменные. Не стесняйтесь настраивать его по своему усмотрению.

def draw(self):
        fill(self.glazing)
        rect(10, 10, 10 + self.windowWidth, 10 + self.windowHeight)

Теперь, когда мы добавили метод рисования прямоугольника (что делает нашу формочку для печенья еще больше), нам нужно вызвать функцию для создания нашего куки!

Все вызовы методов должны идти в основном скетче. Поскольку этот конкретный метод отрисовки, мы поместим его в функцию рисования, чтобы он постоянно рисовал, если мы хотим сделать его интерактивным.

    window_1.draw()

ВАУ! Все это за жалкий прямоугольник? Не совсем! Мы хотим иметь возможность использовать классы и объекты, чтобы делать более сложные вещи.

Вот пример упаковки некоторых функций в этот класс. В основном скетче:

size(500,500)
    
    global window_1
    window_1 = Window(10,10,12,30, color(255,255,255))
    
    print window_1.windowWidth
    print window_1.area()
    
    global buildingWindows
    buildingWindows = []
    
    for w in xrange(5, 150, 5): #start of range, end of range, step
        window = Window(w*10, 100,w,90,color(255,255,255))
        buildingWindows.append(window)
def draw():
    background(25,25,25)
    # window_1.draw()
    
    for window in buildingWindows:
        window.draw()

В классе окна:

class Window(object):
    
    def __init__(self, x, y, windowWidth, windowHeight, glazing):
        self.x = x
        self.y = y
        self.windowWidth = windowWidth
        self.windowHeight = windowHeight
        self.glazing = glazing
    
    def area(self):
        return self.windowWidth * self.windowHeight
    
    def draw(self):
        # fill(self.glazing)
        # rect(10, 10, 10 + self.windowWidth, 10 + self.windowHeight)
    
        if self.x < mouseX and mouseX < self.x + self.windowWidth:
            fill(0)
            #drawing the face
            fill(0,0,255)
            ellipse(self.x + 20,self.y + 15,20,20)
            stroke(255, 255, 255)
            fill(255, 0, 0)
            ellipse(self.x + 14,self.y + 14,5,5)
            ellipse(self.x + 24,self.y + 14,5,5)
            line(self.x + 10,self.y + 20,self.x + 30,self.y + 20)
            noFill()
    
        else:
            fill(self.glazing)
            fill(0,200,200)
            rect(self.x, self.y+10, 10 + self.windowWidth, 10 + self.windowHeight/3)
        rect(self.x, self.y, 10 + self.windowWidth, 10 + self.windowHeight)

4 Обновите этот класс, превратив его в нечто иное, чем окно, и дайте ему свои собственные функции.

Чтобы узнать больше о том, как работают объекты, прочтите руководство Объекты в обработке или посмотрите это видео. Имейте в виду, что это видео полезно для объяснения того, как работают классы, но его синтаксис устарел.

5. Как можно использовать класс в собственном эскизе с данными проекта?