通过列表理解的频率的DataFrame?

时间:2018-11-09 20:56:12

标签: python pandas numpy list-comprehension

我正在尝试构建一个色频介于A1(55Hz)和A8(7040Hz)之间的熊猫DataFrame。本质上,我希望它看起来像这样……

df = pd.DataFrame(columns=['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#'])
df.loc[0] = (55, 58.27, 61.74, 32.7, 34.65, 36.71, 38.89, 41.2, 43.65, 49, 51.91)

但不必手动将所有频率分配给它们各自的音符,并且每行八度(八度1至8)。

根据站点http://pages.mtu.edu/~suits/notefreqs.html,给定单个注释的每个注释(或“半步”)之间的间隔为...

def hz_stepper(fixed_note, steps):
    a = 2 ** (1/12)
    return fixed_note * a ** steps

使用该功能'hz_stepper',我可以通过将1或-1分配给steps变量来对给定的音符进行n次色度增加或减少。

我的问题是,如何创建一个DataFrame,使所有行看起来都像我手动完成的样子,但是使用列表理解来形成行?

2 个答案:

答案 0 :(得分:1)

只需遍历音高,然后重新调整结果即可:

<div id="app" class="card" style="width:18rem;">
  <div class="card-body">

    <div class="alert alert-danger animated" 
    v-bind:class="{ 'shake': runAnimate }" 
    v-if="incorrect">
    Code is incorrect
    </div>

    <div class="alert alert-success animated" 
    v-bind:class="{ 'flash': runAnimate }" 
    v-if="correct">
    Correct code entered
    </div>

    <input v-model="modelcode" placeholder="password" class="form-control"> 
    <button class="btn btn-primary mt-3" @click="checkpwd">check</button>
    correct code is 1234
  </div>
</div>


new Vue({
  el: "#app",
  data: {
    correct: false,
    incorrect: false,
    code: '1234',
    modelcode: '',
    runAnimate: false
  },
  methods: {
    checkpwd: function(todo){
    this.runAnimate= true;
        if (this.modelcode == this.code) {

        this.correct = true;
        this.incorrect = false;
      } else {
        this.correct = false;
        this.incorrect = true;
       }
       setTimeout(()=> this.runAnimate = false, 1000);
      }
    }
  }
);

说明

import numpy as np import pandas as pd base = 55. n_octave = 8 columns = ['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#'] factors = 2**(np.arange(12 * n_octave) / 12.) pd.DataFrame(data=base * factors.reshape((n_octave, 12)), columns=columns) 是1d numpy数组所需的频率,但它们不是DataFrame所需的表格格式。 factors创建数组内容的视图,其形状为reshape,以使行是连续的。例如

(n_octave, 12)

这只是DataFrame所需的格式。

答案 1 :(得分:0)

从一开始:

df = pd.DataFrame(columns=['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#'])
df.loc[0] = 55*2**(np.arange(12)/12)
for i in range(8): df.loc[i+1]=2*df.loc[i]